aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2022-07-27 12:21:03 +0200
committerTom Stellard <tstellar@redhat.com>2022-08-02 01:49:41 -0700
commit12e4e9777975858ea7f5f2a80157b0543c1f0c72 (patch)
treea6a6b3b0656b8741d9792f92e48efedf677dd3aa
parent73d45fea656b1c15c20dd96b386d6004638ae7f3 (diff)
[Support] Handle SPARC in sys::getHostCPUName
While working on D118450 <https://reviews.llvm.org/D118450>, I noticed that `sys::getHostCPUName` lacks SPARC support. This patch implements it. The code is taken from/inspired by GCC's `gcc/config/sparc/driver-sparc.cc`. There's one caveat: since LLVM, unlike GCC, doesn't support the SPARC-M7, -S7, and -M8 CPUs, I map all those to the latest supported one (UltraSparc T4/`niagara4`). Tested on `sparcv9-sun-solaris2.11` and `sparc64-unknown-linux-gnu` by running `savcov --version` on - Netra SPARC S7-2 (SPARC-S7, Solaris 11.4) - SPARC T5-2 (SPARC T5, Solaris 11.4) - SPARC Enterprise T5220 (UltraSPARC T2, Solaris 11.3) - SPARC T5 (UltraSPARC T5, Debian sid) - SPARC T3 (UltraSPARC T3, Debian sid) - SPARC Enterprise T5220 (Debian sid) Differential Revision: https://reviews.llvm.org/D130272 (cherry picked from commit 979ddfff37d7e3bf258c2e5cbdc272fcb44c15f0)
-rw-r--r--llvm/include/llvm/Support/Host.h1
-rw-r--r--llvm/lib/Support/CMakeLists.txt3
-rw-r--r--llvm/lib/Support/Host.cpp108
3 files changed, 112 insertions, 0 deletions
diff --git a/llvm/include/llvm/Support/Host.h b/llvm/include/llvm/Support/Host.h
index f683371ad1d3..369d6745db5a 100644
--- a/llvm/include/llvm/Support/Host.h
+++ b/llvm/include/llvm/Support/Host.h
@@ -65,6 +65,7 @@ namespace sys {
StringRef getHostCPUNameForARM(StringRef ProcCpuinfoContent);
StringRef getHostCPUNameForS390x(StringRef ProcCpuinfoContent);
StringRef getHostCPUNameForRISCV(StringRef ProcCpuinfoContent);
+ StringRef getHostCPUNameForSPARC(StringRef ProcCpuinfoContent);
StringRef getHostCPUNameForBPF();
/// Helper functions to extract CPU details from CPUID on x86.
diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
index b2447cd16865..5044b2639a0f 100644
--- a/llvm/lib/Support/CMakeLists.txt
+++ b/llvm/lib/Support/CMakeLists.txt
@@ -58,6 +58,9 @@ elseif( CMAKE_HOST_UNIX )
if( UNIX AND NOT (BEOS OR HAIKU) )
set(system_libs ${system_libs} m)
endif()
+ if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
+ set(system_libs ${system_libs} kstat)
+ endif()
if( FUCHSIA )
set(system_libs ${system_libs} zircon)
endif()
diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp
index 08e3a27e0173..c97f273b0739 100644
--- a/llvm/lib/Support/Host.cpp
+++ b/llvm/lib/Support/Host.cpp
@@ -47,6 +47,9 @@
#ifdef _AIX
#include <sys/systemcfg.h>
#endif
+#if defined(__sun__) && defined(__svr4__)
+#include <kstat.h>
+#endif
#define DEBUG_TYPE "host-detection"
@@ -1413,6 +1416,111 @@ StringRef sys::getHostCPUName() {
#endif
#endif
}
+#elif defined(__sparc__)
+#if defined(__linux__)
+StringRef sys::detail::getHostCPUNameForSPARC(StringRef ProcCpuinfoContent) {
+ SmallVector<StringRef> Lines;
+ ProcCpuinfoContent.split(Lines, "\n");
+
+ // Look for cpu line to determine cpu name
+ StringRef Cpu;
+ for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
+ if (Lines[I].startswith("cpu")) {
+ Cpu = Lines[I].substr(5).ltrim("\t :");
+ break;
+ }
+ }
+
+ return StringSwitch<const char *>(Cpu)
+ .StartsWith("SuperSparc", "supersparc")
+ .StartsWith("HyperSparc", "hypersparc")
+ .StartsWith("SpitFire", "ultrasparc")
+ .StartsWith("BlackBird", "ultrasparc")
+ .StartsWith("Sabre", " ultrasparc")
+ .StartsWith("Hummingbird", "ultrasparc")
+ .StartsWith("Cheetah", "ultrasparc3")
+ .StartsWith("Jalapeno", "ultrasparc3")
+ .StartsWith("Jaguar", "ultrasparc3")
+ .StartsWith("Panther", "ultrasparc3")
+ .StartsWith("Serrano", "ultrasparc3")
+ .StartsWith("UltraSparc T1", "niagara")
+ .StartsWith("UltraSparc T2", "niagara2")
+ .StartsWith("UltraSparc T3", "niagara3")
+ .StartsWith("UltraSparc T4", "niagara4")
+ .StartsWith("UltraSparc T5", "niagara4")
+ .StartsWith("LEON", "leon3")
+ // niagara7/m8 not supported by LLVM yet.
+ .StartsWith("SPARC-M7", "niagara4" /* "niagara7" */)
+ .StartsWith("SPARC-S7", "niagara4" /* "niagara7" */)
+ .StartsWith("SPARC-M8", "niagara4" /* "m8" */)
+ .Default("generic");
+}
+#endif
+
+StringRef sys::getHostCPUName() {
+#if defined(__linux__)
+ std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
+ StringRef Content = P ? P->getBuffer() : "";
+ return detail::getHostCPUNameForSPARC(Content);
+#elif defined(__sun__) && defined(__svr4__)
+ char *buf = NULL;
+ kstat_ctl_t *kc;
+ kstat_t *ksp;
+ kstat_named_t *brand = NULL;
+
+ kc = kstat_open();
+ if (kc != NULL) {
+ ksp = kstat_lookup(kc, const_cast<char *>("cpu_info"), -1, NULL);
+ if (ksp != NULL && kstat_read(kc, ksp, NULL) != -1 &&
+ ksp->ks_type == KSTAT_TYPE_NAMED)
+ brand =
+ (kstat_named_t *)kstat_data_lookup(ksp, const_cast<char *>("brand"));
+ if (brand != NULL && brand->data_type == KSTAT_DATA_STRING)
+ buf = KSTAT_NAMED_STR_PTR(brand);
+ }
+ kstat_close(kc);
+
+ return StringSwitch<const char *>(buf)
+ .Case("TMS390S10", "supersparc") // Texas Instruments microSPARC I
+ .Case("TMS390Z50", "supersparc") // Texas Instruments SuperSPARC I
+ .Case("TMS390Z55",
+ "supersparc") // Texas Instruments SuperSPARC I with SuperCache
+ .Case("MB86904", "supersparc") // Fujitsu microSPARC II
+ .Case("MB86907", "supersparc") // Fujitsu TurboSPARC
+ .Case("RT623", "hypersparc") // Ross hyperSPARC
+ .Case("RT625", "hypersparc")
+ .Case("RT626", "hypersparc")
+ .Case("UltraSPARC-I", "ultrasparc")
+ .Case("UltraSPARC-II", "ultrasparc")
+ .Case("UltraSPARC-IIe", "ultrasparc")
+ .Case("UltraSPARC-IIi", "ultrasparc")
+ .Case("SPARC64-III", "ultrasparc")
+ .Case("SPARC64-IV", "ultrasparc")
+ .Case("UltraSPARC-III", "ultrasparc3")
+ .Case("UltraSPARC-III+", "ultrasparc3")
+ .Case("UltraSPARC-IIIi", "ultrasparc3")
+ .Case("UltraSPARC-IIIi+", "ultrasparc3")
+ .Case("UltraSPARC-IV", "ultrasparc3")
+ .Case("UltraSPARC-IV+", "ultrasparc3")
+ .Case("SPARC64-V", "ultrasparc3")
+ .Case("SPARC64-VI", "ultrasparc3")
+ .Case("SPARC64-VII", "ultrasparc3")
+ .Case("UltraSPARC-T1", "niagara")
+ .Case("UltraSPARC-T2", "niagara2")
+ .Case("UltraSPARC-T2", "niagara2")
+ .Case("UltraSPARC-T2+", "niagara2")
+ .Case("SPARC-T3", "niagara3")
+ .Case("SPARC-T4", "niagara4")
+ .Case("SPARC-T5", "niagara4")
+ // niagara7/m8 not supported by LLVM yet.
+ .Case("SPARC-M7", "niagara4" /* "niagara7" */)
+ .Case("SPARC-S7", "niagara4" /* "niagara7" */)
+ .Case("SPARC-M8", "niagara4" /* "m8" */)
+ .Default("generic");
+#else
+ return "generic";
+#endif
+}
#else
StringRef sys::getHostCPUName() { return "generic"; }
namespace llvm {