https://github.com/daniel-levin created 
https://github.com/llvm/llvm-project/pull/196807

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.

>From a0c359f846d25cab00e20dd1d29459b20ce2d5de Mon Sep 17 00:00:00 2001
From: Daniel Levin <[email protected]>
Date: Sat, 9 May 2026 15:17:47 +0200
Subject: [PATCH 1/6] Inform LLVM of Illumos

- Add a new OS variant "Illumos".
- Ensure existing Solaris triple parsing code is not broken.
- Ensure Solaris/Illumos data layout is the same on x86_64.
---
 llvm/include/llvm/TargetParser/Triple.h    |  3 ++
 llvm/lib/TargetParser/Triple.cpp           |  3 ++
 llvm/unittests/TargetParser/TripleTest.cpp | 60 +++++++++++++++++++++-
 3 files changed, 65 insertions(+), 1 deletion(-)

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/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

>From 282f0e6e28bb049cc3c85f22adf3c295d06ac1ea Mon Sep 17 00:00:00 2001
From: Daniel Levin <[email protected]>
Date: Sat, 9 May 2026 17:02:21 +0200
Subject: [PATCH 2/6] Allow the continued use of bcmp() on Illumos

---
 llvm/lib/Analysis/TargetLibraryInfo.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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,

>From c37cc2fb28c011bf20e706e7dd203c91d4947c75 Mon Sep 17 00:00:00 2001
From: Daniel Levin <[email protected]>
Date: Sat, 9 May 2026 17:08:34 +0200
Subject: [PATCH 3/6] Ensure TARGET_OS_UNIX is defined on Illumos

---
 clang/include/clang/Basic/TargetOSMacros.def |  3 ++-
 clang/test/Driver/fdefine-target-os-macros.c | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

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/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.
 

>From 63f92650e9dbf5e7c30075d6b8a5bee45f1ac3e8 Mon Sep 17 00:00:00 2001
From: Daniel Levin <[email protected]>
Date: Sun, 10 May 2026 15:36:59 +0200
Subject: [PATCH 4/6] Ensure ELF writer maintains OSABI for Illumos

---
 llvm/include/llvm/MC/MCELFObjectWriter.h | 1 +
 llvm/include/llvm/Object/ELFObjectFile.h | 4 ++++
 2 files changed, 5 insertions(+)

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:

>From 2c8d6f9c939eadb563c829c4200fcc999df08d19 Mon Sep 17 00:00:00 2001
From: Daniel Levin <[email protected]>
Date: Sun, 10 May 2026 15:54:32 +0200
Subject: [PATCH 5/6] Illumos must use the Solaris driver (for now)

---
 clang/lib/Driver/Driver.cpp | 1 +
 1 file changed, 1 insertion(+)

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:

>From b70da2d109478d83bfc3bc9b72d00b1866ce3a1a Mon Sep 17 00:00:00 2001
From: Daniel Levin <[email protected]>
Date: Sun, 10 May 2026 16:11:23 +0200
Subject: [PATCH 6/6] Ensure wchar works correctly on Illumos

---
 clang/test/Preprocessor/wchar_t.c | 5 +++++
 1 file changed, 5 insertions(+)

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

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to