|
47 | 47 | #ifdef _AIX |
48 | 48 | #include <sys/systemcfg.h> |
49 | 49 | #endif |
| 50 | +#if defined(__sun__) && defined(__svr4__) |
| 51 | +#include <kstat.h> |
| 52 | +#endif |
50 | 53 |
|
51 | 54 | #define DEBUG_TYPE "host-detection" |
52 | 55 |
|
@@ -1413,6 +1416,111 @@ StringRef sys::getHostCPUName() { |
1413 | 1416 | #endif |
1414 | 1417 | #endif |
1415 | 1418 | } |
| 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 | +} |
1416 | 1524 | #else |
1417 | 1525 | StringRef sys::getHostCPUName() { return "generic"; } |
1418 | 1526 | namespace llvm { |
|
0 commit comments