diff --git a/llvm/include/llvm/Support/Host.h b/llvm/include/llvm/Support/Host.h --- a/llvm/include/llvm/Support/Host.h +++ b/llvm/include/llvm/Support/Host.h @@ -64,6 +64,7 @@ StringRef getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent); StringRef getHostCPUNameForARM(StringRef ProcCpuinfoContent); StringRef getHostCPUNameForS390x(StringRef ProcCpuinfoContent); + StringRef getHostCPUNameForRISCV(StringRef ProcCpuinfoContent); StringRef getHostCPUNameForBPF(); /// Helper functions to extract CPU details from CPUID on x86. diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp --- a/llvm/lib/Support/Host.cpp +++ b/llvm/lib/Support/Host.cpp @@ -386,6 +386,26 @@ return "generic"; } +StringRef sys::detail::getHostCPUNameForRISCV(StringRef ProcCpuinfoContent) { + // There are 24 lines in /proc/cpuinfo + SmallVector Lines; + ProcCpuinfoContent.split(Lines, "\n"); + + // Look for uarch line to determine cpu name + StringRef UArch; + for (unsigned I = 0, E = Lines.size(); I != E; ++I) { + if (Lines[I].startswith("uarch")) { + UArch = Lines[I].substr(5).ltrim("\t :"); + break; + } + } + + return StringSwitch(UArch) + .Case("sifive,u74-mc", "sifive-u74") + .Case("sifive,bullet0", "sifive-u74") + .Default("generic"); +} + StringRef sys::detail::getHostCPUNameForBPF() { #if !defined(__linux__) || !defined(__x86_64__) return "generic"; @@ -1379,6 +1399,11 @@ } #elif defined(__riscv) StringRef sys::getHostCPUName() { +#if defined(__linux__) + std::unique_ptr P = getProcCpuinfoContent(); + StringRef Content = P ? P->getBuffer() : ""; + return detail::getHostCPUNameForRISCV(Content); +#else #if __riscv_xlen == 64 return "generic-rv64"; #elif __riscv_xlen == 32 @@ -1386,6 +1411,7 @@ #else #error "Unhandled value of __riscv_xlen" #endif +#endif } #else StringRef sys::getHostCPUName() { return "generic"; } diff --git a/llvm/unittests/Support/Host.cpp b/llvm/unittests/Support/Host.cpp --- a/llvm/unittests/Support/Host.cpp +++ b/llvm/unittests/Support/Host.cpp @@ -378,6 +378,21 @@ } } +TEST(getLinuxHostCPUName, RISCV) { + const StringRef SifiveU74MCProcCPUInfo = R"( +processor : 0 +hart : 2 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,u74-mc +)"; + EXPECT_EQ(sys::detail::getHostCPUNameForRISCV(SifiveU74MCProcCPUInfo), + "sifive-u74"); + EXPECT_EQ( + sys::detail::getHostCPUNameForRISCV("uarch : sifive,bullet0\n"), + "sifive-u74"); +} + static bool runAndGetCommandOutput( const char *ExePath, ArrayRef argv, std::unique_ptr &Buffer, off_t &Size) {