1f09cf34dSArchibald Elliott //========- unittests/Support/Host.cpp - Host.cpp tests --------------========// 2f09cf34dSArchibald Elliott // 3f09cf34dSArchibald Elliott // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f09cf34dSArchibald Elliott // See https://llvm.org/LICENSE.txt for license information. 5f09cf34dSArchibald Elliott // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f09cf34dSArchibald Elliott // 7f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===// 8f09cf34dSArchibald Elliott 9f09cf34dSArchibald Elliott #include "llvm/TargetParser/Host.h" 10f09cf34dSArchibald Elliott #include "llvm/ADT/SmallVector.h" 11f09cf34dSArchibald Elliott #include "llvm/Config/config.h" 12f09cf34dSArchibald Elliott #include "llvm/Support/FileSystem.h" 13f09cf34dSArchibald Elliott #include "llvm/Support/Path.h" 14f09cf34dSArchibald Elliott #include "llvm/Support/Program.h" 15f09cf34dSArchibald Elliott #include "llvm/Support/Threading.h" 16f09cf34dSArchibald Elliott #include "llvm/TargetParser/Triple.h" 17f09cf34dSArchibald Elliott 18f09cf34dSArchibald Elliott #include "gtest/gtest.h" 19f09cf34dSArchibald Elliott 20f09cf34dSArchibald Elliott #define ASSERT_NO_ERROR(x) \ 21f09cf34dSArchibald Elliott if (std::error_code ASSERT_NO_ERROR_ec = x) { \ 22f09cf34dSArchibald Elliott SmallString<128> MessageStorage; \ 23f09cf34dSArchibald Elliott raw_svector_ostream Message(MessageStorage); \ 24f09cf34dSArchibald Elliott Message << #x ": did not return errc::success.\n" \ 25f09cf34dSArchibald Elliott << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ 26f09cf34dSArchibald Elliott << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ 27f09cf34dSArchibald Elliott GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ 28f09cf34dSArchibald Elliott } else { \ 29f09cf34dSArchibald Elliott } 30f09cf34dSArchibald Elliott 31f09cf34dSArchibald Elliott using namespace llvm; 32f09cf34dSArchibald Elliott 33f09cf34dSArchibald Elliott TEST(getLinuxHostCPUName, ARM) { 34f09cf34dSArchibald Elliott StringRef CortexA9ProcCpuinfo = R"( 35f09cf34dSArchibald Elliott processor : 0 36f09cf34dSArchibald Elliott model name : ARMv7 Processor rev 10 (v7l) 37f09cf34dSArchibald Elliott BogoMIPS : 1393.66 38f09cf34dSArchibald Elliott Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 39f09cf34dSArchibald Elliott CPU implementer : 0x41 40f09cf34dSArchibald Elliott CPU architecture: 7 41f09cf34dSArchibald Elliott CPU variant : 0x2 42f09cf34dSArchibald Elliott CPU part : 0xc09 43f09cf34dSArchibald Elliott CPU revision : 10 44f09cf34dSArchibald Elliott 45f09cf34dSArchibald Elliott processor : 1 46f09cf34dSArchibald Elliott model name : ARMv7 Processor rev 10 (v7l) 47f09cf34dSArchibald Elliott BogoMIPS : 1393.66 48f09cf34dSArchibald Elliott Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 49f09cf34dSArchibald Elliott CPU implementer : 0x41 50f09cf34dSArchibald Elliott CPU architecture: 7 51f09cf34dSArchibald Elliott CPU variant : 0x2 52f09cf34dSArchibald Elliott CPU part : 0xc09 53f09cf34dSArchibald Elliott CPU revision : 10 54f09cf34dSArchibald Elliott 55f09cf34dSArchibald Elliott Hardware : Generic OMAP4 (Flattened Device Tree) 56f09cf34dSArchibald Elliott Revision : 0000 57f09cf34dSArchibald Elliott Serial : 0000000000000000 58f09cf34dSArchibald Elliott )"; 59f09cf34dSArchibald Elliott 60f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(CortexA9ProcCpuinfo), 61f09cf34dSArchibald Elliott "cortex-a9"); 62f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 63f09cf34dSArchibald Elliott "CPU part : 0xc0f"), 64f09cf34dSArchibald Elliott "cortex-a15"); 65f09cf34dSArchibald Elliott // Verify that both CPU implementer and CPU part are checked: 66f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x40\n" 67f09cf34dSArchibald Elliott "CPU part : 0xc0f"), 68f09cf34dSArchibald Elliott "generic"); 69f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 70f09cf34dSArchibald Elliott "CPU part : 0x06f"), 71f09cf34dSArchibald Elliott "krait"); 72f09cf34dSArchibald Elliott } 73f09cf34dSArchibald Elliott 74f09cf34dSArchibald Elliott TEST(getLinuxHostCPUName, AArch64) { 75f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 76f09cf34dSArchibald Elliott "CPU part : 0xd03"), 77f09cf34dSArchibald Elliott "cortex-a53"); 78f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 79f09cf34dSArchibald Elliott "CPU part : 0xd05"), 80f09cf34dSArchibald Elliott "cortex-a55"); 81f09cf34dSArchibald Elliott 82f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 83f09cf34dSArchibald Elliott "CPU part : 0xd40"), 84f09cf34dSArchibald Elliott "neoverse-v1"); 85f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 86c2c425fcSFranklin "CPU part : 0xd4f"), 87c2c425fcSFranklin "neoverse-v2"); 88c2c425fcSFranklin EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 89c2c425fcSFranklin "CPU part : 0xd84"), 90c2c425fcSFranklin "neoverse-v3"); 91c2c425fcSFranklin EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 92f09cf34dSArchibald Elliott "CPU part : 0xd0c"), 93f09cf34dSArchibald Elliott "neoverse-n1"); 94c2c425fcSFranklin EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 95c2c425fcSFranklin "CPU part : 0xd49"), 96c2c425fcSFranklin "neoverse-n2"); 97c2c425fcSFranklin EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 98c2c425fcSFranklin "CPU part : 0xd8e"), 99c2c425fcSFranklin "neoverse-n3"); 100f09cf34dSArchibald Elliott // Verify that both CPU implementer and CPU part are checked: 101f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x40\n" 102f09cf34dSArchibald Elliott "CPU part : 0xd03"), 103f09cf34dSArchibald Elliott "generic"); 104f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 105f09cf34dSArchibald Elliott "CPU part : 0x201"), 106f09cf34dSArchibald Elliott "kryo"); 107f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 108f09cf34dSArchibald Elliott "CPU part : 0x800"), 109f09cf34dSArchibald Elliott "cortex-a73"); 110f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 111f09cf34dSArchibald Elliott "CPU part : 0x801"), 112f09cf34dSArchibald Elliott "cortex-a73"); 113f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 114f09cf34dSArchibald Elliott "CPU part : 0xd46"), 115f09cf34dSArchibald Elliott "cortex-a510"); 116f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 117f09cf34dSArchibald Elliott "CPU part : 0xd47"), 118f09cf34dSArchibald Elliott "cortex-a710"); 119f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x41\n" 120f09cf34dSArchibald Elliott "CPU part : 0xd48"), 121f09cf34dSArchibald Elliott "cortex-x2"); 122f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 123f09cf34dSArchibald Elliott "CPU part : 0xc00"), 124f09cf34dSArchibald Elliott "falkor"); 125f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 126f09cf34dSArchibald Elliott "CPU part : 0xc01"), 127f09cf34dSArchibald Elliott "saphira"); 128a690e867SAlexandros Lamprineas EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x6d\n" 129a690e867SAlexandros Lamprineas "CPU part : 0xd49"), 130a690e867SAlexandros Lamprineas "neoverse-n2"); 131f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0xc0\n" 132f09cf34dSArchibald Elliott "CPU part : 0xac3"), 133f09cf34dSArchibald Elliott "ampere1"); 134fb0af891SPhilipp Tomsich EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0xc0\n" 135fb0af891SPhilipp Tomsich "CPU part : 0xac4"), 136fb0af891SPhilipp Tomsich "ampere1a"); 137fbba818aSPhilipp Tomsich EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0xc0\n" 138fbba818aSPhilipp Tomsich "CPU part : 0xac5"), 139fbba818aSPhilipp Tomsich "ampere1b"); 1406b9753a0SWei Zhao EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x51\n" 1416b9753a0SWei Zhao "CPU part : 0x001"), 1426b9753a0SWei Zhao "oryon-1"); 143a1197a2cSKinoshita Kotaro EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x46\n" 144a1197a2cSKinoshita Kotaro "CPU part : 0x003"), 145a1197a2cSKinoshita Kotaro "fujitsu-monaka"); 14638eaea73Spcc EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x61\n" 14738eaea73Spcc "CPU part : 0x039"), 14838eaea73Spcc "apple-m2"); 149f09cf34dSArchibald Elliott 150f09cf34dSArchibald Elliott // MSM8992/4 weirdness 151f09cf34dSArchibald Elliott StringRef MSM8992ProcCpuInfo = R"( 152f09cf34dSArchibald Elliott Processor : AArch64 Processor rev 3 (aarch64) 153f09cf34dSArchibald Elliott processor : 0 154f09cf34dSArchibald Elliott processor : 1 155f09cf34dSArchibald Elliott processor : 2 156f09cf34dSArchibald Elliott processor : 3 157f09cf34dSArchibald Elliott processor : 4 158f09cf34dSArchibald Elliott processor : 5 159f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 160f09cf34dSArchibald Elliott CPU implementer : 0x41 161f09cf34dSArchibald Elliott CPU architecture: 8 162f09cf34dSArchibald Elliott CPU variant : 0x0 163f09cf34dSArchibald Elliott CPU part : 0xd03 164f09cf34dSArchibald Elliott CPU revision : 3 165f09cf34dSArchibald Elliott 166f09cf34dSArchibald Elliott Hardware : Qualcomm Technologies, Inc MSM8992 167f09cf34dSArchibald Elliott )"; 168f09cf34dSArchibald Elliott 169f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(MSM8992ProcCpuInfo), 170f09cf34dSArchibald Elliott "cortex-a53"); 171f09cf34dSArchibald Elliott 172f09cf34dSArchibald Elliott // Exynos big.LITTLE weirdness 173f09cf34dSArchibald Elliott const std::string ExynosProcCpuInfo = R"( 174f09cf34dSArchibald Elliott processor : 0 175f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 176f09cf34dSArchibald Elliott CPU implementer : 0x41 177f09cf34dSArchibald Elliott CPU architecture: 8 178f09cf34dSArchibald Elliott CPU variant : 0x0 179f09cf34dSArchibald Elliott CPU part : 0xd05 180f09cf34dSArchibald Elliott 181f09cf34dSArchibald Elliott processor : 1 182f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 183f09cf34dSArchibald Elliott CPU implementer : 0x53 184f09cf34dSArchibald Elliott CPU architecture: 8 185f09cf34dSArchibald Elliott )"; 186f09cf34dSArchibald Elliott 187f09cf34dSArchibald Elliott // Verify default for Exynos. 188f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ExynosProcCpuInfo + 189f09cf34dSArchibald Elliott "CPU variant : 0xc\n" 190f09cf34dSArchibald Elliott "CPU part : 0xafe"), 191f09cf34dSArchibald Elliott "exynos-m3"); 192f09cf34dSArchibald Elliott // Verify Exynos M3. 193f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ExynosProcCpuInfo + 194f09cf34dSArchibald Elliott "CPU variant : 0x1\n" 195f09cf34dSArchibald Elliott "CPU part : 0x002"), 196f09cf34dSArchibald Elliott "exynos-m3"); 197f09cf34dSArchibald Elliott // Verify Exynos M4. 198f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ExynosProcCpuInfo + 199f09cf34dSArchibald Elliott "CPU variant : 0x1\n" 200f09cf34dSArchibald Elliott "CPU part : 0x003"), 201f09cf34dSArchibald Elliott "exynos-m4"); 202f09cf34dSArchibald Elliott 203f09cf34dSArchibald Elliott const std::string ThunderX2T99ProcCpuInfo = R"( 204f09cf34dSArchibald Elliott processor : 0 205f09cf34dSArchibald Elliott BogoMIPS : 400.00 206f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics 207f09cf34dSArchibald Elliott CPU implementer : 0x43 208f09cf34dSArchibald Elliott CPU architecture: 8 209f09cf34dSArchibald Elliott CPU variant : 0x1 210f09cf34dSArchibald Elliott CPU part : 0x0af 211f09cf34dSArchibald Elliott )"; 212f09cf34dSArchibald Elliott 213f09cf34dSArchibald Elliott // Verify different versions of ThunderX2T99. 214f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 215f09cf34dSArchibald Elliott "CPU implementer : 0x42\n" 216f09cf34dSArchibald Elliott "CPU part : 0x516"), 217f09cf34dSArchibald Elliott "thunderx2t99"); 218f09cf34dSArchibald Elliott 219f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 220f09cf34dSArchibald Elliott "CPU implementer : 0x42\n" 221f09cf34dSArchibald Elliott "CPU part : 0x0516"), 222f09cf34dSArchibald Elliott "thunderx2t99"); 223f09cf34dSArchibald Elliott 224f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 225f09cf34dSArchibald Elliott "CPU implementer : 0x43\n" 226f09cf34dSArchibald Elliott "CPU part : 0x516"), 227f09cf34dSArchibald Elliott "thunderx2t99"); 228f09cf34dSArchibald Elliott 229f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 230f09cf34dSArchibald Elliott "CPU implementer : 0x43\n" 231f09cf34dSArchibald Elliott "CPU part : 0x0516"), 232f09cf34dSArchibald Elliott "thunderx2t99"); 233f09cf34dSArchibald Elliott 234f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 235f09cf34dSArchibald Elliott "CPU implementer : 0x42\n" 236f09cf34dSArchibald Elliott "CPU part : 0xaf"), 237f09cf34dSArchibald Elliott "thunderx2t99"); 238f09cf34dSArchibald Elliott 239f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 240f09cf34dSArchibald Elliott "CPU implementer : 0x42\n" 241f09cf34dSArchibald Elliott "CPU part : 0x0af"), 242f09cf34dSArchibald Elliott "thunderx2t99"); 243f09cf34dSArchibald Elliott 244f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 245f09cf34dSArchibald Elliott "CPU implementer : 0x43\n" 246f09cf34dSArchibald Elliott "CPU part : 0xaf"), 247f09cf34dSArchibald Elliott "thunderx2t99"); 248f09cf34dSArchibald Elliott 249f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + 250f09cf34dSArchibald Elliott "CPU implementer : 0x43\n" 251f09cf34dSArchibald Elliott "CPU part : 0x0af"), 252f09cf34dSArchibald Elliott "thunderx2t99"); 253f09cf34dSArchibald Elliott 254f09cf34dSArchibald Elliott // Verify ThunderXT88. 255f09cf34dSArchibald Elliott const std::string ThunderXT88ProcCpuInfo = R"( 256f09cf34dSArchibald Elliott processor : 0 257f09cf34dSArchibald Elliott BogoMIPS : 200.00 258f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 259f09cf34dSArchibald Elliott CPU implementer : 0x43 260f09cf34dSArchibald Elliott CPU architecture: 8 261f09cf34dSArchibald Elliott CPU variant : 0x1 262f09cf34dSArchibald Elliott CPU part : 0x0a1 263f09cf34dSArchibald Elliott )"; 264f09cf34dSArchibald Elliott 265f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderXT88ProcCpuInfo + 266f09cf34dSArchibald Elliott "CPU implementer : 0x43\n" 267f09cf34dSArchibald Elliott "CPU part : 0x0a1"), 268f09cf34dSArchibald Elliott "thunderxt88"); 269f09cf34dSArchibald Elliott 270f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderXT88ProcCpuInfo + 271f09cf34dSArchibald Elliott "CPU implementer : 0x43\n" 272f09cf34dSArchibald Elliott "CPU part : 0xa1"), 273f09cf34dSArchibald Elliott "thunderxt88"); 274f09cf34dSArchibald Elliott 275f09cf34dSArchibald Elliott // Verify HiSilicon processors. 276f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM("CPU implementer : 0x48\n" 277f09cf34dSArchibald Elliott "CPU part : 0xd01"), 278f09cf34dSArchibald Elliott "tsv110"); 279f09cf34dSArchibald Elliott 280f09cf34dSArchibald Elliott // Verify A64FX. 281f09cf34dSArchibald Elliott const std::string A64FXProcCpuInfo = R"( 282f09cf34dSArchibald Elliott processor : 0 283f09cf34dSArchibald Elliott BogoMIPS : 200.00 284f09cf34dSArchibald Elliott Features : fp asimd evtstrm sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm fcma dcpop sve 285f09cf34dSArchibald Elliott CPU implementer : 0x46 286f09cf34dSArchibald Elliott CPU architecture: 8 287f09cf34dSArchibald Elliott CPU variant : 0x1 288f09cf34dSArchibald Elliott CPU part : 0x001 289f09cf34dSArchibald Elliott )"; 290f09cf34dSArchibald Elliott 291f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(A64FXProcCpuInfo), "a64fx"); 292f09cf34dSArchibald Elliott 293f09cf34dSArchibald Elliott // Verify Nvidia Carmel. 294f09cf34dSArchibald Elliott const std::string CarmelProcCpuInfo = R"( 295f09cf34dSArchibald Elliott processor : 0 296f09cf34dSArchibald Elliott model name : ARMv8 Processor rev 0 (v8l) 297f09cf34dSArchibald Elliott BogoMIPS : 62.50 298f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm dcpop 299f09cf34dSArchibald Elliott CPU implementer : 0x4e 300f09cf34dSArchibald Elliott CPU architecture: 8 301f09cf34dSArchibald Elliott CPU variant : 0x0 302f09cf34dSArchibald Elliott CPU part : 0x004 303f09cf34dSArchibald Elliott CPU revision : 0 304f09cf34dSArchibald Elliott )"; 305f09cf34dSArchibald Elliott 306f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(CarmelProcCpuInfo), "carmel"); 307f09cf34dSArchibald Elliott 308f09cf34dSArchibald Elliott // Snapdragon mixed implementer quirk 309f09cf34dSArchibald Elliott const std::string Snapdragon865ProcCPUInfo = R"( 310f09cf34dSArchibald Elliott processor : 0 311f09cf34dSArchibald Elliott BogoMIPS : 38.40 312f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp 313f09cf34dSArchibald Elliott CPU implementer : 0x51 314f09cf34dSArchibald Elliott CPU architecture: 8 315f09cf34dSArchibald Elliott CPU variant : 0xd 316f09cf34dSArchibald Elliott CPU part : 0x805 317f09cf34dSArchibald Elliott CPU revision : 14 318f09cf34dSArchibald Elliott processor : 1 319f09cf34dSArchibald Elliott processor : 2 320f09cf34dSArchibald Elliott processor : 3 321f09cf34dSArchibald Elliott processor : 4 322f09cf34dSArchibald Elliott processor : 5 323f09cf34dSArchibald Elliott processor : 6 324f09cf34dSArchibald Elliott BogoMIPS : 38.40 325f09cf34dSArchibald Elliott Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp 326f09cf34dSArchibald Elliott CPU implementer : 0x41 327f09cf34dSArchibald Elliott CPU architecture: 8 328f09cf34dSArchibald Elliott CPU variant : 0x1 329f09cf34dSArchibald Elliott CPU part : 0xd0d 330f09cf34dSArchibald Elliott CPU revision : 0 331f09cf34dSArchibald Elliott )"; 332f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForARM(Snapdragon865ProcCPUInfo), "cortex-a77"); 333f09cf34dSArchibald Elliott } 334f09cf34dSArchibald Elliott 335f09cf34dSArchibald Elliott TEST(getLinuxHostCPUName, s390x) { 336f09cf34dSArchibald Elliott SmallVector<std::string> ModelIDs( 337*8424bf20SUlrich Weigand {"9175", "3931", "8561", "3906", "2964", "2827", "2817", "2097", "2064"}); 338f09cf34dSArchibald Elliott SmallVector<std::string> VectorSupport({"", "vx"}); 339f09cf34dSArchibald Elliott SmallVector<StringRef> ExpectedCPUs; 340f09cf34dSArchibald Elliott 341*8424bf20SUlrich Weigand // Model Id: 9175 342*8424bf20SUlrich Weigand ExpectedCPUs.push_back("zEC12"); 343*8424bf20SUlrich Weigand ExpectedCPUs.push_back("arch15"); 344*8424bf20SUlrich Weigand 345f09cf34dSArchibald Elliott // Model Id: 3931 346f09cf34dSArchibald Elliott ExpectedCPUs.push_back("zEC12"); 347f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z16"); 348f09cf34dSArchibald Elliott 349f09cf34dSArchibald Elliott // Model Id: 8561 350f09cf34dSArchibald Elliott ExpectedCPUs.push_back("zEC12"); 351f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z15"); 352f09cf34dSArchibald Elliott 353f09cf34dSArchibald Elliott // Model Id: 3906 354f09cf34dSArchibald Elliott ExpectedCPUs.push_back("zEC12"); 355f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z14"); 356f09cf34dSArchibald Elliott 357f09cf34dSArchibald Elliott // Model Id: 2964 358f09cf34dSArchibald Elliott ExpectedCPUs.push_back("zEC12"); 359f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z13"); 360f09cf34dSArchibald Elliott 361f09cf34dSArchibald Elliott // Model Id: 2827 362f09cf34dSArchibald Elliott ExpectedCPUs.push_back("zEC12"); 363f09cf34dSArchibald Elliott ExpectedCPUs.push_back("zEC12"); 364f09cf34dSArchibald Elliott 365f09cf34dSArchibald Elliott // Model Id: 2817 366f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z196"); 367f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z196"); 368f09cf34dSArchibald Elliott 369f09cf34dSArchibald Elliott // Model Id: 2097 370f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z10"); 371f09cf34dSArchibald Elliott ExpectedCPUs.push_back("z10"); 372f09cf34dSArchibald Elliott 373f09cf34dSArchibald Elliott // Model Id: 2064 374f09cf34dSArchibald Elliott ExpectedCPUs.push_back("generic"); 375f09cf34dSArchibald Elliott ExpectedCPUs.push_back("generic"); 376f09cf34dSArchibald Elliott 377f09cf34dSArchibald Elliott const std::string DummyBaseVectorInfo = 378f09cf34dSArchibald Elliott "features : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs " 379f09cf34dSArchibald Elliott "te "; 380f09cf34dSArchibald Elliott const std::string DummyBaseMachineInfo = 381f09cf34dSArchibald Elliott "processor 0: version = FF, identification = 059C88, machine = "; 382f09cf34dSArchibald Elliott 383f09cf34dSArchibald Elliott int CheckIndex = 0; 384f09cf34dSArchibald Elliott for (size_t I = 0; I < ModelIDs.size(); I++) { 385f09cf34dSArchibald Elliott for (size_t J = 0; J < VectorSupport.size(); J++) { 386f09cf34dSArchibald Elliott const std::string DummyCPUInfo = DummyBaseVectorInfo + VectorSupport[J] + 387f09cf34dSArchibald Elliott "\n" + DummyBaseMachineInfo + 388f09cf34dSArchibald Elliott ModelIDs[I]; 389f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForS390x(DummyCPUInfo), 390f09cf34dSArchibald Elliott ExpectedCPUs[CheckIndex++]); 391f09cf34dSArchibald Elliott } 392f09cf34dSArchibald Elliott } 393f09cf34dSArchibald Elliott } 394f09cf34dSArchibald Elliott 395f09cf34dSArchibald Elliott TEST(getLinuxHostCPUName, RISCV) { 396f09cf34dSArchibald Elliott const StringRef SifiveU74MCProcCPUInfo = R"( 397f09cf34dSArchibald Elliott processor : 0 398f09cf34dSArchibald Elliott hart : 2 399f09cf34dSArchibald Elliott isa : rv64imafdc 400f09cf34dSArchibald Elliott mmu : sv39 401f09cf34dSArchibald Elliott uarch : sifive,u74-mc 402f09cf34dSArchibald Elliott )"; 403f09cf34dSArchibald Elliott EXPECT_EQ(sys::detail::getHostCPUNameForRISCV(SifiveU74MCProcCPUInfo), 404f09cf34dSArchibald Elliott "sifive-u74"); 405f09cf34dSArchibald Elliott EXPECT_EQ( 406f09cf34dSArchibald Elliott sys::detail::getHostCPUNameForRISCV("uarch : sifive,bullet0\n"), 407f09cf34dSArchibald Elliott "sifive-u74"); 408f09cf34dSArchibald Elliott } 409f09cf34dSArchibald Elliott 410f09cf34dSArchibald Elliott static bool runAndGetCommandOutput( 411f09cf34dSArchibald Elliott const char *ExePath, ArrayRef<llvm::StringRef> argv, 412f09cf34dSArchibald Elliott std::unique_ptr<char[]> &Buffer, off_t &Size) { 413f09cf34dSArchibald Elliott bool Success = false; 414f09cf34dSArchibald Elliott [ExePath, argv, &Buffer, &Size, &Success] { 415f09cf34dSArchibald Elliott using namespace llvm::sys; 416f09cf34dSArchibald Elliott SmallString<128> TestDirectory; 417f09cf34dSArchibald Elliott ASSERT_NO_ERROR(fs::createUniqueDirectory("host_test", TestDirectory)); 418f09cf34dSArchibald Elliott 419f09cf34dSArchibald Elliott SmallString<128> OutputFile(TestDirectory); 420f09cf34dSArchibald Elliott path::append(OutputFile, "out"); 421f09cf34dSArchibald Elliott StringRef OutputPath = OutputFile.str(); 422f09cf34dSArchibald Elliott 423f09cf34dSArchibald Elliott const std::optional<StringRef> Redirects[] = { 424f09cf34dSArchibald Elliott /*STDIN=*/std::nullopt, /*STDOUT=*/OutputPath, /*STDERR=*/std::nullopt}; 425f09cf34dSArchibald Elliott int RetCode = 426f09cf34dSArchibald Elliott ExecuteAndWait(ExePath, argv, /*env=*/std::nullopt, Redirects); 427f09cf34dSArchibald Elliott ASSERT_EQ(0, RetCode); 428f09cf34dSArchibald Elliott 429f09cf34dSArchibald Elliott int FD = 0; 430f09cf34dSArchibald Elliott ASSERT_NO_ERROR(fs::openFileForRead(OutputPath, FD)); 431f09cf34dSArchibald Elliott Size = ::lseek(FD, 0, SEEK_END); 432f09cf34dSArchibald Elliott ASSERT_NE(-1, Size); 433f09cf34dSArchibald Elliott ::lseek(FD, 0, SEEK_SET); 434f09cf34dSArchibald Elliott Buffer = std::make_unique<char[]>(Size); 435f09cf34dSArchibald Elliott ASSERT_EQ(::read(FD, Buffer.get(), Size), Size); 436f09cf34dSArchibald Elliott ::close(FD); 437f09cf34dSArchibald Elliott 438f09cf34dSArchibald Elliott ASSERT_NO_ERROR(fs::remove(OutputPath)); 439f09cf34dSArchibald Elliott ASSERT_NO_ERROR(fs::remove(TestDirectory.str())); 440f09cf34dSArchibald Elliott Success = true; 441f09cf34dSArchibald Elliott }(); 442f09cf34dSArchibald Elliott return Success; 443f09cf34dSArchibald Elliott } 444f09cf34dSArchibald Elliott 445f09cf34dSArchibald Elliott TEST(HostTest, DummyRunAndGetCommandOutputUse) { 446f09cf34dSArchibald Elliott // Suppress defined-but-not-used warnings when the tests using the helper are 447f09cf34dSArchibald Elliott // disabled. 448f09cf34dSArchibald Elliott (void)&runAndGetCommandOutput; 449f09cf34dSArchibald Elliott } 450f09cf34dSArchibald Elliott 451f09cf34dSArchibald Elliott TEST(HostTest, getMacOSHostVersion) { 452f09cf34dSArchibald Elliott llvm::Triple HostTriple(llvm::sys::getProcessTriple()); 453f09cf34dSArchibald Elliott if (!HostTriple.isMacOSX()) 454f09cf34dSArchibald Elliott GTEST_SKIP(); 455f09cf34dSArchibald Elliott 456f09cf34dSArchibald Elliott const char *SwVersPath = "/usr/bin/sw_vers"; 457f09cf34dSArchibald Elliott StringRef argv[] = {SwVersPath, "-productVersion"}; 458f09cf34dSArchibald Elliott std::unique_ptr<char[]> Buffer; 459f09cf34dSArchibald Elliott off_t Size; 460f09cf34dSArchibald Elliott ASSERT_EQ(runAndGetCommandOutput(SwVersPath, argv, Buffer, Size), true); 461f09cf34dSArchibald Elliott StringRef SystemVersionStr = StringRef(Buffer.get(), Size).rtrim(); 462f09cf34dSArchibald Elliott 463f09cf34dSArchibald Elliott // Ensure that the two versions match. 464f09cf34dSArchibald Elliott VersionTuple SystemVersion; 465f09cf34dSArchibald Elliott ASSERT_EQ(llvm::Triple((Twine("x86_64-apple-macos") + SystemVersionStr)) 466f09cf34dSArchibald Elliott .getMacOSXVersion(SystemVersion), 467f09cf34dSArchibald Elliott true); 468f09cf34dSArchibald Elliott VersionTuple HostVersion; 469f09cf34dSArchibald Elliott ASSERT_EQ(HostTriple.getMacOSXVersion(HostVersion), true); 470f09cf34dSArchibald Elliott 471f09cf34dSArchibald Elliott if (SystemVersion.getMajor() > 10) { 472f09cf34dSArchibald Elliott // Don't compare the 'Minor' and 'Micro' versions, as they're always '0' for 473f09cf34dSArchibald Elliott // the 'Darwin' triples on 11.x. 474f09cf34dSArchibald Elliott ASSERT_EQ(SystemVersion.getMajor(), HostVersion.getMajor()); 475f09cf34dSArchibald Elliott } else { 476f09cf34dSArchibald Elliott // Don't compare the 'Micro' version, as it's always '0' for the 'Darwin' 477f09cf34dSArchibald Elliott // triples. 478f09cf34dSArchibald Elliott ASSERT_EQ(SystemVersion.getMajor(), HostVersion.getMajor()); 479f09cf34dSArchibald Elliott ASSERT_EQ(SystemVersion.getMinor(), HostVersion.getMinor()); 480f09cf34dSArchibald Elliott } 481f09cf34dSArchibald Elliott } 482f09cf34dSArchibald Elliott 483f09cf34dSArchibald Elliott // Helper to return AIX system version. Must return void to use ASSERT_*. 484f09cf34dSArchibald Elliott static void getAIXSystemVersion(VersionTuple &SystemVersion) { 485f09cf34dSArchibald Elliott const char *ExePath = "/usr/bin/oslevel"; 486f09cf34dSArchibald Elliott StringRef argv[] = {ExePath}; 487f09cf34dSArchibald Elliott std::unique_ptr<char[]> Buffer; 488f09cf34dSArchibald Elliott off_t Size; 489f09cf34dSArchibald Elliott ASSERT_EQ(runAndGetCommandOutput(ExePath, argv, Buffer, Size), true); 490f09cf34dSArchibald Elliott StringRef SystemVersionStr = StringRef(Buffer.get(), Size).rtrim(); 491f09cf34dSArchibald Elliott 492f09cf34dSArchibald Elliott SystemVersion = 493f09cf34dSArchibald Elliott llvm::Triple((Twine("powerpc-ibm-aix") + SystemVersionStr)) 494f09cf34dSArchibald Elliott .getOSVersion(); 495f09cf34dSArchibald Elliott } 496f09cf34dSArchibald Elliott 497f09cf34dSArchibald Elliott TEST(HostTest, AIXHostVersionDetect) { 498f09cf34dSArchibald Elliott llvm::Triple HostTriple(llvm::sys::getProcessTriple()); 499f09cf34dSArchibald Elliott if (HostTriple.getOS() != Triple::AIX) 500f09cf34dSArchibald Elliott GTEST_SKIP(); 501f09cf34dSArchibald Elliott 502f09cf34dSArchibald Elliott llvm::Triple ConfiguredHostTriple(LLVM_HOST_TRIPLE); 503f09cf34dSArchibald Elliott ASSERT_EQ(ConfiguredHostTriple.getOS(), Triple::AIX); 504f09cf34dSArchibald Elliott 505f09cf34dSArchibald Elliott VersionTuple SystemVersion; 506f09cf34dSArchibald Elliott getAIXSystemVersion(SystemVersion); 507f09cf34dSArchibald Elliott 508f09cf34dSArchibald Elliott // Ensure that the host triple version (major) and release (minor) numbers, 509f09cf34dSArchibald Elliott // unless explicitly configured, match with those of the current system. 510f09cf34dSArchibald Elliott auto SysMajor = SystemVersion.getMajor(); 511f09cf34dSArchibald Elliott auto SysMinor = SystemVersion.getMinor(); 512f09cf34dSArchibald Elliott VersionTuple HostVersion = HostTriple.getOSVersion(); 513f09cf34dSArchibald Elliott if (ConfiguredHostTriple.getOSMajorVersion()) { 514f09cf34dSArchibald Elliott // Explicitly configured, force a match. We do it this way so the 515f09cf34dSArchibald Elliott // asserts are always executed. 516f09cf34dSArchibald Elliott SysMajor = HostVersion.getMajor(); 517f09cf34dSArchibald Elliott SysMinor = HostVersion.getMinor(); 518f09cf34dSArchibald Elliott } 519f09cf34dSArchibald Elliott ASSERT_EQ(SysMajor, HostVersion.getMajor()); 520f09cf34dSArchibald Elliott ASSERT_EQ(SysMinor, HostVersion.getMinor()); 521f09cf34dSArchibald Elliott } 522f09cf34dSArchibald Elliott 523f09cf34dSArchibald Elliott TEST(HostTest, AIXTargetVersionDetect) { 524f09cf34dSArchibald Elliott llvm::Triple TargetTriple(llvm::sys::getDefaultTargetTriple()); 525f09cf34dSArchibald Elliott if (TargetTriple.getOS() != Triple::AIX) 526f09cf34dSArchibald Elliott GTEST_SKIP(); 527f09cf34dSArchibald Elliott 528f09cf34dSArchibald Elliott // Ensure that the target triple version (major) and release (minor) numbers 529f09cf34dSArchibald Elliott // match with those of the current system. 530f09cf34dSArchibald Elliott llvm::Triple ConfiguredTargetTriple(LLVM_DEFAULT_TARGET_TRIPLE); 531f09cf34dSArchibald Elliott if (ConfiguredTargetTriple.getOSMajorVersion()) 532f09cf34dSArchibald Elliott GTEST_SKIP(); // The version was configured explicitly; skip. 533f09cf34dSArchibald Elliott 534f09cf34dSArchibald Elliott VersionTuple SystemVersion; 535f09cf34dSArchibald Elliott getAIXSystemVersion(SystemVersion); 536f09cf34dSArchibald Elliott VersionTuple TargetVersion = TargetTriple.getOSVersion(); 537f09cf34dSArchibald Elliott ASSERT_EQ(SystemVersion.getMajor(), TargetVersion.getMajor()); 538f09cf34dSArchibald Elliott ASSERT_EQ(SystemVersion.getMinor(), TargetVersion.getMinor()); 539f09cf34dSArchibald Elliott } 540f09cf34dSArchibald Elliott 541f09cf34dSArchibald Elliott TEST(HostTest, AIXHostCPUDetect) { 542f09cf34dSArchibald Elliott llvm::Triple HostTriple(llvm::sys::getProcessTriple()); 543f09cf34dSArchibald Elliott if (HostTriple.getOS() != Triple::AIX) 544f09cf34dSArchibald Elliott GTEST_SKIP(); 545f09cf34dSArchibald Elliott 546f09cf34dSArchibald Elliott // Return a value based on the current processor implementation mode. 547f09cf34dSArchibald Elliott const char *ExePath = "/usr/sbin/getsystype"; 548f09cf34dSArchibald Elliott StringRef argv[] = {ExePath, "-i"}; 549f09cf34dSArchibald Elliott std::unique_ptr<char[]> Buffer; 550f09cf34dSArchibald Elliott off_t Size; 551f09cf34dSArchibald Elliott ASSERT_EQ(runAndGetCommandOutput(ExePath, argv, Buffer, Size), true); 552f09cf34dSArchibald Elliott StringRef CPU(Buffer.get(), Size); 553f09cf34dSArchibald Elliott StringRef MCPU = StringSwitch<const char *>(CPU) 554f09cf34dSArchibald Elliott .Case("POWER 4\n", "pwr4") 555f09cf34dSArchibald Elliott .Case("POWER 5\n", "pwr5") 556f09cf34dSArchibald Elliott .Case("POWER 6\n", "pwr6") 557f09cf34dSArchibald Elliott .Case("POWER 7\n", "pwr7") 558f09cf34dSArchibald Elliott .Case("POWER 8\n", "pwr8") 559f09cf34dSArchibald Elliott .Case("POWER 9\n", "pwr9") 560f09cf34dSArchibald Elliott .Case("POWER 10\n", "pwr10") 5611df4d866Sazhan92 .Case("POWER 11\n", "pwr11") 562f09cf34dSArchibald Elliott .Default("unknown"); 563f09cf34dSArchibald Elliott 564f09cf34dSArchibald Elliott StringRef HostCPU = sys::getHostCPUName(); 565f09cf34dSArchibald Elliott 566f09cf34dSArchibald Elliott // Just do the comparison on the base implementation mode. 567f09cf34dSArchibald Elliott if (HostCPU == "970") 568f09cf34dSArchibald Elliott HostCPU = StringRef("pwr4"); 569f09cf34dSArchibald Elliott else 570f09cf34dSArchibald Elliott HostCPU = HostCPU.rtrim('x'); 571f09cf34dSArchibald Elliott 572f09cf34dSArchibald Elliott EXPECT_EQ(HostCPU, MCPU); 573f09cf34dSArchibald Elliott } 574