Skip to content

Commit 387b37a

Browse files
authored
[LLVM] [Clang] Support for Gentoo *t64 triples (64-bit time_t ABIs) (#111302)
Gentoo is planning to introduce a `*t64` suffix for triples that will be used by 32-bit platforms that use 64-bit `time_t`. Add support for parsing and accepting these triples, and while at it make clang automatically enable the necessary glibc feature macros when this suffix is used. An open question is whether we can backport this to LLVM 19.x. After all, adding new triplets to Triple sounds like an ABI change — though I suppose we can minimize the risk of breaking something if we move new enum values to the very end.
1 parent f778861 commit 387b37a

File tree

16 files changed

+136
-11
lines changed

16 files changed

+136
-11
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/Basic/Targets/OSTargets.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,10 @@ class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
337337
Builder.defineMacro("_GNU_SOURCE");
338338
if (this->HasFloat128)
339339
Builder.defineMacro("__FLOAT128__");
340+
if (Triple.isTime64ABI()) {
341+
Builder.defineMacro("_FILE_OFFSET_BITS", "64");
342+
Builder.defineMacro("_TIME_BITS", "64");
343+
}
340344
}
341345

342346
public:

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,7 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
175175
else if (ABIStr == "aapcs16")
176176
Kind = ARMABIKind::AAPCS16_VFP;
177177
else if (CodeGenOpts.FloatABI == "hard" ||
178-
(CodeGenOpts.FloatABI != "soft" &&
179-
(Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
180-
Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
181-
Triple.getEnvironment() == llvm::Triple::EABIHF)))
178+
(CodeGenOpts.FloatABI != "soft" && Triple.isHardFloatABI()))
182179
Kind = ARMABIKind::AAPCS_VFP;
183180

184181
return createARMTargetCodeGenInfo(CGM, Kind);

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";

clang/test/Preprocessor/time64.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %clang_cc1 -E -dM -triple=i686-pc-linux-gnu /dev/null | FileCheck -match-full-lines -check-prefix TIME32 %s
2+
// RUN: %clang_cc1 -E -dM -triple=i686-pc-linux-gnut64 /dev/null | FileCheck -match-full-lines -check-prefix TIME64 %s
3+
// RUN: %clang_cc1 -E -dM -triple=armv5tel-softfloat-linux-gnueabi /dev/null | FileCheck -match-full-lines -check-prefix TIME32 %s
4+
// RUN: %clang_cc1 -E -dM -triple=armv5tel-softfloat-linux-gnueabit64 /dev/null | FileCheck -match-full-lines -check-prefix TIME64 %s
5+
// RUN: %clang_cc1 -E -dM -triple=armv7a-unknown-linux-gnueabihf /dev/null | FileCheck -match-full-lines -check-prefix TIME32 %s
6+
// RUN: %clang_cc1 -E -dM -triple=armv7a-unknown-linux-gnueabihft64 /dev/null | FileCheck -match-full-lines -check-prefix TIME64 %s
7+
//
8+
// TIME32-NOT:#define _FILE_OFFSET_BITS 64
9+
// TIME32-NOT:#define _TIME_BITS 64
10+
//
11+
// TIME64:#define _FILE_OFFSET_BITS 64
12+
// TIME64:#define _TIME_BITS 64

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 27 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,22 @@ 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+
1075+
/// Tests if the target forces hardfloat.
1076+
bool isHardFloatABI() const {
1077+
EnvironmentType Env = getEnvironment();
1078+
return Env == llvm::Triple::GNUEABIHF ||
1079+
Env == llvm::Triple::GNUEABIHFT64 ||
1080+
Env == llvm::Triple::MuslEABIHF ||
1081+
Env == llvm::Triple::EABIHF;
1082+
}
1083+
10621084
/// Tests whether the target supports comdat
10631085
bool supportsCOMDAT() const {
10641086
return !(isOSBinFormatMachO() || isOSBinFormatXCOFF() ||

llvm/lib/Target/ARM/ARMSubtarget.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,9 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
344344
}
345345
bool isTargetGNUAEABI() const {
346346
return (TargetTriple.getEnvironment() == Triple::GNUEABI ||
347-
TargetTriple.getEnvironment() == Triple::GNUEABIHF) &&
347+
TargetTriple.getEnvironment() == Triple::GNUEABIT64 ||
348+
TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
349+
TargetTriple.getEnvironment() == Triple::GNUEABIHFT64) &&
348350
!isTargetDarwin() && !isTargetWindows();
349351
}
350352
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: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ TEST(TripleTest, ParsedIDs) {
9393
EXPECT_EQ(Triple::Hurd, T.getOS());
9494
EXPECT_EQ(Triple::GNU, T.getEnvironment());
9595

96+
T = Triple("i686-pc-linux-gnu");
97+
EXPECT_EQ(Triple::x86, T.getArch());
98+
EXPECT_EQ(Triple::PC, T.getVendor());
99+
EXPECT_EQ(Triple::Linux, T.getOS());
100+
EXPECT_EQ(Triple::GNU, T.getEnvironment());
101+
EXPECT_FALSE(T.isTime64ABI());
102+
96103
T = Triple("x86_64-pc-linux-gnu");
97104
EXPECT_EQ(Triple::x86_64, T.getArch());
98105
EXPECT_EQ(Triple::PC, T.getVendor());
@@ -187,24 +194,52 @@ TEST(TripleTest, ParsedIDs) {
187194
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
188195
EXPECT_EQ(Triple::UnknownOS, T.getOS());
189196
EXPECT_EQ(Triple::EABI, T.getEnvironment());
197+
EXPECT_FALSE(T.isHardFloatABI());
198+
199+
T = Triple("arm-none-none-eabihf");
200+
EXPECT_EQ(Triple::arm, T.getArch());
201+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
202+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
203+
EXPECT_EQ(Triple::EABIHF, T.getEnvironment());
204+
EXPECT_TRUE(T.isHardFloatABI());
190205

191206
T = Triple("arm-none-linux-musleabi");
192207
EXPECT_EQ(Triple::arm, T.getArch());
193208
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
194209
EXPECT_EQ(Triple::Linux, T.getOS());
195210
EXPECT_EQ(Triple::MuslEABI, T.getEnvironment());
211+
EXPECT_FALSE(T.isHardFloatABI());
212+
213+
T = Triple("arm-none-linux-musleabihf");
214+
EXPECT_EQ(Triple::arm, T.getArch());
215+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
216+
EXPECT_EQ(Triple::Linux, T.getOS());
217+
EXPECT_EQ(Triple::MuslEABIHF, T.getEnvironment());
218+
EXPECT_TRUE(T.isHardFloatABI());
196219

197220
T = Triple("armv6hl-none-linux-gnueabi");
198221
EXPECT_EQ(Triple::arm, T.getArch());
199222
EXPECT_EQ(Triple::Linux, T.getOS());
200223
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
201224
EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
225+
EXPECT_FALSE(T.isTime64ABI());
226+
EXPECT_FALSE(T.isHardFloatABI());
202227

203228
T = Triple("armv7hl-none-linux-gnueabi");
204229
EXPECT_EQ(Triple::arm, T.getArch());
205230
EXPECT_EQ(Triple::Linux, T.getOS());
206231
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
207232
EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
233+
EXPECT_FALSE(T.isTime64ABI());
234+
EXPECT_FALSE(T.isHardFloatABI());
235+
236+
T = Triple("armv7hl-none-linux-gnueabihf");
237+
EXPECT_EQ(Triple::arm, T.getArch());
238+
EXPECT_EQ(Triple::Linux, T.getOS());
239+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
240+
EXPECT_EQ(Triple::GNUEABIHF, T.getEnvironment());
241+
EXPECT_FALSE(T.isTime64ABI());
242+
EXPECT_TRUE(T.isHardFloatABI());
208243

209244
T = Triple("amdil-unknown-unknown");
210245
EXPECT_EQ(Triple::amdil, T.getArch());
@@ -1283,6 +1318,29 @@ TEST(TripleTest, ParsedIDs) {
12831318
EXPECT_EQ(Triple::Linux, T.getOS());
12841319
EXPECT_EQ(Triple::PAuthTest, T.getEnvironment());
12851320

1321+
// Gentoo time64 triples
1322+
T = Triple("i686-pc-linux-gnut64");
1323+
EXPECT_EQ(Triple::x86, T.getArch());
1324+
EXPECT_EQ(Triple::PC, T.getVendor());
1325+
EXPECT_EQ(Triple::Linux, T.getOS());
1326+
EXPECT_EQ(Triple::GNUT64, T.getEnvironment());
1327+
EXPECT_TRUE(T.isTime64ABI());
1328+
1329+
T = Triple("armv5tel-softfloat-linux-gnueabit64");
1330+
EXPECT_EQ(Triple::arm, T.getArch());
1331+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1332+
EXPECT_EQ(Triple::Linux, T.getOS());
1333+
EXPECT_EQ(Triple::GNUEABIT64, T.getEnvironment());
1334+
EXPECT_TRUE(T.isTime64ABI());
1335+
1336+
T = Triple("armv7a-unknown-linux-gnueabihft64");
1337+
EXPECT_EQ(Triple::arm, T.getArch());
1338+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1339+
EXPECT_EQ(Triple::Linux, T.getOS());
1340+
EXPECT_EQ(Triple::GNUEABIHFT64, T.getEnvironment());
1341+
EXPECT_TRUE(T.isTime64ABI());
1342+
EXPECT_TRUE(T.isHardFloatABI());
1343+
12861344
T = Triple("huh");
12871345
EXPECT_EQ(Triple::UnknownArch, T.getArch());
12881346
}

0 commit comments

Comments
 (0)