Skip to content

Commit 51cf8d0

Browse files
committed
[llvm][Triple] Add Environment members and parsing for glibc/musl parity.
This adds support for: * `muslabin32` (MIPS N32) * `muslabi64` (MIPS N64) * `muslf32` (LoongArch ILP32F/LP64F) * `muslsf` (LoongArch ILP32S/LP64S)
1 parent f93114d commit 51cf8d0

File tree

12 files changed

+153
-9
lines changed

12 files changed

+153
-9
lines changed

clang/lib/Basic/Targets/Mips.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo {
7070

7171
if (Triple.isMIPS32())
7272
setABI("o32");
73-
else if (Triple.getEnvironment() == llvm::Triple::GNUABIN32)
73+
else if (Triple.isABIN32())
7474
setABI("n32");
7575
else
7676
setABI("n64");

clang/lib/Driver/Driver.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,11 +667,17 @@ static llvm::Triple computeTargetTriple(const Driver &D,
667667
if (Target.getEnvironment() == llvm::Triple::GNU ||
668668
Target.getEnvironment() == llvm::Triple::GNUABI64)
669669
Target.setEnvironment(llvm::Triple::GNUABIN32);
670+
else if (Target.getEnvironment() == llvm::Triple::Musl ||
671+
Target.getEnvironment() == llvm::Triple::MuslABI64)
672+
Target.setEnvironment(llvm::Triple::MuslABIN32);
670673
} else if (ABIName == "64") {
671674
Target = Target.get64BitArchVariant();
672675
if (Target.getEnvironment() == llvm::Triple::GNU ||
673676
Target.getEnvironment() == llvm::Triple::GNUABIN32)
674677
Target.setEnvironment(llvm::Triple::GNUABI64);
678+
else if (Target.getEnvironment() == llvm::Triple::Musl ||
679+
Target.getEnvironment() == llvm::Triple::MuslABIN32)
680+
Target.setEnvironment(llvm::Triple::MuslABI64);
675681
}
676682
}
677683
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,10 @@ StringRef loongarch::getLoongArchABI(const Driver &D, const ArgList &Args,
103103
// present, falling back to {ILP32,LP64}D otherwise.
104104
switch (Triple.getEnvironment()) {
105105
case llvm::Triple::GNUSF:
106+
case llvm::Triple::MuslSF:
106107
return IsLA32 ? "ilp32s" : "lp64s";
107108
case llvm::Triple::GNUF32:
109+
case llvm::Triple::MuslF32:
108110
return IsLA32 ? "ilp32f" : "lp64f";
109111
case llvm::Triple::GNUF64:
110112
// This was originally permitted (and indeed the canonical way) to

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
8080
}
8181
}
8282

83-
if (ABIName.empty() && (Triple.getEnvironment() == llvm::Triple::GNUABIN32))
83+
if (ABIName.empty() && Triple.isABIN32())
8484
ABIName = "n32";
8585

8686
if (ABIName.empty() &&

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,13 +269,11 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
269269
case llvm::Triple::mipsel:
270270
return "elf32ltsmip";
271271
case llvm::Triple::mips64:
272-
if (tools::mips::hasMipsAbiArg(Args, "n32") ||
273-
T.getEnvironment() == llvm::Triple::GNUABIN32)
272+
if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
274273
return "elf32btsmipn32";
275274
return "elf64btsmip";
276275
case llvm::Triple::mips64el:
277-
if (tools::mips::hasMipsAbiArg(Args, "n32") ||
278-
T.getEnvironment() == llvm::Triple::GNUABIN32)
276+
if (tools::mips::hasMipsAbiArg(Args, "n32") || T.isABIN32())
279277
return "elf32ltsmipn32";
280278
return "elf64ltsmip";
281279
case llvm::Triple::systemz:

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,16 @@ std::string Linux::getMultiarchTriple(const Driver &D,
109109
default:
110110
return TargetTriple.str();
111111
case llvm::Triple::GNUSF:
112+
case llvm::Triple::MuslSF:
112113
FPFlavor = "sf";
113114
break;
114115
case llvm::Triple::GNUF32:
116+
case llvm::Triple::MuslF32:
115117
FPFlavor = "f32";
116118
break;
117119
case llvm::Triple::GNU:
118120
case llvm::Triple::GNUF64:
121+
case llvm::Triple::Musl:
119122
// This was going to be "f64" in an earlier Toolchain Conventions
120123
// revision, but starting from Feb 2023 the F64 ABI variants are
121124
// unmarked in their canonical forms.

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,12 @@ class Triple {
257257
EABIHF,
258258
Android,
259259
Musl,
260+
MuslABIN32,
261+
MuslABI64,
260262
MuslEABI,
261263
MuslEABIHF,
264+
MuslF32,
265+
MuslSF,
262266
MuslX32,
263267

264268
MSVC,
@@ -783,8 +787,12 @@ class Triple {
783787
/// Tests whether the environment is musl-libc
784788
bool isMusl() const {
785789
return getEnvironment() == Triple::Musl ||
790+
getEnvironment() == Triple::MuslABIN32 ||
791+
getEnvironment() == Triple::MuslABI64 ||
786792
getEnvironment() == Triple::MuslEABI ||
787793
getEnvironment() == Triple::MuslEABIHF ||
794+
getEnvironment() == Triple::MuslF32 ||
795+
getEnvironment() == Triple::MuslSF ||
788796
getEnvironment() == Triple::MuslX32 ||
789797
getEnvironment() == Triple::OpenHOS || isOSLiteOS();
790798
}
@@ -1033,6 +1041,12 @@ class Triple {
10331041
getSubArch() == Triple::AArch64SubArch_arm64e;
10341042
}
10351043

1044+
// Tests whether the target is N32.
1045+
bool isABIN32() const {
1046+
EnvironmentType Env = getEnvironment();
1047+
return Env == Triple::GNUABIN32 || Env == Triple::MuslABIN32;
1048+
}
1049+
10361050
/// Tests whether the target is X32.
10371051
bool isX32() const {
10381052
EnvironmentType Env = getEnvironment();

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ static ABI getTripleABI(const Triple &TT) {
5555
ABI TripleABI;
5656
switch (TT.getEnvironment()) {
5757
case llvm::Triple::EnvironmentType::GNUSF:
58+
case llvm::Triple::EnvironmentType::MuslSF:
5859
TripleABI = Is64Bit ? ABI_LP64S : ABI_ILP32S;
5960
break;
6061
case llvm::Triple::EnvironmentType::GNUF32:
62+
case llvm::Triple::EnvironmentType::MuslF32:
6163
TripleABI = Is64Bit ? ABI_LP64F : ABI_ILP32F;
6264
break;
6365
// Let the fallback case behave like {ILP32,LP64}D.

llvm/lib/Target/Mips/MCTargetDesc/MipsABIInfo.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ MipsABIInfo MipsABIInfo::computeTargetABI(const Triple &TT, StringRef CPU,
6262
return MipsABIInfo::N32();
6363
if (Options.getABIName().starts_with("n64"))
6464
return MipsABIInfo::N64();
65-
if (TT.getEnvironment() == llvm::Triple::GNUABIN32)
65+
if (TT.isABIN32())
6666
return MipsABIInfo::N32();
6767
assert(Options.getABIName().empty() && "Unknown ABI option for MIPS");
6868

@@ -125,4 +125,3 @@ unsigned MipsABIInfo::GetEhDataReg(unsigned I) const {
125125

126126
return IsN64() ? EhDataReg64[I] : EhDataReg[I];
127127
}
128-

llvm/lib/TargetParser/Triple.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,16 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
325325
case MSVC: return "msvc";
326326
case MacABI: return "macabi";
327327
case Musl: return "musl";
328+
case MuslABIN32:
329+
return "muslabin32";
330+
case MuslABI64:
331+
return "muslabi64";
328332
case MuslEABI: return "musleabi";
329333
case MuslEABIHF: return "musleabihf";
334+
case MuslF32:
335+
return "muslf32";
336+
case MuslSF:
337+
return "muslsf";
330338
case MuslX32: return "muslx32";
331339
case Simulator: return "simulator";
332340
case Pixel: return "pixel";
@@ -694,8 +702,12 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
694702
.StartsWith("code16", Triple::CODE16)
695703
.StartsWith("gnu", Triple::GNU)
696704
.StartsWith("android", Triple::Android)
705+
.StartsWith("muslabin32", Triple::MuslABIN32)
706+
.StartsWith("muslabi64", Triple::MuslABI64)
697707
.StartsWith("musleabihf", Triple::MuslEABIHF)
698708
.StartsWith("musleabi", Triple::MuslEABI)
709+
.StartsWith("muslf32", Triple::MuslF32)
710+
.StartsWith("muslsf", Triple::MuslSF)
699711
.StartsWith("muslx32", Triple::MuslX32)
700712
.StartsWith("musl", Triple::Musl)
701713
.StartsWith("msvc", Triple::MSVC)

llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ static ShadowMapping getShadowMapping(const Triple &TargetTriple, int LongSize,
489489
TargetTriple.getArch() == Triple::ppc64le;
490490
bool IsSystemZ = TargetTriple.getArch() == Triple::systemz;
491491
bool IsX86_64 = TargetTriple.getArch() == Triple::x86_64;
492-
bool IsMIPSN32ABI = TargetTriple.getEnvironment() == Triple::GNUABIN32;
492+
bool IsMIPSN32ABI = TargetTriple.isABIN32();
493493
bool IsMIPS32 = TargetTriple.isMIPS32();
494494
bool IsMIPS64 = TargetTriple.isMIPS64();
495495
bool IsArmOrThumb = TargetTriple.isARM() || TargetTriple.isThumb();

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,18 @@ TEST(TripleTest, ParsedIDs) {
655655
EXPECT_EQ(Triple::Linux, T.getOS());
656656
EXPECT_EQ(Triple::Musl, T.getEnvironment());
657657

658+
T = Triple("loongarch32-unknown-linux-muslf32");
659+
EXPECT_EQ(Triple::loongarch32, T.getArch());
660+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
661+
EXPECT_EQ(Triple::Linux, T.getOS());
662+
EXPECT_EQ(Triple::MuslF32, T.getEnvironment());
663+
664+
T = Triple("loongarch32-unknown-linux-muslsf");
665+
EXPECT_EQ(Triple::loongarch32, T.getArch());
666+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
667+
EXPECT_EQ(Triple::Linux, T.getOS());
668+
EXPECT_EQ(Triple::MuslSF, T.getEnvironment());
669+
658670
T = Triple("loongarch64-unknown-linux");
659671
EXPECT_EQ(Triple::loongarch64, T.getArch());
660672
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
@@ -691,6 +703,18 @@ TEST(TripleTest, ParsedIDs) {
691703
EXPECT_EQ(Triple::Linux, T.getOS());
692704
EXPECT_EQ(Triple::Musl, T.getEnvironment());
693705

706+
T = Triple("loongarch64-unknown-linux-muslf32");
707+
EXPECT_EQ(Triple::loongarch64, T.getArch());
708+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
709+
EXPECT_EQ(Triple::Linux, T.getOS());
710+
EXPECT_EQ(Triple::MuslF32, T.getEnvironment());
711+
712+
T = Triple("loongarch64-unknown-linux-muslsf");
713+
EXPECT_EQ(Triple::loongarch64, T.getArch());
714+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
715+
EXPECT_EQ(Triple::Linux, T.getOS());
716+
EXPECT_EQ(Triple::MuslSF, T.getEnvironment());
717+
694718
T = Triple("riscv32-unknown-unknown");
695719
EXPECT_EQ(Triple::riscv32, T.getArch());
696720
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
@@ -926,6 +950,90 @@ TEST(TripleTest, ParsedIDs) {
926950
EXPECT_EQ(Triple::GNU, T.getEnvironment());
927951
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
928952

953+
T = Triple("mips64el-unknown-linux-muslabi64");
954+
EXPECT_EQ(Triple::mips64el, T.getArch());
955+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
956+
EXPECT_EQ(Triple::Linux, T.getOS());
957+
EXPECT_EQ(Triple::MuslABI64, T.getEnvironment());
958+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
959+
960+
T = Triple("mips64-unknown-linux-muslabi64");
961+
EXPECT_EQ(Triple::mips64, T.getArch());
962+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
963+
EXPECT_EQ(Triple::Linux, T.getOS());
964+
EXPECT_EQ(Triple::MuslABI64, T.getEnvironment());
965+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
966+
967+
T = Triple("mipsisa64r6el-unknown-linux-muslabi64");
968+
EXPECT_EQ(Triple::mips64el, T.getArch());
969+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
970+
EXPECT_EQ(Triple::Linux, T.getOS());
971+
EXPECT_EQ(Triple::MuslABI64, T.getEnvironment());
972+
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
973+
974+
T = Triple("mipsisa64r6-unknown-linux-muslabi64");
975+
EXPECT_EQ(Triple::mips64, T.getArch());
976+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
977+
EXPECT_EQ(Triple::Linux, T.getOS());
978+
EXPECT_EQ(Triple::MuslABI64, T.getEnvironment());
979+
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
980+
981+
T = Triple("mips64el-unknown-linux-muslabin32");
982+
EXPECT_EQ(Triple::mips64el, T.getArch());
983+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
984+
EXPECT_EQ(Triple::Linux, T.getOS());
985+
EXPECT_EQ(Triple::MuslABIN32, T.getEnvironment());
986+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
987+
988+
T = Triple("mips64-unknown-linux-muslabin32");
989+
EXPECT_EQ(Triple::mips64, T.getArch());
990+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
991+
EXPECT_EQ(Triple::Linux, T.getOS());
992+
EXPECT_EQ(Triple::MuslABIN32, T.getEnvironment());
993+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
994+
995+
T = Triple("mipsisa64r6el-unknown-linux-muslabin32");
996+
EXPECT_EQ(Triple::mips64el, T.getArch());
997+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
998+
EXPECT_EQ(Triple::Linux, T.getOS());
999+
EXPECT_EQ(Triple::MuslABIN32, T.getEnvironment());
1000+
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
1001+
1002+
T = Triple("mipsisa64r6-unknown-linux-muslabin32");
1003+
EXPECT_EQ(Triple::mips64, T.getArch());
1004+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1005+
EXPECT_EQ(Triple::Linux, T.getOS());
1006+
EXPECT_EQ(Triple::MuslABIN32, T.getEnvironment());
1007+
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
1008+
1009+
T = Triple("mipsel-unknown-linux-musl");
1010+
EXPECT_EQ(Triple::mipsel, T.getArch());
1011+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1012+
EXPECT_EQ(Triple::Linux, T.getOS());
1013+
EXPECT_EQ(Triple::Musl, T.getEnvironment());
1014+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
1015+
1016+
T = Triple("mips-unknown-linux-musl");
1017+
EXPECT_EQ(Triple::mips, T.getArch());
1018+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1019+
EXPECT_EQ(Triple::Linux, T.getOS());
1020+
EXPECT_EQ(Triple::Musl, T.getEnvironment());
1021+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
1022+
1023+
T = Triple("mipsisa32r6el-unknown-linux-musl");
1024+
EXPECT_EQ(Triple::mipsel, T.getArch());
1025+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1026+
EXPECT_EQ(Triple::Linux, T.getOS());
1027+
EXPECT_EQ(Triple::Musl, T.getEnvironment());
1028+
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
1029+
1030+
T = Triple("mipsisa32r6-unknown-linux-musl");
1031+
EXPECT_EQ(Triple::mips, T.getArch());
1032+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1033+
EXPECT_EQ(Triple::Linux, T.getOS());
1034+
EXPECT_EQ(Triple::Musl, T.getEnvironment());
1035+
EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
1036+
9291037
T = Triple("arm-oe-linux-gnueabi");
9301038
EXPECT_EQ(Triple::arm, T.getArch());
9311039
EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());

0 commit comments

Comments
 (0)