brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.1 KiB · be8548e Raw
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