Skip to content

Commit 12e4e97

Browse files
rorthtstellar
authored andcommitted
[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 979ddff)
1 parent 73d45fe commit 12e4e97

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

llvm/include/llvm/Support/Host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ namespace sys {
6565
StringRef getHostCPUNameForARM(StringRef ProcCpuinfoContent);
6666
StringRef getHostCPUNameForS390x(StringRef ProcCpuinfoContent);
6767
StringRef getHostCPUNameForRISCV(StringRef ProcCpuinfoContent);
68+
StringRef getHostCPUNameForSPARC(StringRef ProcCpuinfoContent);
6869
StringRef getHostCPUNameForBPF();
6970

7071
/// Helper functions to extract CPU details from CPUID on x86.

llvm/lib/Support/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ elseif( CMAKE_HOST_UNIX )
5858
if( UNIX AND NOT (BEOS OR HAIKU) )
5959
set(system_libs ${system_libs} m)
6060
endif()
61+
if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
62+
set(system_libs ${system_libs} kstat)
63+
endif()
6164
if( FUCHSIA )
6265
set(system_libs ${system_libs} zircon)
6366
endif()

llvm/lib/Support/Host.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
#ifdef _AIX
4848
#include <sys/systemcfg.h>
4949
#endif
50+
#if defined(__sun__) && defined(__svr4__)
51+
#include <kstat.h>
52+
#endif
5053

5154
#define DEBUG_TYPE "host-detection"
5255

@@ -1413,6 +1416,111 @@ StringRef sys::getHostCPUName() {
14131416
#endif
14141417
#endif
14151418
}
1419+
#elif defined(__sparc__)
1420+
#if defined(__linux__)
1421+
StringRef sys::detail::getHostCPUNameForSPARC(StringRef ProcCpuinfoContent) {
1422+
SmallVector<StringRef> Lines;
1423+
ProcCpuinfoContent.split(Lines, "\n");
1424+
1425+
// Look for cpu line to determine cpu name
1426+
StringRef Cpu;
1427+
for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
1428+
if (Lines[I].startswith("cpu")) {
1429+
Cpu = Lines[I].substr(5).ltrim("\t :");
1430+
break;
1431+
}
1432+
}
1433+
1434+
return StringSwitch<const char *>(Cpu)
1435+
.StartsWith("SuperSparc", "supersparc")
1436+
.StartsWith("HyperSparc", "hypersparc")
1437+
.StartsWith("SpitFire", "ultrasparc")
1438+
.StartsWith("BlackBird", "ultrasparc")
1439+
.StartsWith("Sabre", " ultrasparc")
1440+
.StartsWith("Hummingbird", "ultrasparc")
1441+
.StartsWith("Cheetah", "ultrasparc3")
1442+
.StartsWith("Jalapeno", "ultrasparc3")
1443+
.StartsWith("Jaguar", "ultrasparc3")
1444+
.StartsWith("Panther", "ultrasparc3")
1445+
.StartsWith("Serrano", "ultrasparc3")
1446+
.StartsWith("UltraSparc T1", "niagara")
1447+
.StartsWith("UltraSparc T2", "niagara2")
1448+
.StartsWith("UltraSparc T3", "niagara3")
1449+
.StartsWith("UltraSparc T4", "niagara4")
1450+
.StartsWith("UltraSparc T5", "niagara4")
1451+
.StartsWith("LEON", "leon3")
1452+
// niagara7/m8 not supported by LLVM yet.
1453+
.StartsWith("SPARC-M7", "niagara4" /* "niagara7" */)
1454+
.StartsWith("SPARC-S7", "niagara4" /* "niagara7" */)
1455+
.StartsWith("SPARC-M8", "niagara4" /* "m8" */)
1456+
.Default("generic");
1457+
}
1458+
#endif
1459+
1460+
StringRef sys::getHostCPUName() {
1461+
#if defined(__linux__)
1462+
std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1463+
StringRef Content = P ? P->getBuffer() : "";
1464+
return detail::getHostCPUNameForSPARC(Content);
1465+
#elif defined(__sun__) && defined(__svr4__)
1466+
char *buf = NULL;
1467+
kstat_ctl_t *kc;
1468+
kstat_t *ksp;
1469+
kstat_named_t *brand = NULL;
1470+
1471+
kc = kstat_open();
1472+
if (kc != NULL) {
1473+
ksp = kstat_lookup(kc, const_cast<char *>("cpu_info"), -1, NULL);
1474+
if (ksp != NULL && kstat_read(kc, ksp, NULL) != -1 &&
1475+
ksp->ks_type == KSTAT_TYPE_NAMED)
1476+
brand =
1477+
(kstat_named_t *)kstat_data_lookup(ksp, const_cast<char *>("brand"));
1478+
if (brand != NULL && brand->data_type == KSTAT_DATA_STRING)
1479+
buf = KSTAT_NAMED_STR_PTR(brand);
1480+
}
1481+
kstat_close(kc);
1482+
1483+
return StringSwitch<const char *>(buf)
1484+
.Case("TMS390S10", "supersparc") // Texas Instruments microSPARC I
1485+
.Case("TMS390Z50", "supersparc") // Texas Instruments SuperSPARC I
1486+
.Case("TMS390Z55",
1487+
"supersparc") // Texas Instruments SuperSPARC I with SuperCache
1488+
.Case("MB86904", "supersparc") // Fujitsu microSPARC II
1489+
.Case("MB86907", "supersparc") // Fujitsu TurboSPARC
1490+
.Case("RT623", "hypersparc") // Ross hyperSPARC
1491+
.Case("RT625", "hypersparc")
1492+
.Case("RT626", "hypersparc")
1493+
.Case("UltraSPARC-I", "ultrasparc")
1494+
.Case("UltraSPARC-II", "ultrasparc")
1495+
.Case("UltraSPARC-IIe", "ultrasparc")
1496+
.Case("UltraSPARC-IIi", "ultrasparc")
1497+
.Case("SPARC64-III", "ultrasparc")
1498+
.Case("SPARC64-IV", "ultrasparc")
1499+
.Case("UltraSPARC-III", "ultrasparc3")
1500+
.Case("UltraSPARC-III+", "ultrasparc3")
1501+
.Case("UltraSPARC-IIIi", "ultrasparc3")
1502+
.Case("UltraSPARC-IIIi+", "ultrasparc3")
1503+
.Case("UltraSPARC-IV", "ultrasparc3")
1504+
.Case("UltraSPARC-IV+", "ultrasparc3")
1505+
.Case("SPARC64-V", "ultrasparc3")
1506+
.Case("SPARC64-VI", "ultrasparc3")
1507+
.Case("SPARC64-VII", "ultrasparc3")
1508+
.Case("UltraSPARC-T1", "niagara")
1509+
.Case("UltraSPARC-T2", "niagara2")
1510+
.Case("UltraSPARC-T2", "niagara2")
1511+
.Case("UltraSPARC-T2+", "niagara2")
1512+
.Case("SPARC-T3", "niagara3")
1513+
.Case("SPARC-T4", "niagara4")
1514+
.Case("SPARC-T5", "niagara4")
1515+
// niagara7/m8 not supported by LLVM yet.
1516+
.Case("SPARC-M7", "niagara4" /* "niagara7" */)
1517+
.Case("SPARC-S7", "niagara4" /* "niagara7" */)
1518+
.Case("SPARC-M8", "niagara4" /* "m8" */)
1519+
.Default("generic");
1520+
#else
1521+
return "generic";
1522+
#endif
1523+
}
14161524
#else
14171525
StringRef sys::getHostCPUName() { return "generic"; }
14181526
namespace llvm {

0 commit comments

Comments
 (0)