Skip to content

Conversation

@alexrp
Copy link
Member

@alexrp alexrp commented Nov 14, 2025

In Zig, building libc-less binaries is a first-class use case. As such, we would like to have environment names that indicate the ABI but without implying anything about libc. This is in line with the existing EABI and EABIHF environments.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' backend:loongarch labels Nov 14, 2025
@llvmbot
Copy link
Member

llvmbot commented Nov 14, 2025

@llvm/pr-subscribers-clang-driver

@llvm/pr-subscribers-backend-loongarch

Author: Alex Rønne Petersen (alexrp)

Changes

In Zig, building libc-less binaries is a first-class use case. As such, we would like to have environment names that indicate the ABI but without implying anything about libc. This is in line with the existing EABI and EABIHF environments.


Full diff: https://github.com/llvm/llvm-project/pull/168042.diff

7 Files Affected:

  • (modified) clang/lib/Driver/Driver.cpp (+4)
  • (modified) clang/lib/Driver/ToolChains/Arch/LoongArch.cpp (+2)
  • (modified) clang/lib/Driver/ToolChains/Linux.cpp (+2)
  • (modified) llvm/include/llvm/TargetParser/Triple.h (+17-6)
  • (modified) llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp (+2)
  • (modified) llvm/lib/TargetParser/Triple.cpp (+15)
  • (modified) llvm/unittests/TargetParser/TripleTest.cpp (+30)
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<Triple::EnvironmentType>(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());

@llvmbot
Copy link
Member

llvmbot commented Nov 14, 2025

@llvm/pr-subscribers-clang

Author: Alex Rønne Petersen (alexrp)

Changes

In Zig, building libc-less binaries is a first-class use case. As such, we would like to have environment names that indicate the ABI but without implying anything about libc. This is in line with the existing EABI and EABIHF environments.


Full diff: https://github.com/llvm/llvm-project/pull/168042.diff

7 Files Affected:

  • (modified) clang/lib/Driver/Driver.cpp (+4)
  • (modified) clang/lib/Driver/ToolChains/Arch/LoongArch.cpp (+2)
  • (modified) clang/lib/Driver/ToolChains/Linux.cpp (+2)
  • (modified) llvm/include/llvm/TargetParser/Triple.h (+17-6)
  • (modified) llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp (+2)
  • (modified) llvm/lib/TargetParser/Triple.cpp (+15)
  • (modified) llvm/unittests/TargetParser/TripleTest.cpp (+30)
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<Triple::EnvironmentType>(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());

@alexrp
Copy link
Member Author

alexrp commented Nov 21, 2025

ping

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend:loongarch clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants