diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 9fd64d4aac514..bdb69434c94ba 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -808,6 +808,8 @@ static llvm::Triple computeTargetTriple(const Driver &D, else if (Target.getEnvironment() == llvm::Triple::Musl || Target.getEnvironment() == llvm::Triple::MuslABI64) Target.setEnvironment(llvm::Triple::MuslABIN32); + else + Target.setEnvironment(llvm::Triple::ABIN32); } else if (ABIName == "64") { Target = Target.get64BitArchVariant(); if (Target.getEnvironment() == llvm::Triple::GNU || @@ -817,6 +819,8 @@ static llvm::Triple computeTargetTriple(const Driver &D, else if (Target.getEnvironment() == llvm::Triple::Musl || Target.getEnvironment() == llvm::Triple::MuslABIN32) Target.setEnvironment(llvm::Triple::MuslABI64); + else + Target.setEnvironment(llvm::Triple::ABI64); } } } diff --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp index da084bdabaee3..67e7e3d37a5ad 100644 --- a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp +++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp @@ -102,9 +102,11 @@ StringRef loongarch::getLoongArchABI(const Driver &D, const ArgList &Args, // Honor the explicit ABI modifier suffix in triple's environment part if // present, falling back to {ILP32,LP64}D otherwise. switch (Triple.getEnvironment()) { + case llvm::Triple::SF: case llvm::Triple::GNUSF: case llvm::Triple::MuslSF: return IsLA32 ? "ilp32s" : "lp64s"; + case llvm::Triple::F32: case llvm::Triple::GNUF32: case llvm::Triple::MuslF32: return IsLA32 ? "ilp32f" : "lp64f"; diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 020e7465548fe..2a207418ecc05 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -107,10 +107,12 @@ std::string Linux::getMultiarchTriple(const Driver &D, switch (TargetEnvironment) { default: return TargetTriple.str(); + case llvm::Triple::SF: case llvm::Triple::GNUSF: case llvm::Triple::MuslSF: FPFlavor = "sf"; break; + case llvm::Triple::F32: case llvm::Triple::GNUF32: case llvm::Triple::MuslF32: FPFlavor = "f32"; diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 11b76cd183108..8b6899b07af05 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -253,6 +253,14 @@ class Triple { enum EnvironmentType { UnknownEnvironment, + ABIN32, + ABI64, + EABI, + EABIHF, + F32, + SF, + X32, + GNU, GNUT64, GNUABIN32, @@ -266,10 +274,7 @@ class Triple { GNUSF, GNUX32, GNUILP32, - CODE16, - EABI, - EABIHF, - Android, + Musl, MuslABIN32, MuslABI64, @@ -279,12 +284,16 @@ class Triple { MuslSF, MuslX32, MuslWALI, + + Android, + CODE16, LLVM, MSVC, Itanium, Cygnus, CoreCLR, + Simulator, // Simulator variants of other systems, e.g., Apple's iOS MacABI, // Mac Catalyst variant of Apple's iOS deployment target. @@ -1157,13 +1166,15 @@ class Triple { // Tests whether the target is N32. bool isABIN32() const { EnvironmentType Env = getEnvironment(); - return Env == Triple::GNUABIN32 || Env == Triple::MuslABIN32; + return Env == Triple::GNUABIN32 || Env == Triple::MuslABIN32 || + Env == Triple::ABIN32; } /// Tests whether the target is X32. bool isX32() const { EnvironmentType Env = getEnvironment(); - return Env == Triple::GNUX32 || Env == Triple::MuslX32; + return Env == Triple::GNUX32 || Env == Triple::MuslX32 || + Env == Triple::X32; } /// Tests whether the target is eBPF. diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp index 7cefb3f8119b8..13d77327d8b6c 100644 --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp @@ -55,10 +55,12 @@ static ABI getTripleABI(const Triple &TT) { case llvm::Triple::EnvironmentType::UnknownEnvironment: TripleABI = ABI_Unknown; break; + case llvm::Triple::EnvironmentType::SF: case llvm::Triple::EnvironmentType::GNUSF: case llvm::Triple::EnvironmentType::MuslSF: TripleABI = Is64Bit ? ABI_LP64S : ABI_ILP32S; break; + case llvm::Triple::EnvironmentType::F32: case llvm::Triple::EnvironmentType::GNUF32: case llvm::Triple::EnvironmentType::MuslF32: TripleABI = Is64Bit ? ABI_LP64F : ABI_ILP32F; diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 11ba9ee32f66a..f1e621af44592 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -345,8 +345,18 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { case CODE16: return "code16"; case CoreCLR: return "coreclr"; case Cygnus: return "cygnus"; + case ABIN32: + return "abin32"; + case ABI64: + return "abi64"; case EABI: return "eabi"; case EABIHF: return "eabihf"; + case F32: + return "f32"; + case SF: + return "sf"; + case X32: + return "x32"; case GNU: return "gnu"; case GNUT64: return "gnut64"; case GNUABI64: return "gnuabi64"; @@ -747,8 +757,13 @@ static Triple::OSType parseOS(StringRef OSName) { static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { return StringSwitch(EnvironmentName) + .StartsWith("abin32", Triple::ABIN32) + .StartsWith("abi64", Triple::ABI64) .StartsWith("eabihf", Triple::EABIHF) .StartsWith("eabi", Triple::EABI) + .StartsWith("f32", Triple::F32) + .StartsWith("sf", Triple::SF) + .StartsWith("x32", Triple::X32) .StartsWith("gnuabin32", Triple::GNUABIN32) .StartsWith("gnuabi64", Triple::GNUABI64) .StartsWith("gnueabihft64", Triple::GNUEABIHFT64) diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index df8284d7be66a..d986926c2945c 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -121,6 +121,12 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::MuslX32, T.getEnvironment()); + T = Triple("x86_64-pc-linux-x32"); + EXPECT_EQ(Triple::x86_64, T.getArch()); + EXPECT_EQ(Triple::PC, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::X32, T.getEnvironment()); + T = Triple("x86_64-pc-hurd-gnu"); EXPECT_EQ(Triple::x86_64, T.getArch()); EXPECT_EQ(Triple::PC, T.getVendor()); @@ -728,12 +734,24 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::MuslF32, T.getEnvironment()); + T = Triple("loongarch32-unknown-linux-f32"); + EXPECT_EQ(Triple::loongarch32, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::F32, T.getEnvironment()); + T = Triple("loongarch32-unknown-linux-muslsf"); EXPECT_EQ(Triple::loongarch32, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::MuslSF, T.getEnvironment()); + T = Triple("loongarch32-unknown-linux-sf"); + EXPECT_EQ(Triple::loongarch32, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::SF, T.getEnvironment()); + T = Triple("loongarch64-unknown-linux"); EXPECT_EQ(Triple::loongarch64, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); @@ -924,6 +942,12 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::GNUABI64, T.getEnvironment()); EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch()); + T = Triple("mips64-unknown-linux-abi64"); + EXPECT_EQ(Triple::mips64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::ABI64, T.getEnvironment()); + T = Triple("mips64el-unknown-linux-gnuabin32"); EXPECT_EQ(Triple::mips64el, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); @@ -1085,6 +1109,12 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::MuslABIN32, T.getEnvironment()); EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch()); + T = Triple("mips64-unknown-linux-abin32"); + EXPECT_EQ(Triple::mips64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::ABIN32, T.getEnvironment()); + T = Triple("mipsel-unknown-linux-musl"); EXPECT_EQ(Triple::mipsel, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor());