[clang] [llvm] Distinguish between Illumos and Solaris (PR #196807)
via cfe-commits
cfe-commits at lists.llvm.org
Sun May 10 07:20:57 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-driver
Author: Daniel Levin (daniel-levin)
<details>
<summary>Changes</summary>
This is the first of a series of changes to divorce Solaris and Illumos support in LLVM. Closes https://github.com/llvm/llvm-project/issues/53919.
---
Full diff: https://github.com/llvm/llvm-project/pull/196807.diff
10 Files Affected:
- (modified) clang/include/clang/Basic/TargetOSMacros.def (+2-1)
- (modified) clang/lib/Driver/Driver.cpp (+1)
- (modified) clang/test/Driver/fdefine-target-os-macros.c (+18)
- (modified) clang/test/Preprocessor/wchar_t.c (+5)
- (modified) llvm/include/llvm/MC/MCELFObjectWriter.h (+1)
- (modified) llvm/include/llvm/Object/ELFObjectFile.h (+4)
- (modified) llvm/include/llvm/TargetParser/Triple.h (+3)
- (modified) llvm/lib/Analysis/TargetLibraryInfo.cpp (+1-1)
- (modified) llvm/lib/TargetParser/Triple.cpp (+3)
- (modified) llvm/unittests/TargetParser/TripleTest.cpp (+59-1)
``````````diff
diff --git a/clang/include/clang/Basic/TargetOSMacros.def b/clang/include/clang/Basic/TargetOSMacros.def
index 45999b926fdc5..bc844130049b6 100644
--- a/clang/include/clang/Basic/TargetOSMacros.def
+++ b/clang/include/clang/Basic/TargetOSMacros.def
@@ -28,7 +28,8 @@ TARGET_OS(TARGET_OS_LINUX, Triple.isOSLinux())
TARGET_OS(TARGET_OS_UNIX, Triple.isOSNetBSD() ||
Triple.isOSFreeBSD() ||
Triple.isOSOpenBSD() ||
- Triple.isOSSolaris())
+ Triple.isOSSolaris() ||
+ Triple.isOSIllumos())
// Apple (Mac) targets.
TARGET_OS(TARGET_OS_MAC, Triple.isOSDarwin())
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index ed3ddd130d6c7..929b33cb3d494 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7091,6 +7091,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
TC = std::make_unique<toolchains::Serenity>(*this, Target, Args);
break;
case llvm::Triple::Solaris:
+ case llvm::Triple::Illumos:
TC = std::make_unique<toolchains::Solaris>(*this, Target, Args);
break;
case llvm::Triple::CUDA:
diff --git a/clang/test/Driver/fdefine-target-os-macros.c b/clang/test/Driver/fdefine-target-os-macros.c
index 07755d01f9a52..5481d1f465171 100644
--- a/clang/test/Driver/fdefine-target-os-macros.c
+++ b/clang/test/Driver/fdefine-target-os-macros.c
@@ -281,6 +281,24 @@
// RUN: -DUNIX=1 \
// RUN: -DFIRMWARE=0
+// RUN: %clang -dM -E --target=x86_64-pc-illumos \
+// RUN: -fdefine-target-os-macros %s 2>&1 \
+// RUN: | FileCheck %s -DMAC=0 \
+// RUN: -DOSX=0 \
+// RUN: -DIPHONE=0 \
+// RUN: -DIOS=0 \
+// RUN: -DTV=0 \
+// RUN: -DWATCH=0 \
+// RUN: -DVISION=0 \
+// RUN: -DDRIVERKIT=0 \
+// RUN: -DMACCATALYST=0 \
+// RUN: -DEMBEDDED=0 \
+// RUN: -DSIMULATOR=0 \
+// RUN: -DWINDOWS=0 \
+// RUN: -DLINUX=0 \
+// RUN: -DUNIX=1 \
+// RUN: -DFIRMWARE=0
+
// If the firmware OS was valid for a non-Apple vendor,
// it would be TARGET_OS_MAC=0, TARGET_OS_FIRMWARE=1.
diff --git a/clang/test/Preprocessor/wchar_t.c b/clang/test/Preprocessor/wchar_t.c
index 647bbc94389e0..9dfdf434cf37e 100644
--- a/clang/test/Preprocessor/wchar_t.c
+++ b/clang/test/Preprocessor/wchar_t.c
@@ -8,6 +8,11 @@
// CHECK-SOLARIS64-DAG: #define __WCHAR_TYPE__ int
// CHECK-SOLARIS64-NOT: #define __WCHAR_UNSIGNED__ 0
+// RUN: %clang_cc1 -triple x86_64-pc-solaris -dM -E %s -o - | FileCheck %s -check-prefix CHECK-ILLUMOS64
+// CHECK-ILLUMOS64-DAG: #define __WCHAR_MAX__ 2147483647
+// CHECK-ILLUMOS64-DAG: #define __WCHAR_TYPE__ int
+// CHECK-ILLUMOS64-NOT: #define __WCHAR_UNSIGNED__ 0
+
// RUN: %clang_cc1 -triple avr-unknown-unknown -fwchar-type=int -fsigned-wchar -dM -E %s -o - | FileCheck %s -check-prefix CHECK-AVR
// CHECK-AVR-DAG: #define __WCHAR_MAX__ 32767
// CHECK-AVR-DAG: #define __WCHAR_TYPE__ int
diff --git a/llvm/include/llvm/MC/MCELFObjectWriter.h b/llvm/include/llvm/MC/MCELFObjectWriter.h
index 1a87a5c4fc106..043f2f2d15a05 100644
--- a/llvm/include/llvm/MC/MCELFObjectWriter.h
+++ b/llvm/include/llvm/MC/MCELFObjectWriter.h
@@ -77,6 +77,7 @@ class MCELFObjectTargetWriter : public MCObjectTargetWriter {
case Triple::FreeBSD:
return ELF::ELFOSABI_FREEBSD;
case Triple::Solaris:
+ case Triple::Illumos:
return ELF::ELFOSABI_SOLARIS;
case Triple::OpenBSD:
return ELF::ELFOSABI_OPENBSD;
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h
index ca4135742bf6b..b9d78921289ff 100644
--- a/llvm/include/llvm/Object/ELFObjectFile.h
+++ b/llvm/include/llvm/Object/ELFObjectFile.h
@@ -1462,6 +1462,10 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
}
}
+// The EI_OSABI field cannot always be used to uniquely identify the OS.
+// For instance, PS4 and FreeBSD share ELFOSABI_FREEBSD.
+// Moreover, some toolchains on Linux set this field to OSABI_NONE, rather
+// than ELFOSABI_LINUX.
template <class ELFT> Triple::OSType ELFObjectFile<ELFT>::getOS() const {
switch (EF.getHeader().e_ident[ELF::EI_OSABI]) {
case ELF::ELFOSABI_NETBSD:
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index d5a42d9646c18..65b2f5315652f 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -225,6 +225,7 @@ class Triple {
NetBSD,
OpenBSD,
Solaris,
+ Illumos,
UEFI,
Win32,
ZOS,
@@ -675,6 +676,8 @@ class Triple {
bool isOSSolaris() const { return getOS() == Triple::Solaris; }
+ bool isOSIllumos() const { return getOS() == Triple::Illumos; }
+
bool isOSIAMCU() const { return getOS() == Triple::ELFIAMCU; }
bool isOSUnknown() const { return getOS() == Triple::UnknownOS; }
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index 6b8f861392254..43723231fa8b8 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -60,7 +60,7 @@ static bool hasBcmp(const Triple &TT) {
return TT.isGNUEnvironment() || TT.isMusl();
// Both NetBSD and OpenBSD are planning to remove the function. Windows does
// not have it.
- return TT.isOSFreeBSD() || TT.isOSSolaris();
+ return TT.isOSFreeBSD() || TT.isOSSolaris() || TT.isOSIllumos();
}
static bool isCallingConvCCompatible(CallingConv::ID CC, const Triple &TT,
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index c6515425b7eb5..5ca2ca218f313 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -429,6 +429,8 @@ StringRef Triple::getOSTypeName(OSType Kind) {
return "hermit";
case Hurd:
return "hurd";
+ case Illumos:
+ return "illumos";
case IOS:
return "ios";
case KFreeBSD:
@@ -968,6 +970,7 @@ static Triple::OSType parseOS(StringRef OSName) {
.StartsWith("firmware", Triple::Firmware)
.StartsWith("qurt", Triple::QURT)
.StartsWith("h2", Triple::H2)
+ .StartsWith("illumos", Triple::Illumos)
.Default(Triple::UnknownOS);
}
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index 9ce222b6c9c39..44352410406b4 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -1475,6 +1475,36 @@ TEST(TripleTest, ParsedIDs) {
EXPECT_EQ(Triple::spirv64, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
EXPECT_EQ(Triple::ChipStar, T.getOS());
+
+ T = Triple("x86_64-pc-solaris2.11");
+ EXPECT_EQ(Triple::x86_64, T.getArch());
+ EXPECT_EQ(Triple::PC, T.getVendor());
+ EXPECT_EQ(Triple::Solaris, T.getOS());
+ EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+ EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
+
+ T = Triple("sparcv9-sun-solaris2.11");
+ EXPECT_EQ(Triple::sparcv9, T.getArch());
+ EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+ EXPECT_EQ(Triple::Solaris, T.getOS());
+ EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+ EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
+
+ T = Triple("x86_64-pc-illumos");
+ EXPECT_EQ(Triple::x86_64, T.getArch());
+ EXPECT_EQ(Triple::PC, T.getVendor());
+ EXPECT_EQ(Triple::Illumos, T.getOS());
+ EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+ EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
+ EXPECT_EQ(T.getOSName(), "illumos");
+
+ T = Triple("x86_64-sun-illumos");
+ EXPECT_EQ(Triple::x86_64, T.getArch());
+ EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+ EXPECT_EQ(Triple::Illumos, T.getOS());
+ EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+ EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
+ EXPECT_EQ(T.getOSName(), "illumos");
}
TEST(TripleTest, EnumConstructor) {
@@ -1583,6 +1613,17 @@ TEST(TripleTest, EnumConstructor) {
EXPECT_EQ(T.getObjectFormat(), Triple::COFF);
EXPECT_EQ(T.str(), "i386-pc-windows-msvc");
}
+
+ {
+ Triple T(Triple::x86_64, Triple::NoSubArch, Triple::PC, Triple::Illumos);
+ EXPECT_EQ(T.getArch(), Triple::x86_64);
+ EXPECT_EQ(T.getVendor(), Triple::PC);
+ EXPECT_EQ(T.getOS(), Triple::Illumos);
+ EXPECT_EQ(T.getOSName(), "illumos");
+ EXPECT_EQ(T.getEnvironment(), Triple::UnknownEnvironment);
+ EXPECT_EQ(T.getObjectFormat(), Triple::ELF);
+ EXPECT_EQ(T.str(), "x86_64-pc-illumos");
+ }
}
static std::string Join(StringRef A, StringRef B, StringRef C) {
@@ -1770,6 +1811,10 @@ TEST(TripleTest, Normalization) {
"x86_64-unknown-linux-gnu-unknown",
Triple::normalize("x86_64-gnu-linux", Triple::CanonicalForm::FIVE_IDENT));
+ EXPECT_EQ(
+ "x86_64-pc-illumos-unknown-unknown",
+ Triple::normalize("x86_64-pc-illumos", Triple::CanonicalForm::FIVE_IDENT));
+
// Check that normalizing a permutated set of valid components returns a
// triple with the unpermuted components.
//
@@ -3152,7 +3197,13 @@ TEST(TripleTest, DefaultExceptionHandling) {
Triple("aarch64-pc-windows-msvc").getDefaultExceptionHandling());
EXPECT_EQ(ExceptionHandling::DwarfCFI,
Triple("aarch64-pc-windows-elf").getDefaultExceptionHandling());
-}
+
+ EXPECT_EQ(ExceptionHandling::DwarfCFI,
+ Triple("x86_64-pc-solaris2.11").getDefaultExceptionHandling());
+
+ EXPECT_EQ(ExceptionHandling::DwarfCFI,
+ Triple("x86_64-pc-illumos").getDefaultExceptionHandling());
+ }
TEST(TripleTest, NormalizeWindows) {
EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
@@ -3542,4 +3593,11 @@ TEST(DataLayoutTest, CheriRISCV32) {
testing::HasSubstr("A200-P200-G200"));
}
+TEST(DataLayoutTest, SolarisIllumosSameLayoutOnX86_64) {
+ Triple T_Illumos = Triple("x86_64-pc-illumos");
+ Triple T_Solaris = Triple("x86_64-pc-solaris2.11");
+
+ EXPECT_EQ(T_Illumos.computeDataLayout(), T_Solaris.computeDataLayout());
+}
+
} // end anonymous namespace
``````````
</details>
https://github.com/llvm/llvm-project/pull/196807
More information about the cfe-commits
mailing list