Skip to content

Commit 72a2180

Browse files
authored
[llvm][Triple] Add Environment members and parsing for glibc/musl parity. (#107664)
This adds support for: * `muslabin32` (MIPS N32) * `muslabi64` (MIPS N64) * `muslf32` (LoongArch ILP32F/LP64F) * `muslsf` (LoongArch ILP32S/LP64S) As we start adding glibc/musl cross-compilation support for these targets in Zig, it would make our life easier if LLVM recognized these triples. I'm hoping this'll be uncontroversial since the same has already been done for `musleabi`, `musleabihf`, and `muslx32`. I intentionally left out a musl equivalent of `gnuf64` (LoongArch ILP32D/LP64D); my understanding is that Loongson ultimately settled on simply `gnu` for this much more common case, so there doesn't *seem* to be a particularly compelling reason to add a `muslf64` that's basically deprecated on arrival. Note: I don't have commit access.
1 parent b3533a1 commit 72a2180

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)