Skip to content

Commit df75eaa

Browse files
committed
[llvm] [Triple] Support *t64 environments for Gentoo
Add a support for the new `*t64` triples that Gentoo is planning to use for its 32-bit platforms migrated to use 64-bit time_t. Given the supported 32-bit targets, the expected environments are `-gnut64`, `-gnueabit64` and `-gnueabihft64`.
1 parent b837c9e commit df75eaa

File tree

14 files changed

+75
-7
lines changed

14 files changed

+75
-7
lines changed

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,9 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,
313313
switch (Triple.getEnvironment()) {
314314
case llvm::Triple::Android:
315315
case llvm::Triple::GNUEABI:
316+
case llvm::Triple::GNUEABIT64:
316317
case llvm::Triple::GNUEABIHF:
318+
case llvm::Triple::GNUEABIHFT64:
317319
case llvm::Triple::MuslEABI:
318320
case llvm::Triple::MuslEABIHF:
319321
case llvm::Triple::OpenHOS:

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
177177
else if (CodeGenOpts.FloatABI == "hard" ||
178178
(CodeGenOpts.FloatABI != "soft" &&
179179
(Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
180+
Triple.getEnvironment() == llvm::Triple::GNUEABIHFT64 ||
180181
Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
181182
Triple.getEnvironment() == llvm::Triple::EABIHF)))
182183
Kind = ARMABIKind::AAPCS_VFP;

clang/lib/CodeGen/Targets/ARM.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ class ARMABIInfo : public ABIInfo {
3535
case llvm::Triple::EABI:
3636
case llvm::Triple::EABIHF:
3737
case llvm::Triple::GNUEABI:
38+
case llvm::Triple::GNUEABIT64:
3839
case llvm::Triple::GNUEABIHF:
40+
case llvm::Triple::GNUEABIHFT64:
3941
case llvm::Triple::MuslEABI:
4042
case llvm::Triple::MuslEABIHF:
4143
return true;
@@ -48,6 +50,7 @@ class ARMABIInfo : public ABIInfo {
4850
switch (getTarget().getTriple().getEnvironment()) {
4951
case llvm::Triple::EABIHF:
5052
case llvm::Triple::GNUEABIHF:
53+
case llvm::Triple::GNUEABIHFT64:
5154
case llvm::Triple::MuslEABIHF:
5255
return true;
5356
default:

clang/lib/Driver/Driver.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,8 @@ static llvm::Triple computeTargetTriple(const Driver &D,
610610
if (A->getOption().matches(options::OPT_m64) ||
611611
A->getOption().matches(options::OPT_maix64)) {
612612
AT = Target.get64BitArchVariant().getArch();
613-
if (Target.getEnvironment() == llvm::Triple::GNUX32)
613+
if (Target.getEnvironment() == llvm::Triple::GNUX32 ||
614+
Target.getEnvironment() == llvm::Triple::GNUT64)
614615
Target.setEnvironment(llvm::Triple::GNU);
615616
else if (Target.getEnvironment() == llvm::Triple::MuslX32)
616617
Target.setEnvironment(llvm::Triple::Musl);
@@ -673,6 +674,7 @@ static llvm::Triple computeTargetTriple(const Driver &D,
673674
} else if (ABIName == "n32") {
674675
Target = Target.get64BitArchVariant();
675676
if (Target.getEnvironment() == llvm::Triple::GNU ||
677+
Target.getEnvironment() == llvm::Triple::GNUT64 ||
676678
Target.getEnvironment() == llvm::Triple::GNUABI64)
677679
Target.setEnvironment(llvm::Triple::GNUABIN32);
678680
else if (Target.getEnvironment() == llvm::Triple::Musl ||
@@ -681,6 +683,7 @@ static llvm::Triple computeTargetTriple(const Driver &D,
681683
} else if (ABIName == "64") {
682684
Target = Target.get64BitArchVariant();
683685
if (Target.getEnvironment() == llvm::Triple::GNU ||
686+
Target.getEnvironment() == llvm::Triple::GNUT64 ||
684687
Target.getEnvironment() == llvm::Triple::GNUABIN32)
685688
Target.setEnvironment(llvm::Triple::GNUABI64);
686689
else if (Target.getEnvironment() == llvm::Triple::Musl ||

clang/lib/Driver/ToolChains/Arch/ARM.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,11 @@ void arm::setFloatABIInTriple(const Driver &D, const ArgList &Args,
327327
Triple.setEnvironment(isHardFloat ? llvm::Triple::GNUEABIHF
328328
: llvm::Triple::GNUEABI);
329329
break;
330+
case llvm::Triple::GNUEABIT64:
331+
case llvm::Triple::GNUEABIHFT64:
332+
Triple.setEnvironment(isHardFloat ? llvm::Triple::GNUEABIHFT64
333+
: llvm::Triple::GNUEABIT64);
334+
break;
330335
case llvm::Triple::EABI:
331336
case llvm::Triple::EABIHF:
332337
Triple.setEnvironment(isHardFloat ? llvm::Triple::EABIHF
@@ -414,10 +419,12 @@ arm::FloatABI arm::getDefaultFloatABI(const llvm::Triple &Triple) {
414419
return FloatABI::Soft;
415420
switch (Triple.getEnvironment()) {
416421
case llvm::Triple::GNUEABIHF:
422+
case llvm::Triple::GNUEABIHFT64:
417423
case llvm::Triple::MuslEABIHF:
418424
case llvm::Triple::EABIHF:
419425
return FloatABI::Hard;
420426
case llvm::Triple::GNUEABI:
427+
case llvm::Triple::GNUEABIT64:
421428
case llvm::Triple::MuslEABI:
422429
case llvm::Triple::EABI:
423430
// EABI is always AAPCS, and if it was not marked 'hard', it's softfp

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2698,6 +2698,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
26982698
case llvm::Triple::thumb:
26992699
LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
27002700
if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF ||
2701+
TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHFT64 ||
27012702
TargetTriple.getEnvironment() == llvm::Triple::MuslEABIHF ||
27022703
TargetTriple.getEnvironment() == llvm::Triple::EABIHF) {
27032704
TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
@@ -2709,6 +2710,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
27092710
case llvm::Triple::thumbeb:
27102711
LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
27112712
if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF ||
2713+
TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHFT64 ||
27122714
TargetTriple.getEnvironment() == llvm::Triple::MuslEABIHF ||
27132715
TargetTriple.getEnvironment() == llvm::Triple::EABIHF) {
27142716
TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
511511
case llvm::Triple::thumbeb: {
512512
const bool HF =
513513
Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
514+
Triple.getEnvironment() == llvm::Triple::GNUEABIHFT64 ||
514515
tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
515516

516517
LibDir = "lib";

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,13 @@ class Triple {
244244
UnknownEnvironment,
245245

246246
GNU,
247+
GNUT64,
247248
GNUABIN32,
248249
GNUABI64,
249250
GNUEABI,
251+
GNUEABIT64,
250252
GNUEABIHF,
253+
GNUEABIHFT64,
251254
GNUF32,
252255
GNUF64,
253256
GNUSF,
@@ -608,11 +611,12 @@ class Triple {
608611

609612
bool isGNUEnvironment() const {
610613
EnvironmentType Env = getEnvironment();
611-
return Env == Triple::GNU || Env == Triple::GNUABIN32 ||
612-
Env == Triple::GNUABI64 || Env == Triple::GNUEABI ||
613-
Env == Triple::GNUEABIHF || Env == Triple::GNUF32 ||
614-
Env == Triple::GNUF64 || Env == Triple::GNUSF ||
615-
Env == Triple::GNUX32;
614+
return Env == Triple::GNU || Env == Triple::GNUT64 ||
615+
Env == Triple::GNUABIN32 || Env == Triple::GNUABI64 ||
616+
Env == Triple::GNUEABI || Env == Triple::GNUEABIT64 ||
617+
Env == Triple::GNUEABIHF || Env == Triple::GNUEABIHFT64 ||
618+
Env == Triple::GNUF32 || Env == Triple::GNUF64 ||
619+
Env == Triple::GNUSF || Env == Triple::GNUX32;
616620
}
617621

618622
/// Tests whether the OS is Haiku.
@@ -873,9 +877,11 @@ class Triple {
873877
return (isARM() || isThumb()) &&
874878
(getEnvironment() == Triple::EABI ||
875879
getEnvironment() == Triple::GNUEABI ||
880+
getEnvironment() == Triple::GNUEABIT64 ||
876881
getEnvironment() == Triple::MuslEABI ||
877882
getEnvironment() == Triple::EABIHF ||
878883
getEnvironment() == Triple::GNUEABIHF ||
884+
getEnvironment() == Triple::GNUEABIHFT64 ||
879885
getEnvironment() == Triple::OpenHOS ||
880886
getEnvironment() == Triple::MuslEABIHF || isAndroid()) &&
881887
isOSBinFormatELF();
@@ -1059,6 +1065,13 @@ class Triple {
10591065
return getArch() == Triple::bpfel || getArch() == Triple::bpfeb;
10601066
}
10611067

1068+
/// Tests if the target forces 64-bit time_t on a 32-bit architecture.
1069+
bool isTime64ABI() const {
1070+
EnvironmentType Env = getEnvironment();
1071+
return Env == Triple::GNUT64 || Env == Triple::GNUEABIT64 ||
1072+
Env == Triple::GNUEABIHFT64;
1073+
}
1074+
10621075
/// Tests whether the target supports comdat
10631076
bool supportsCOMDAT() const {
10641077
return !(isOSBinFormatMachO() || isOSBinFormatXCOFF() ||

llvm/lib/Target/ARM/ARMSubtarget.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,9 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
318318
}
319319
bool isTargetGNUAEABI() const {
320320
return (TargetTriple.getEnvironment() == Triple::GNUEABI ||
321-
TargetTriple.getEnvironment() == Triple::GNUEABIHF) &&
321+
TargetTriple.getEnvironment() == Triple::GNUEABIT64 ||
322+
TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
323+
TargetTriple.getEnvironment() == Triple::GNUEABIHFT64) &&
322324
!isTargetDarwin() && !isTargetWindows();
323325
}
324326
bool isTargetMuslAEABI() const {

llvm/lib/Target/ARM/ARMTargetMachine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,9 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, const Triple &TT,
241241
Options.EABIVersion == EABI::Unknown) {
242242
// musl is compatible with glibc with regard to EABI version
243243
if ((TargetTriple.getEnvironment() == Triple::GNUEABI ||
244+
TargetTriple.getEnvironment() == Triple::GNUEABIT64 ||
244245
TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
246+
TargetTriple.getEnvironment() == Triple::GNUEABIHFT64 ||
245247
TargetTriple.getEnvironment() == Triple::MuslEABI ||
246248
TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
247249
TargetTriple.getEnvironment() == Triple::OpenHOS) &&

llvm/lib/Target/ARM/ARMTargetMachine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class ARMBaseTargetMachine : public LLVMTargetMachine {
6464

6565
bool isTargetHardFloat() const {
6666
return TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
67+
TargetTriple.getEnvironment() == Triple::GNUEABIHFT64 ||
6768
TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
6869
TargetTriple.getEnvironment() == Triple::EABIHF ||
6970
(TargetTriple.isOSBinFormatMachO() &&

llvm/lib/TargetParser/ARMTargetParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,9 @@ StringRef ARM::computeDefaultTargetABI(const Triple &TT, StringRef CPU) {
556556
switch (TT.getEnvironment()) {
557557
case Triple::Android:
558558
case Triple::GNUEABI:
559+
case Triple::GNUEABIT64:
559560
case Triple::GNUEABIHF:
561+
case Triple::GNUEABIHFT64:
560562
case Triple::MuslEABI:
561563
case Triple::MuslEABIHF:
562564
case Triple::OpenHOS:
@@ -637,6 +639,7 @@ StringRef ARM::getARMCPUForArch(const llvm::Triple &Triple, StringRef MArch) {
637639
switch (Triple.getEnvironment()) {
638640
case llvm::Triple::EABIHF:
639641
case llvm::Triple::GNUEABIHF:
642+
case llvm::Triple::GNUEABIHFT64:
640643
case llvm::Triple::MuslEABIHF:
641644
return "arm1176jzf-s";
642645
default:

llvm/lib/TargetParser/Triple.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,10 +312,13 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
312312
case EABI: return "eabi";
313313
case EABIHF: return "eabihf";
314314
case GNU: return "gnu";
315+
case GNUT64: return "gnut64";
315316
case GNUABI64: return "gnuabi64";
316317
case GNUABIN32: return "gnuabin32";
317318
case GNUEABI: return "gnueabi";
319+
case GNUEABIT64: return "gnueabit64";
318320
case GNUEABIHF: return "gnueabihf";
321+
case GNUEABIHFT64: return "gnueabihft64";
319322
case GNUF32: return "gnuf32";
320323
case GNUF64: return "gnuf64";
321324
case GNUSF: return "gnusf";
@@ -692,14 +695,17 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
692695
.StartsWith("eabi", Triple::EABI)
693696
.StartsWith("gnuabin32", Triple::GNUABIN32)
694697
.StartsWith("gnuabi64", Triple::GNUABI64)
698+
.StartsWith("gnueabihft64", Triple::GNUEABIHFT64)
695699
.StartsWith("gnueabihf", Triple::GNUEABIHF)
700+
.StartsWith("gnueabit64", Triple::GNUEABIT64)
696701
.StartsWith("gnueabi", Triple::GNUEABI)
697702
.StartsWith("gnuf32", Triple::GNUF32)
698703
.StartsWith("gnuf64", Triple::GNUF64)
699704
.StartsWith("gnusf", Triple::GNUSF)
700705
.StartsWith("gnux32", Triple::GNUX32)
701706
.StartsWith("gnu_ilp32", Triple::GNUILP32)
702707
.StartsWith("code16", Triple::CODE16)
708+
.StartsWith("gnut64", Triple::GNUT64)
703709
.StartsWith("gnu", Triple::GNU)
704710
.StartsWith("android", Triple::Android)
705711
.StartsWith("muslabin32", Triple::MuslABIN32)

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,28 @@ TEST(TripleTest, ParsedIDs) {
12831283
EXPECT_EQ(Triple::Linux, T.getOS());
12841284
EXPECT_EQ(Triple::PAuthTest, T.getEnvironment());
12851285

1286+
// Gentoo time64 triples
1287+
T = Triple("i686-pc-linux-gnut64");
1288+
EXPECT_EQ(Triple::x86, T.getArch());
1289+
EXPECT_EQ(Triple::PC, T.getVendor());
1290+
EXPECT_EQ(Triple::Linux, T.getOS());
1291+
EXPECT_EQ(Triple::GNUT64, T.getEnvironment());
1292+
EXPECT_TRUE(T.isTime64ABI());
1293+
1294+
T = Triple("armv5tel-softfloat-linux-gnueabit64");
1295+
EXPECT_EQ(Triple::arm, T.getArch());
1296+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1297+
EXPECT_EQ(Triple::Linux, T.getOS());
1298+
EXPECT_EQ(Triple::GNUEABIT64, T.getEnvironment());
1299+
EXPECT_TRUE(T.isTime64ABI());
1300+
1301+
T = Triple("armv7a-unknown-linux-gnueabihft64");
1302+
EXPECT_EQ(Triple::arm, T.getArch());
1303+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1304+
EXPECT_EQ(Triple::Linux, T.getOS());
1305+
EXPECT_EQ(Triple::GNUEABIHFT64, T.getEnvironment());
1306+
EXPECT_TRUE(T.isTime64ABI());
1307+
12861308
T = Triple("huh");
12871309
EXPECT_EQ(Triple::UnknownArch, T.getArch());
12881310
}

0 commit comments

Comments
 (0)