From 318ed901448203284a103b488a37cd92fbc82447 Mon Sep 17 00:00:00 2001 From: David Tenty Date: Tue, 9 Feb 2021 15:56:47 -0500 Subject: [PATCH] [AIX][llvm][support] Implement getHostCPUName We implement getHostCPUName() for AIX via systemcfg interfaces since access to the processor version register is a privileged operation. We return a value based on the current processor implementation mode. This fixes the cpu detection used by clang for `-mcpu=native`. Reviewed By: hubert.reinterpretcast Differential Revision: https://reviews.llvm.org/D95966 --- llvm/lib/Support/Host.cpp | 35 +++++++++++++++++++++++++++++++++ llvm/unittests/Support/Host.cpp | 29 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp index a1bd3cc12f1d..d89518b74704 100644 --- a/llvm/lib/Support/Host.cpp +++ b/llvm/lib/Support/Host.cpp @@ -43,6 +43,9 @@ #include #include #endif +#ifdef _AIX +#include +#endif #define DEBUG_TYPE "host-detection" @@ -1217,6 +1220,38 @@ StringRef sys::getHostCPUName() { return "generic"; } +#elif defined(_AIX) +StringRef sys::getHostCPUName() { + switch (_system_configuration.implementation) { + case POWER_4: + if (_system_configuration.version == PV_4_3) + return "970"; + return "pwr4"; + case POWER_5: + if (_system_configuration.version == PV_5) + return "pwr5"; + return "pwr5x"; + case POWER_6: + if (_system_configuration.version == PV_6_Compat) + return "pwr6"; + return "pwr6x"; + case POWER_7: + return "pwr7"; + case POWER_8: + return "pwr8"; + case POWER_9: + return "pwr9"; +// TODO: simplify this once the macro is available in all OS levels. +#ifdef POWER_10 + case POWER_10: +#else + case 0x40000: +#endif + return "pwr10"; + default: + return "generic"; + } +} #else StringRef sys::getHostCPUName() { return "generic"; } #endif diff --git a/llvm/unittests/Support/Host.cpp b/llvm/unittests/Support/Host.cpp index c85fd996643b..5911f8065fe6 100644 --- a/llvm/unittests/Support/Host.cpp +++ b/llvm/unittests/Support/Host.cpp @@ -431,4 +431,33 @@ TEST_F(HostTest, AIXVersionDetect) { ASSERT_EQ(std::tie(SystemMajor, SystemMinor), std::tie(TargetMajor, TargetMinor)); } + +TEST_F(HostTest, AIXHostCPUDetect) { + // Return a value based on the current processor implementation mode. + const char *ExePath = "/usr/sbin/getsystype"; + StringRef argv[] = {ExePath, "-i"}; + std::unique_ptr Buffer; + off_t Size; + ASSERT_EQ(runAndGetCommandOutput(ExePath, argv, Buffer, Size), true); + StringRef CPU(Buffer.get(), Size); + StringRef MCPU = StringSwitch(CPU) + .Case("POWER 4\n", "pwr4") + .Case("POWER 5\n", "pwr5") + .Case("POWER 6\n", "pwr6") + .Case("POWER 7\n", "pwr7") + .Case("POWER 8\n", "pwr8") + .Case("POWER 9\n", "pwr9") + .Case("POWER 10\n", "pwr10") + .Default("unknown"); + + StringRef HostCPU = sys::getHostCPUName(); + + // Just do the comparison on the base implementation mode. + if (HostCPU == "970") + HostCPU = StringRef("pwr4"); + else + HostCPU = HostCPU.rtrim('x'); + + EXPECT_EQ(HostCPU, MCPU); +} #endif