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 @@ -43,6 +43,9 @@ #include #include #endif +#ifdef _AIX +#include +#endif #define DEBUG_TYPE "host-detection" @@ -1217,6 +1220,38 @@ return "generic"; } +#elif defined(_AIX) +namespace { +enum PowerCPUImpl { + POWER4 = POWER_4, + POWER5 = POWER_5, + POWER6 = POWER_6, + POWER7 = POWER_7, + POWER8 = POWER_8, + POWER9 = POWER_9, + POWER10 = 0x40000 +}; +} +StringRef sys::getHostCPUName() { + switch (_system_configuration.implementation) { + case PowerCPUImpl::POWER4: + return "pwr4"; + case PowerCPUImpl::POWER5: + return "pwr5"; + case PowerCPUImpl::POWER6: + return "pwr6"; + case PowerCPUImpl::POWER7: + return "pwr7"; + case PowerCPUImpl::POWER8: + return "pwr8"; + case PowerCPUImpl::POWER9: + return "pwr9"; + case PowerCPUImpl::POWER10: + 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 --- a/llvm/unittests/Support/Host.cpp +++ b/llvm/unittests/Support/Host.cpp @@ -431,4 +431,25 @@ ASSERT_EQ(std::tie(SystemMajor, SystemMinor), std::tie(TargetMajor, TargetMinor)); } + +TEST_F(HostTest, AIXHostCPUDetect) { + // return a value base 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"); + + EXPECT_EQ(sys::getHostCPUName(), MCPU); +} #endif