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,33 @@ return "generic"; } +#elif defined(_AIX) + +StringRef sys::getHostCPUName() { + switch (_system_configuration.implementation) { + case POWER_4: + return "pwr4"; + case POWER_5: + return "pwr5"; + case POWER_6: + return "pwr6"; + 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 --- 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