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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to