633 lines · cpp
1//========- unittests/Support/Host.cpp - Host.cpp tests --------------========//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/TargetParser/Host.h"10#include "llvm/ADT/SmallVector.h"11#include "llvm/Config/config.h"12#include "llvm/Support/FileSystem.h"13#include "llvm/Support/Path.h"14#include "llvm/Support/Program.h"15#include "llvm/Support/Threading.h"16#include "llvm/TargetParser/Triple.h"17 18#include "gtest/gtest.h"19 20#define ASSERT_NO_ERROR(x) \21 if (std::error_code ASSERT_NO_ERROR_ec = x) { \22 SmallString<128> MessageStorage; \23 raw_svector_ostream Message(MessageStorage); \24 Message << #x ": did not return errc::success.\n" \25 << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \26 << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \27 GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \28 } else { \29 }30 31using namespace llvm;32 33TEST(getLinuxHostCPUName, ARM) {34 StringRef CortexA9ProcCpuinfo = R"(35processor : 036model name : ARMv7 Processor rev 10 (v7l)37BogoMIPS : 1393.6638Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd3239CPU implementer : 0x4140CPU architecture: 741CPU variant : 0x242CPU part : 0xc0943CPU revision : 1044 45processor : 146model name : ARMv7 Processor rev 10 (v7l)47BogoMIPS : 1393.6648Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd3249CPU implementer : 0x4150CPU architecture: 751CPU variant : 0x252CPU part : 0xc0953CPU revision : 1054 55Hardware : Generic OMAP4 (Flattened Device Tree)56Revision : 000057Serial : 000000000000000058)";59 60 EXPECT_EQ(sys::detail::getHostCPUNameForARM(CortexA9ProcCpuinfo),61 "cortex-a9");62 EXPECT_EQ(sys::detail::getHostCPUNameForARM(63 0x4100c090, ArrayRef<uint64_t>{0x4100c090, 0x4100c090}),64 "cortex-a9");65 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"66 "CPU part : 0xc0f"),67 "cortex-a15");68 EXPECT_EQ(sys::detail::getHostCPUNameForARM(0x4100c0f0,69 ArrayRef<uint64_t>{0x4100c0f0}),70 "cortex-a15");71 // Verify that both CPU implementer and CPU part are checked:72 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x40\n"73 "CPU part : 0xc0f"),74 "generic");75 EXPECT_EQ(sys::detail::getHostCPUNameForARM(0x4000c0f0,76 ArrayRef<uint64_t>{0x4000c0f0}),77 "generic");78 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"79 "CPU part : 0x06f"),80 "krait");81 EXPECT_EQ(sys::detail::getHostCPUNameForARM(0x510006f0,82 ArrayRef<uint64_t>{0x510006f0}),83 "krait");84}85 86TEST(getLinuxHostCPUName, AArch64) {87 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"88 "CPU part : 0xd8f"),89 "cortex-a320");90 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"91 "CPU part : 0xd03"),92 "cortex-a53");93 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"94 "CPU part : 0xd05"),95 "cortex-a55");96 97 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"98 "CPU part : 0xd40"),99 "neoverse-v1");100 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"101 "CPU part : 0xd4f"),102 "neoverse-v2");103 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"104 "CPU part : 0xd84"),105 "neoverse-v3");106 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"107 "CPU part : 0xd0c"),108 "neoverse-n1");109 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"110 "CPU part : 0xd49"),111 "neoverse-n2");112 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"113 "CPU part : 0xd8e"),114 "neoverse-n3");115 // Verify that both CPU implementer and CPU part are checked:116 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x40\n"117 "CPU part : 0xd03"),118 "generic");119 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"120 "CPU part : 0x201"),121 "kryo");122 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"123 "CPU part : 0x800"),124 "cortex-a73");125 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"126 "CPU part : 0x801"),127 "cortex-a73");128 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"129 "CPU part : 0xd46"),130 "cortex-a510");131 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"132 "CPU part : 0xd47"),133 "cortex-a710");134 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"135 "CPU part : 0xd48"),136 "cortex-x2");137 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"138 "CPU part : 0xd85\n"139 "CPU part : 0xd87"),140 "cortex-x925");141 EXPECT_EQ(sys::detail::getHostCPUNameForARM(142 0x4100d850, ArrayRef<uint64_t>{0x4100d850, 0x4100d870}),143 "cortex-x925");144 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n"145 "CPU part : 0xd87\n"146 "CPU part : 0xd85"),147 "cortex-x925");148 EXPECT_EQ(sys::detail::getHostCPUNameForARM(149 0x4100d870, ArrayRef<uint64_t>{0x4100d870, 0x4100d850}),150 "cortex-x925");151 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"152 "CPU part : 0xc00"),153 "falkor");154 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"155 "CPU part : 0xc01"),156 "saphira");157 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x6d\n"158 "CPU part : 0xd49"),159 "neoverse-n2");160 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0xc0\n"161 "CPU part : 0xac3"),162 "ampere1");163 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0xc0\n"164 "CPU part : 0xac4"),165 "ampere1a");166 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0xc0\n"167 "CPU part : 0xac5"),168 "ampere1b");169 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n"170 "CPU part : 0x001"),171 "oryon-1");172 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x46\n"173 "CPU part : 0x003"),174 "fujitsu-monaka");175 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x61\n"176 "CPU part : 0x039"),177 "apple-m2");178 179 // MSM8992/4 weirdness180 StringRef MSM8992ProcCpuInfo = R"(181Processor : AArch64 Processor rev 3 (aarch64)182processor : 0183processor : 1184processor : 2185processor : 3186processor : 4187processor : 5188Features : fp asimd evtstrm aes pmull sha1 sha2 crc32189CPU implementer : 0x41190CPU architecture: 8191CPU variant : 0x0192CPU part : 0xd03193CPU revision : 3194 195Hardware : Qualcomm Technologies, Inc MSM8992196)";197 198 EXPECT_EQ(sys::detail::getHostCPUNameForARM(MSM8992ProcCpuInfo),199 "cortex-a53");200 201 // Exynos big.LITTLE weirdness202 const std::string ExynosProcCpuInfo = R"(203processor : 0204Features : fp asimd evtstrm aes pmull sha1 sha2 crc32205CPU implementer : 0x41206CPU architecture: 8207CPU variant : 0x0208CPU part : 0xd05209 210processor : 1211Features : fp asimd evtstrm aes pmull sha1 sha2 crc32212CPU implementer : 0x53213CPU architecture: 8214)";215 216 // Verify default for Exynos.217 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ExynosProcCpuInfo +218 "CPU variant : 0xc\n"219 "CPU part : 0xafe"),220 "exynos-m3");221 EXPECT_EQ(sys::detail::getHostCPUNameForARM(222 0x53c0afe0, ArrayRef<uint64_t>{0x53c0afe0, 0x5300d050}),223 "exynos-m3");224 // Verify Exynos M3.225 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ExynosProcCpuInfo +226 "CPU variant : 0x1\n"227 "CPU part : 0x002"),228 "exynos-m3");229 EXPECT_EQ(sys::detail::getHostCPUNameForARM(230 0x53100020, ArrayRef<uint64_t>{0x53100020, 0x5300d050}),231 "exynos-m3");232 // Verify Exynos M4.233 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ExynosProcCpuInfo +234 "CPU variant : 0x1\n"235 "CPU part : 0x003"),236 "exynos-m4");237 EXPECT_EQ(sys::detail::getHostCPUNameForARM(238 0x53100030, ArrayRef<uint64_t>{0x53100030, 0x5300d050}),239 "exynos-m4");240 241 const std::string ThunderX2T99ProcCpuInfo = R"(242processor : 0243BogoMIPS : 400.00244Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics245CPU implementer : 0x43246CPU architecture: 8247CPU variant : 0x1248CPU part : 0x0af249)";250 251 // Verify different versions of ThunderX2T99.252 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +253 "CPU implementer : 0x42\n"254 "CPU part : 0x516"),255 "thunderx2t99");256 257 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +258 "CPU implementer : 0x42\n"259 "CPU part : 0x0516"),260 "thunderx2t99");261 262 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +263 "CPU implementer : 0x43\n"264 "CPU part : 0x516"),265 "thunderx2t99");266 267 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +268 "CPU implementer : 0x43\n"269 "CPU part : 0x0516"),270 "thunderx2t99");271 272 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +273 "CPU implementer : 0x42\n"274 "CPU part : 0xaf"),275 "thunderx2t99");276 277 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +278 "CPU implementer : 0x42\n"279 "CPU part : 0x0af"),280 "thunderx2t99");281 282 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +283 "CPU implementer : 0x43\n"284 "CPU part : 0xaf"),285 "thunderx2t99");286 287 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo +288 "CPU implementer : 0x43\n"289 "CPU part : 0x0af"),290 "thunderx2t99");291 292 // Verify ThunderXT88.293 const std::string ThunderXT88ProcCpuInfo = R"(294processor : 0295BogoMIPS : 200.00296Features : fp asimd evtstrm aes pmull sha1 sha2 crc32297CPU implementer : 0x43298CPU architecture: 8299CPU variant : 0x1300CPU part : 0x0a1301)";302 303 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderXT88ProcCpuInfo +304 "CPU implementer : 0x43\n"305 "CPU part : 0x0a1"),306 "thunderxt88");307 308 EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderXT88ProcCpuInfo +309 "CPU implementer : 0x43\n"310 "CPU part : 0xa1"),311 "thunderxt88");312 313 // Verify HiSilicon processors.314 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x48\n"315 "CPU part : 0xd01"),316 "tsv110");317 318 // Verify A64FX.319 const std::string A64FXProcCpuInfo = R"(320processor : 0321BogoMIPS : 200.00322Features : fp asimd evtstrm sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm fcma dcpop sve323CPU implementer : 0x46324CPU architecture: 8325CPU variant : 0x1326CPU part : 0x001327)";328 329 EXPECT_EQ(sys::detail::getHostCPUNameForARM(A64FXProcCpuInfo), "a64fx");330 331 // Verify Nvidia Carmel.332 const std::string CarmelProcCpuInfo = R"(333processor : 0334model name : ARMv8 Processor rev 0 (v8l)335BogoMIPS : 62.50336Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm dcpop337CPU implementer : 0x4e338CPU architecture: 8339CPU variant : 0x0340CPU part : 0x004341CPU revision : 0342)";343 344 EXPECT_EQ(sys::detail::getHostCPUNameForARM(CarmelProcCpuInfo), "carmel");345 346 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x4e\n"347 "CPU part : 0x10"),348 "olympus");349 350 EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x4e\n"351 "CPU part : 0x010"),352 "olympus");353 354 // Snapdragon mixed implementer quirk355 const std::string Snapdragon865ProcCPUInfo = R"(356processor : 0357BogoMIPS : 38.40358Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp359CPU implementer : 0x51360CPU architecture: 8361CPU variant : 0xd362CPU part : 0x805363CPU revision : 14364processor : 1365processor : 2366processor : 3367processor : 4368processor : 5369processor : 6370BogoMIPS : 38.40371Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp372CPU implementer : 0x41373CPU architecture: 8374CPU variant : 0x1375CPU part : 0xd0d376CPU revision : 0377)";378 EXPECT_EQ(sys::detail::getHostCPUNameForARM(Snapdragon865ProcCPUInfo), "cortex-a77");379}380 381TEST(getLinuxHostCPUName, s390x) {382 SmallVector<std::string> ModelIDs(383 {"9175", "3931", "8561", "3906", "2964", "2827", "2817", "2097", "2064"});384 SmallVector<std::string> VectorSupport({"", "vx"});385 SmallVector<StringRef> ExpectedCPUs;386 387 // Model Id: 9175388 ExpectedCPUs.push_back("zEC12");389 ExpectedCPUs.push_back("z17");390 391 // Model Id: 3931392 ExpectedCPUs.push_back("zEC12");393 ExpectedCPUs.push_back("z16");394 395 // Model Id: 8561396 ExpectedCPUs.push_back("zEC12");397 ExpectedCPUs.push_back("z15");398 399 // Model Id: 3906400 ExpectedCPUs.push_back("zEC12");401 ExpectedCPUs.push_back("z14");402 403 // Model Id: 2964404 ExpectedCPUs.push_back("zEC12");405 ExpectedCPUs.push_back("z13");406 407 // Model Id: 2827408 ExpectedCPUs.push_back("zEC12");409 ExpectedCPUs.push_back("zEC12");410 411 // Model Id: 2817412 ExpectedCPUs.push_back("z196");413 ExpectedCPUs.push_back("z196");414 415 // Model Id: 2097416 ExpectedCPUs.push_back("z10");417 ExpectedCPUs.push_back("z10");418 419 // Model Id: 2064420 ExpectedCPUs.push_back("generic");421 ExpectedCPUs.push_back("generic");422 423 const std::string DummyBaseVectorInfo =424 "features : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs "425 "te ";426 const std::string DummyBaseMachineInfo =427 "processor 0: version = FF, identification = 059C88, machine = ";428 429 int CheckIndex = 0;430 for (size_t I = 0; I < ModelIDs.size(); I++) {431 for (size_t J = 0; J < VectorSupport.size(); J++) {432 const std::string DummyCPUInfo = DummyBaseVectorInfo + VectorSupport[J] +433 "\n" + DummyBaseMachineInfo +434 ModelIDs[I];435 EXPECT_EQ(sys::detail::getHostCPUNameForS390x(DummyCPUInfo),436 ExpectedCPUs[CheckIndex++]);437 }438 }439}440 441TEST(getLinuxHostCPUName, RISCV) {442 const StringRef SifiveU74MCProcCPUInfo = R"(443processor : 0444hart : 2445isa : rv64imafdc446mmu : sv39447uarch : sifive,u74-mc448)";449 EXPECT_EQ(sys::detail::getHostCPUNameForRISCV(SifiveU74MCProcCPUInfo),450 "sifive-u74");451 EXPECT_EQ(452 sys::detail::getHostCPUNameForRISCV("uarch : sifive,bullet0\n"),453 "sifive-u74");454 455 const StringRef SifiveP550MCProcCPUInfo = R"(456processor : 0457hart : 2458isa : rv64imafdch_zicsr_zifencei_zba_zbb_sscofpmf459mmu : sv48460uarch : eswin,eic770x461)";462 EXPECT_EQ(sys::detail::getHostCPUNameForRISCV(SifiveP550MCProcCPUInfo),463 "sifive-p550");464 EXPECT_EQ(465 sys::detail::getHostCPUNameForRISCV("uarch : eswin,eic770x\n"),466 "sifive-p550");467}468 469static bool runAndGetCommandOutput(470 const char *ExePath, ArrayRef<llvm::StringRef> argv,471 std::unique_ptr<char[]> &Buffer, off_t &Size) {472 bool Success = false;473 [ExePath, argv, &Buffer, &Size, &Success] {474 using namespace llvm::sys;475 SmallString<128> TestDirectory;476 ASSERT_NO_ERROR(fs::createUniqueDirectory("host_test", TestDirectory));477 478 SmallString<128> OutputFile(TestDirectory);479 path::append(OutputFile, "out");480 StringRef OutputPath = OutputFile.str();481 482 const std::optional<StringRef> Redirects[] = {483 /*STDIN=*/std::nullopt, /*STDOUT=*/OutputPath, /*STDERR=*/std::nullopt};484 int RetCode =485 ExecuteAndWait(ExePath, argv, /*env=*/std::nullopt, Redirects);486 ASSERT_EQ(0, RetCode);487 488 int FD = 0;489 ASSERT_NO_ERROR(fs::openFileForRead(OutputPath, FD));490 Size = ::lseek(FD, 0, SEEK_END);491 ASSERT_NE(-1, Size);492 ::lseek(FD, 0, SEEK_SET);493 Buffer = std::make_unique<char[]>(Size);494 ASSERT_EQ(::read(FD, Buffer.get(), Size), Size);495 ::close(FD);496 497 ASSERT_NO_ERROR(fs::remove(OutputPath));498 ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));499 Success = true;500 }();501 return Success;502}503 504TEST(HostTest, DummyRunAndGetCommandOutputUse) {505 // Suppress defined-but-not-used warnings when the tests using the helper are506 // disabled.507 (void)&runAndGetCommandOutput;508}509 510TEST(HostTest, getMacOSHostVersion) {511 llvm::Triple HostTriple(llvm::sys::getProcessTriple());512 if (!HostTriple.isMacOSX())513 GTEST_SKIP();514 515 const char *SwVersPath = "/usr/bin/sw_vers";516 StringRef argv[] = {SwVersPath, "-productVersion"};517 std::unique_ptr<char[]> Buffer;518 off_t Size;519 ASSERT_EQ(runAndGetCommandOutput(SwVersPath, argv, Buffer, Size), true);520 StringRef SystemVersionStr = StringRef(Buffer.get(), Size).rtrim();521 522 // Ensure that the two versions match.523 VersionTuple SystemVersion;524 ASSERT_EQ(llvm::Triple((Twine("x86_64-apple-macos") + SystemVersionStr))525 .getMacOSXVersion(SystemVersion),526 true);527 VersionTuple HostVersion;528 ASSERT_EQ(HostTriple.getMacOSXVersion(HostVersion), true);529 530 if (SystemVersion.getMajor() > 10) {531 // Don't compare the 'Minor' and 'Micro' versions, as they're always '0' for532 // the 'Darwin' triples on 11.x.533 ASSERT_EQ(SystemVersion.getMajor(), HostVersion.getMajor());534 } else {535 // Don't compare the 'Micro' version, as it's always '0' for the 'Darwin'536 // triples.537 ASSERT_EQ(SystemVersion.getMajor(), HostVersion.getMajor());538 ASSERT_EQ(SystemVersion.getMinor(), HostVersion.getMinor());539 }540}541 542// Helper to return AIX system version. Must return void to use ASSERT_*.543static void getAIXSystemVersion(VersionTuple &SystemVersion) {544 const char *ExePath = "/usr/bin/oslevel";545 StringRef argv[] = {ExePath};546 std::unique_ptr<char[]> Buffer;547 off_t Size;548 ASSERT_EQ(runAndGetCommandOutput(ExePath, argv, Buffer, Size), true);549 StringRef SystemVersionStr = StringRef(Buffer.get(), Size).rtrim();550 551 SystemVersion =552 llvm::Triple((Twine("powerpc-ibm-aix") + SystemVersionStr))553 .getOSVersion();554}555 556TEST(HostTest, AIXHostVersionDetect) {557 llvm::Triple HostTriple(llvm::sys::getProcessTriple());558 if (HostTriple.getOS() != Triple::AIX)559 GTEST_SKIP();560 561 llvm::Triple ConfiguredHostTriple(LLVM_HOST_TRIPLE);562 ASSERT_EQ(ConfiguredHostTriple.getOS(), Triple::AIX);563 564 VersionTuple SystemVersion;565 getAIXSystemVersion(SystemVersion);566 567 // Ensure that the host triple version (major) and release (minor) numbers,568 // unless explicitly configured, match with those of the current system.569 auto SysMajor = SystemVersion.getMajor();570 auto SysMinor = SystemVersion.getMinor();571 VersionTuple HostVersion = HostTriple.getOSVersion();572 if (ConfiguredHostTriple.getOSMajorVersion()) {573 // Explicitly configured, force a match. We do it this way so the574 // asserts are always executed.575 SysMajor = HostVersion.getMajor();576 SysMinor = HostVersion.getMinor();577 }578 ASSERT_EQ(SysMajor, HostVersion.getMajor());579 ASSERT_EQ(SysMinor, HostVersion.getMinor());580}581 582TEST(HostTest, AIXTargetVersionDetect) {583 llvm::Triple TargetTriple(llvm::sys::getDefaultTargetTriple());584 if (TargetTriple.getOS() != Triple::AIX)585 GTEST_SKIP();586 587 // Ensure that the target triple version (major) and release (minor) numbers588 // match with those of the current system.589 llvm::Triple ConfiguredTargetTriple(LLVM_DEFAULT_TARGET_TRIPLE);590 if (ConfiguredTargetTriple.getOSMajorVersion())591 GTEST_SKIP(); // The version was configured explicitly; skip.592 593 VersionTuple SystemVersion;594 getAIXSystemVersion(SystemVersion);595 VersionTuple TargetVersion = TargetTriple.getOSVersion();596 ASSERT_EQ(SystemVersion.getMajor(), TargetVersion.getMajor());597 ASSERT_EQ(SystemVersion.getMinor(), TargetVersion.getMinor());598}599 600TEST(HostTest, AIXHostCPUDetect) {601 llvm::Triple HostTriple(llvm::sys::getProcessTriple());602 if (HostTriple.getOS() != Triple::AIX)603 GTEST_SKIP();604 605 // Return a value based on the current processor implementation mode.606 const char *ExePath = "/usr/sbin/getsystype";607 StringRef argv[] = {ExePath, "-i"};608 std::unique_ptr<char[]> Buffer;609 off_t Size;610 ASSERT_EQ(runAndGetCommandOutput(ExePath, argv, Buffer, Size), true);611 StringRef CPU(Buffer.get(), Size);612 StringRef MCPU = StringSwitch<const char *>(CPU)613 .Case("POWER 4\n", "pwr4")614 .Case("POWER 5\n", "pwr5")615 .Case("POWER 6\n", "pwr6")616 .Case("POWER 7\n", "pwr7")617 .Case("POWER 8\n", "pwr8")618 .Case("POWER 9\n", "pwr9")619 .Case("POWER 10\n", "pwr10")620 .Case("POWER 11\n", "pwr11")621 .Default("unknown");622 623 StringRef HostCPU = sys::getHostCPUName();624 625 // Just do the comparison on the base implementation mode.626 if (HostCPU == "970")627 HostCPU = StringRef("pwr4");628 else629 HostCPU = HostCPU.rtrim('x');630 631 EXPECT_EQ(HostCPU, MCPU);632}633