Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions clang/lib/Driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ||
Expand All @@ -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);
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Driver/ToolChains/Linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
23 changes: 17 additions & 6 deletions llvm/include/llvm/TargetParser/Triple.h
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,14 @@ class Triple {
enum EnvironmentType {
UnknownEnvironment,

ABIN32,
ABI64,
EABI,
EABIHF,
F32,
SF,
X32,

GNU,
GNUT64,
GNUABIN32,
Expand All @@ -266,10 +274,7 @@ class Triple {
GNUSF,
GNUX32,
GNUILP32,
CODE16,
EABI,
EABIHF,
Android,

Musl,
MuslABIN32,
MuslABI64,
Expand All @@ -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.

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
15 changes: 15 additions & 0 deletions llvm/lib/TargetParser/Triple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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)
Expand Down
30 changes: 30 additions & 0 deletions llvm/unittests/TargetParser/TripleTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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());
Expand Down
Loading