diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -401,6 +401,11 @@ case llvm::Triple::x86: ArchName = "i386"; break; + case llvm::Triple::x86_64: + ArchName = Triple.getEnvironment() == llvm::Triple::MuslX32 + ? "x32" + : Triple.getArchName().str(); + break; default: ArchName = Triple.getArchName().str(); } diff --git a/clang/test/Driver/linux-cross.cpp b/clang/test/Driver/linux-cross.cpp --- a/clang/test/Driver/linux-cross.cpp +++ b/clang/test/Driver/linux-cross.cpp @@ -75,3 +75,7 @@ // RUN: %clang -### %s --target=i686-linux-musl --sysroot= \ // RUN: --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=MUSL_I686 // MUSL_I686: "-dynamic-linker" "/lib/ld-musl-i386.so.1" + +// RUN: %clang -### %s --target=x86_64-linux-muslx32 --sysroot= \ +// RUN: --stdlib=platform --rtlib=platform 2>&1 | FileCheck %s --check-prefix=MUSL_X32 +// MUSL_X32: "-dynamic-linker" "/lib/ld-musl-x32.so.1" diff --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h @@ -218,6 +218,7 @@ Musl, MuslEABI, MuslEABIHF, + MuslX32, MSVC, Itanium, @@ -688,7 +689,8 @@ bool isMusl() const { return getEnvironment() == Triple::Musl || getEnvironment() == Triple::MuslEABI || - getEnvironment() == Triple::MuslEABIHF; + getEnvironment() == Triple::MuslEABIHF || + getEnvironment() == Triple::MuslX32; } /// Tests whether the target is SPIR (32- or 64-bit). diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp @@ -250,6 +250,7 @@ case Musl: return "musl"; case MuslEABI: return "musleabi"; case MuslEABIHF: return "musleabihf"; + case MuslX32: return "muslx32"; case Simulator: return "simulator"; } @@ -555,6 +556,7 @@ .StartsWith("android", Triple::Android) .StartsWith("musleabihf", Triple::MuslEABIHF) .StartsWith("musleabi", Triple::MuslEABI) + .StartsWith("muslx32", Triple::MuslX32) .StartsWith("musl", Triple::Musl) .StartsWith("msvc", Triple::MSVC) .StartsWith("itanium", Triple::Itanium) diff --git a/llvm/unittests/ADT/TripleTest.cpp b/llvm/unittests/ADT/TripleTest.cpp --- a/llvm/unittests/ADT/TripleTest.cpp +++ b/llvm/unittests/ADT/TripleTest.cpp @@ -111,6 +111,12 @@ EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::Musl, T.getEnvironment()); + T = Triple("x86_64-pc-linux-muslx32"); + EXPECT_EQ(Triple::x86_64, T.getArch()); + EXPECT_EQ(Triple::PC, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::MuslX32, T.getEnvironment()); + // PS4 has two spellings for the vendor. T = Triple("x86_64-scei-ps4"); EXPECT_EQ(Triple::x86_64, T.getArch());