xref: /llvm-project/llvm/unittests/TargetParser/Host.cpp (revision 8424bf207efd89eacf2fe893b67be98d535e1db6)
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