1 //===----------- Triple.cpp - Triple unit 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-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/ADT/Triple.h"
10 #include "llvm/Support/VersionTuple.h"
11 #include "gtest/gtest.h"
12
13 using namespace llvm;
14
15 namespace {
16
TEST(TripleTest,BasicParsing)17 TEST(TripleTest, BasicParsing) {
18 Triple T;
19
20 T = Triple("");
21 EXPECT_EQ("", T.getArchName().str());
22 EXPECT_EQ("", T.getVendorName().str());
23 EXPECT_EQ("", T.getOSName().str());
24 EXPECT_EQ("", T.getEnvironmentName().str());
25
26 T = Triple("-");
27 EXPECT_EQ("", T.getArchName().str());
28 EXPECT_EQ("", T.getVendorName().str());
29 EXPECT_EQ("", T.getOSName().str());
30 EXPECT_EQ("", T.getEnvironmentName().str());
31
32 T = Triple("--");
33 EXPECT_EQ("", T.getArchName().str());
34 EXPECT_EQ("", T.getVendorName().str());
35 EXPECT_EQ("", T.getOSName().str());
36 EXPECT_EQ("", T.getEnvironmentName().str());
37
38 T = Triple("---");
39 EXPECT_EQ("", T.getArchName().str());
40 EXPECT_EQ("", T.getVendorName().str());
41 EXPECT_EQ("", T.getOSName().str());
42 EXPECT_EQ("", T.getEnvironmentName().str());
43
44 T = Triple("----");
45 EXPECT_EQ("", T.getArchName().str());
46 EXPECT_EQ("", T.getVendorName().str());
47 EXPECT_EQ("", T.getOSName().str());
48 EXPECT_EQ("-", T.getEnvironmentName().str());
49
50 T = Triple("a");
51 EXPECT_EQ("a", T.getArchName().str());
52 EXPECT_EQ("", T.getVendorName().str());
53 EXPECT_EQ("", T.getOSName().str());
54 EXPECT_EQ("", T.getEnvironmentName().str());
55
56 T = Triple("a-b");
57 EXPECT_EQ("a", T.getArchName().str());
58 EXPECT_EQ("b", T.getVendorName().str());
59 EXPECT_EQ("", T.getOSName().str());
60 EXPECT_EQ("", T.getEnvironmentName().str());
61
62 T = Triple("a-b-c");
63 EXPECT_EQ("a", T.getArchName().str());
64 EXPECT_EQ("b", T.getVendorName().str());
65 EXPECT_EQ("c", T.getOSName().str());
66 EXPECT_EQ("", T.getEnvironmentName().str());
67
68 T = Triple("a-b-c-d");
69 EXPECT_EQ("a", T.getArchName().str());
70 EXPECT_EQ("b", T.getVendorName().str());
71 EXPECT_EQ("c", T.getOSName().str());
72 EXPECT_EQ("d", T.getEnvironmentName().str());
73 }
74
TEST(TripleTest,ParsedIDs)75 TEST(TripleTest, ParsedIDs) {
76 Triple T;
77
78 T = Triple("i386-apple-darwin");
79 EXPECT_EQ(Triple::x86, T.getArch());
80 EXPECT_EQ(Triple::Apple, T.getVendor());
81 EXPECT_EQ(Triple::Darwin, T.getOS());
82 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
83
84 T = Triple("i386-pc-elfiamcu");
85 EXPECT_EQ(Triple::x86, T.getArch());
86 EXPECT_EQ(Triple::PC, T.getVendor());
87 EXPECT_EQ(Triple::ELFIAMCU, T.getOS());
88 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
89
90 T = Triple("i386-pc-contiki-unknown");
91 EXPECT_EQ(Triple::x86, T.getArch());
92 EXPECT_EQ(Triple::PC, T.getVendor());
93 EXPECT_EQ(Triple::Contiki, T.getOS());
94 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
95
96 T = Triple("i386-pc-hurd-gnu");
97 EXPECT_EQ(Triple::x86, T.getArch());
98 EXPECT_EQ(Triple::PC, T.getVendor());
99 EXPECT_EQ(Triple::Hurd, T.getOS());
100 EXPECT_EQ(Triple::GNU, T.getEnvironment());
101
102 T = Triple("x86_64-pc-linux-gnu");
103 EXPECT_EQ(Triple::x86_64, T.getArch());
104 EXPECT_EQ(Triple::PC, T.getVendor());
105 EXPECT_EQ(Triple::Linux, T.getOS());
106 EXPECT_EQ(Triple::GNU, T.getEnvironment());
107
108 T = Triple("x86_64-pc-linux-musl");
109 EXPECT_EQ(Triple::x86_64, T.getArch());
110 EXPECT_EQ(Triple::PC, T.getVendor());
111 EXPECT_EQ(Triple::Linux, T.getOS());
112 EXPECT_EQ(Triple::Musl, T.getEnvironment());
113
114 T = Triple("x86_64-pc-linux-muslx32");
115 EXPECT_EQ(Triple::x86_64, T.getArch());
116 EXPECT_EQ(Triple::PC, T.getVendor());
117 EXPECT_EQ(Triple::Linux, T.getOS());
118 EXPECT_EQ(Triple::MuslX32, T.getEnvironment());
119
120 T = Triple("arm-unknown-linux-android16");
121 EXPECT_EQ(Triple::arm, T.getArch());
122 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
123 EXPECT_EQ(Triple::Linux, T.getOS());
124 EXPECT_EQ(Triple::Android, T.getEnvironment());
125
126 T = Triple("aarch64-unknown-linux-android21");
127 EXPECT_EQ(Triple::aarch64, T.getArch());
128 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
129 EXPECT_EQ(Triple::Linux, T.getOS());
130 EXPECT_EQ(Triple::Android, T.getEnvironment());
131
132 // PS4 has two spellings for the vendor.
133 T = Triple("x86_64-scei-ps4");
134 EXPECT_EQ(Triple::x86_64, T.getArch());
135 EXPECT_EQ(Triple::SCEI, T.getVendor());
136 EXPECT_EQ(Triple::PS4, T.getOS());
137
138 T = Triple("x86_64-sie-ps4");
139 EXPECT_EQ(Triple::x86_64, T.getArch());
140 EXPECT_EQ(Triple::SCEI, T.getVendor());
141 EXPECT_EQ(Triple::PS4, T.getOS());
142
143 T = Triple("x86_64-sie-ps5");
144 EXPECT_EQ(Triple::x86_64, T.getArch());
145 EXPECT_EQ(Triple::SCEI, T.getVendor());
146 EXPECT_EQ(Triple::PS5, T.getOS());
147
148 T = Triple("powerpc-ibm-aix");
149 EXPECT_EQ(Triple::ppc, T.getArch());
150 EXPECT_EQ(Triple::IBM, T.getVendor());
151 EXPECT_EQ(Triple::AIX, T.getOS());
152 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
153
154 T = Triple("powerpc64-ibm-aix");
155 EXPECT_EQ(Triple::ppc64, T.getArch());
156 EXPECT_EQ(Triple::IBM, T.getVendor());
157 EXPECT_EQ(Triple::AIX, T.getOS());
158 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
159
160 T = Triple("powerpc-dunno-notsure");
161 EXPECT_EQ(Triple::ppc, T.getArch());
162 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
163 EXPECT_EQ(Triple::UnknownOS, T.getOS());
164 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
165
166 T = Triple("powerpcspe-unknown-freebsd");
167 EXPECT_EQ(Triple::ppc, T.getArch());
168 EXPECT_EQ(Triple::PPCSubArch_spe, T.getSubArch());
169 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
170 EXPECT_EQ(Triple::FreeBSD, T.getOS());
171 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
172
173 T = Triple("s390x-ibm-zos");
174 EXPECT_EQ(Triple::systemz, T.getArch());
175 EXPECT_EQ(Triple::IBM, T.getVendor());
176 EXPECT_EQ(Triple::ZOS, T.getOS());
177 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
178
179 T = Triple("systemz-ibm-zos");
180 EXPECT_EQ(Triple::systemz, T.getArch());
181 EXPECT_EQ(Triple::IBM, T.getVendor());
182 EXPECT_EQ(Triple::ZOS, T.getOS());
183 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
184
185 T = Triple("arm-none-none-eabi");
186 EXPECT_EQ(Triple::arm, T.getArch());
187 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
188 EXPECT_EQ(Triple::UnknownOS, T.getOS());
189 EXPECT_EQ(Triple::EABI, T.getEnvironment());
190
191 T = Triple("arm-none-linux-musleabi");
192 EXPECT_EQ(Triple::arm, T.getArch());
193 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
194 EXPECT_EQ(Triple::Linux, T.getOS());
195 EXPECT_EQ(Triple::MuslEABI, T.getEnvironment());
196
197 T = Triple("armv6hl-none-linux-gnueabi");
198 EXPECT_EQ(Triple::arm, T.getArch());
199 EXPECT_EQ(Triple::Linux, T.getOS());
200 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
201 EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
202
203 T = Triple("armv7hl-none-linux-gnueabi");
204 EXPECT_EQ(Triple::arm, T.getArch());
205 EXPECT_EQ(Triple::Linux, T.getOS());
206 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
207 EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
208
209 T = Triple("amdil-unknown-unknown");
210 EXPECT_EQ(Triple::amdil, T.getArch());
211 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
212 EXPECT_EQ(Triple::UnknownOS, T.getOS());
213
214 T = Triple("amdil64-unknown-unknown");
215 EXPECT_EQ(Triple::amdil64, T.getArch());
216 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
217 EXPECT_EQ(Triple::UnknownOS, T.getOS());
218
219 T = Triple("hsail-unknown-unknown");
220 EXPECT_EQ(Triple::hsail, T.getArch());
221 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
222 EXPECT_EQ(Triple::UnknownOS, T.getOS());
223
224 T = Triple("hsail64-unknown-unknown");
225 EXPECT_EQ(Triple::hsail64, T.getArch());
226 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
227 EXPECT_EQ(Triple::UnknownOS, T.getOS());
228
229 T = Triple("sparcel-unknown-unknown");
230 EXPECT_EQ(Triple::sparcel, T.getArch());
231 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
232 EXPECT_EQ(Triple::UnknownOS, T.getOS());
233
234 T = Triple("spir-unknown-unknown");
235 EXPECT_EQ(Triple::spir, T.getArch());
236 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
237 EXPECT_EQ(Triple::UnknownOS, T.getOS());
238
239 T = Triple("spir64-unknown-unknown");
240 EXPECT_EQ(Triple::spir64, T.getArch());
241 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
242 EXPECT_EQ(Triple::UnknownOS, T.getOS());
243
244 T = Triple("spirv32-unknown-unknown");
245 EXPECT_EQ(Triple::spirv32, T.getArch());
246 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
247 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
248 EXPECT_EQ(Triple::UnknownOS, T.getOS());
249
250 T = Triple("spirv32v1.0-unknown-unknown");
251 EXPECT_EQ(Triple::spirv32, T.getArch());
252 EXPECT_EQ(Triple::SPIRVSubArch_v10, T.getSubArch());
253 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
254 EXPECT_EQ(Triple::UnknownOS, T.getOS());
255
256 T = Triple("spirv32v1.1-unknown-unknown");
257 EXPECT_EQ(Triple::spirv32, T.getArch());
258 EXPECT_EQ(Triple::SPIRVSubArch_v11, T.getSubArch());
259 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
260 EXPECT_EQ(Triple::UnknownOS, T.getOS());
261
262 T = Triple("spirv32v1.2-unknown-unknown");
263 EXPECT_EQ(Triple::spirv32, T.getArch());
264 EXPECT_EQ(Triple::SPIRVSubArch_v12, T.getSubArch());
265 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
266 EXPECT_EQ(Triple::UnknownOS, T.getOS());
267
268 T = Triple("spirv32v1.3-unknown-unknown");
269 EXPECT_EQ(Triple::spirv32, T.getArch());
270 EXPECT_EQ(Triple::SPIRVSubArch_v13, T.getSubArch());
271 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
272 EXPECT_EQ(Triple::UnknownOS, T.getOS());
273
274 T = Triple("spirv32v1.4-unknown-unknown");
275 EXPECT_EQ(Triple::spirv32, T.getArch());
276 EXPECT_EQ(Triple::SPIRVSubArch_v14, T.getSubArch());
277 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
278 EXPECT_EQ(Triple::UnknownOS, T.getOS());
279
280 T = Triple("spirv32v1.5-unknown-unknown");
281 EXPECT_EQ(Triple::spirv32, T.getArch());
282 EXPECT_EQ(Triple::SPIRVSubArch_v15, T.getSubArch());
283 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
284 EXPECT_EQ(Triple::UnknownOS, T.getOS());
285
286 T = Triple("spirv64-unknown-unknown");
287 EXPECT_EQ(Triple::spirv64, T.getArch());
288 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
289 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
290 EXPECT_EQ(Triple::UnknownOS, T.getOS());
291
292 T = Triple("spirv64v1.0-unknown-unknown");
293 EXPECT_EQ(Triple::spirv64, T.getArch());
294 EXPECT_EQ(Triple::SPIRVSubArch_v10, T.getSubArch());
295 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
296 EXPECT_EQ(Triple::UnknownOS, T.getOS());
297
298 T = Triple("spirv64v1.1-unknown-unknown");
299 EXPECT_EQ(Triple::spirv64, T.getArch());
300 EXPECT_EQ(Triple::SPIRVSubArch_v11, T.getSubArch());
301 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
302 EXPECT_EQ(Triple::UnknownOS, T.getOS());
303
304 T = Triple("spirv64v1.2-unknown-unknown");
305 EXPECT_EQ(Triple::spirv64, T.getArch());
306 EXPECT_EQ(Triple::SPIRVSubArch_v12, T.getSubArch());
307 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
308 EXPECT_EQ(Triple::UnknownOS, T.getOS());
309
310 T = Triple("spirv64v1.3-unknown-unknown");
311 EXPECT_EQ(Triple::spirv64, T.getArch());
312 EXPECT_EQ(Triple::SPIRVSubArch_v13, T.getSubArch());
313 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
314 EXPECT_EQ(Triple::UnknownOS, T.getOS());
315
316 T = Triple("spirv64v1.4-unknown-unknown");
317 EXPECT_EQ(Triple::spirv64, T.getArch());
318 EXPECT_EQ(Triple::SPIRVSubArch_v14, T.getSubArch());
319 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
320 EXPECT_EQ(Triple::UnknownOS, T.getOS());
321
322 T = Triple("spirv64v1.5-unknown-unknown");
323 EXPECT_EQ(Triple::spirv64, T.getArch());
324 EXPECT_EQ(Triple::SPIRVSubArch_v15, T.getSubArch());
325 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
326 EXPECT_EQ(Triple::UnknownOS, T.getOS());
327
328 T = Triple("x86_64-unknown-ananas");
329 EXPECT_EQ(Triple::x86_64, T.getArch());
330 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
331 EXPECT_EQ(Triple::Ananas, T.getOS());
332 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
333
334 T = Triple("x86_64-unknown-cloudabi");
335 EXPECT_EQ(Triple::x86_64, T.getArch());
336 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
337 EXPECT_EQ(Triple::CloudABI, T.getOS());
338 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
339
340 T = Triple("x86_64-unknown-fuchsia");
341 EXPECT_EQ(Triple::x86_64, T.getArch());
342 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
343 EXPECT_EQ(Triple::Fuchsia, T.getOS());
344 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
345
346 T = Triple("x86_64-unknown-hermit");
347 EXPECT_EQ(Triple::x86_64, T.getArch());
348 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
349 EXPECT_EQ(Triple::HermitCore, T.getOS());
350 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
351
352 T = Triple("wasm32-unknown-unknown");
353 EXPECT_EQ(Triple::wasm32, T.getArch());
354 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
355 EXPECT_EQ(Triple::UnknownOS, T.getOS());
356 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
357
358 T = Triple("wasm32-unknown-wasi");
359 EXPECT_EQ(Triple::wasm32, T.getArch());
360 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
361 EXPECT_EQ(Triple::WASI, T.getOS());
362 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
363
364 T = Triple("wasm64-unknown-unknown");
365 EXPECT_EQ(Triple::wasm64, T.getArch());
366 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
367 EXPECT_EQ(Triple::UnknownOS, T.getOS());
368 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
369
370 T = Triple("wasm64-unknown-wasi");
371 EXPECT_EQ(Triple::wasm64, T.getArch());
372 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
373 EXPECT_EQ(Triple::WASI, T.getOS());
374 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
375
376 T = Triple("avr-unknown-unknown");
377 EXPECT_EQ(Triple::avr, T.getArch());
378 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
379 EXPECT_EQ(Triple::UnknownOS, T.getOS());
380 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
381
382 T = Triple("avr");
383 EXPECT_EQ(Triple::avr, T.getArch());
384 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
385 EXPECT_EQ(Triple::UnknownOS, T.getOS());
386 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
387
388 T = Triple("lanai-unknown-unknown");
389 EXPECT_EQ(Triple::lanai, T.getArch());
390 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
391 EXPECT_EQ(Triple::UnknownOS, T.getOS());
392 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
393
394 T = Triple("lanai");
395 EXPECT_EQ(Triple::lanai, T.getArch());
396 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
397 EXPECT_EQ(Triple::UnknownOS, T.getOS());
398 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
399
400 T = Triple("amdgcn-mesa-mesa3d");
401 EXPECT_EQ(Triple::amdgcn, T.getArch());
402 EXPECT_EQ(Triple::Mesa, T.getVendor());
403 EXPECT_EQ(Triple::Mesa3D, T.getOS());
404 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
405
406 T = Triple("amdgcn-amd-amdhsa");
407 EXPECT_EQ(Triple::amdgcn, T.getArch());
408 EXPECT_EQ(Triple::AMD, T.getVendor());
409 EXPECT_EQ(Triple::AMDHSA, T.getOS());
410 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
411
412 T = Triple("amdgcn-amd-amdpal");
413 EXPECT_EQ(Triple::amdgcn, T.getArch());
414 EXPECT_EQ(Triple::AMD, T.getVendor());
415 EXPECT_EQ(Triple::AMDPAL, T.getOS());
416 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
417
418 T = Triple("ve-unknown-linux");
419 EXPECT_EQ(Triple::ve, T.getArch());
420 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
421 EXPECT_EQ(Triple::Linux, T.getOS());
422 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
423
424 T = Triple("csky-unknown-unknown");
425 EXPECT_EQ(Triple::csky, T.getArch());
426 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
427 EXPECT_EQ(Triple::UnknownOS, T.getOS());
428 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
429
430 T = Triple("csky-unknown-linux");
431 EXPECT_EQ(Triple::csky, T.getArch());
432 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
433 EXPECT_EQ(Triple::Linux, T.getOS());
434 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
435
436 T = Triple("loongarch32-unknown-unknown");
437 EXPECT_EQ(Triple::loongarch32, T.getArch());
438 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
439 EXPECT_EQ(Triple::UnknownOS, T.getOS());
440 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
441
442 T = Triple("loongarch64-unknown-linux");
443 EXPECT_EQ(Triple::loongarch64, T.getArch());
444 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
445 EXPECT_EQ(Triple::Linux, T.getOS());
446 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
447
448 T = Triple("riscv32-unknown-unknown");
449 EXPECT_EQ(Triple::riscv32, T.getArch());
450 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
451 EXPECT_EQ(Triple::UnknownOS, T.getOS());
452 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
453
454 T = Triple("riscv64-unknown-linux");
455 EXPECT_EQ(Triple::riscv64, T.getArch());
456 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
457 EXPECT_EQ(Triple::Linux, T.getOS());
458 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
459
460 T = Triple("riscv64-unknown-freebsd");
461 EXPECT_EQ(Triple::riscv64, T.getArch());
462 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
463 EXPECT_EQ(Triple::FreeBSD, T.getOS());
464 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
465
466 T = Triple("riscv64-suse-linux");
467 EXPECT_EQ(Triple::riscv64, T.getArch());
468 EXPECT_EQ(Triple::SUSE, T.getVendor());
469 EXPECT_EQ(Triple::Linux, T.getOS());
470 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
471
472 T = Triple("armv7hl-suse-linux-gnueabi");
473 EXPECT_EQ(Triple::arm, T.getArch());
474 EXPECT_EQ(Triple::SUSE, T.getVendor());
475 EXPECT_EQ(Triple::Linux, T.getOS());
476 EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
477
478 T = Triple("i586-pc-haiku");
479 EXPECT_EQ(Triple::x86, T.getArch());
480 EXPECT_EQ(Triple::PC, T.getVendor());
481 EXPECT_EQ(Triple::Haiku, T.getOS());
482 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
483
484 T = Triple("x86_64-unknown-haiku");
485 EXPECT_EQ(Triple::x86_64, T.getArch());
486 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
487 EXPECT_EQ(Triple::Haiku, T.getOS());
488 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
489
490 T = Triple("mips-mti-linux-gnu");
491 EXPECT_EQ(Triple::mips, T.getArch());
492 EXPECT_EQ(Triple::MipsTechnologies, T.getVendor());
493 EXPECT_EQ(Triple::Linux, T.getOS());
494 EXPECT_EQ(Triple::GNU, T.getEnvironment());
495
496 T = Triple("mipsel-img-linux-gnu");
497 EXPECT_EQ(Triple::mipsel, T.getArch());
498 EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor());
499 EXPECT_EQ(Triple::Linux, T.getOS());
500 EXPECT_EQ(Triple::GNU, T.getEnvironment());
501
502 T = Triple("mips64-mti-linux-gnu");
503 EXPECT_EQ(Triple::mips64, T.getArch());
504 EXPECT_EQ(Triple::MipsTechnologies, T.getVendor());
505 EXPECT_EQ(Triple::Linux, T.getOS());
506 EXPECT_EQ(Triple::GNU, T.getEnvironment());
507
508 T = Triple("mips64el-img-linux-gnu");
509 EXPECT_EQ(Triple::mips64el, T.getArch());
510 EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor());
511 EXPECT_EQ(Triple::Linux, T.getOS());
512 EXPECT_EQ(Triple::GNU, T.getEnvironment());
513
514 T = Triple("mips64el-img-linux-gnuabin32");
515 EXPECT_EQ(Triple::mips64el, T.getArch());
516 EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor());
517 EXPECT_EQ(Triple::Linux, T.getOS());
518 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
519
520 T = Triple("mips64el-unknown-linux-gnuabi64");
521 EXPECT_EQ(Triple::mips64el, T.getArch());
522 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
523 EXPECT_EQ(Triple::Linux, T.getOS());
524 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
525 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
526 T = Triple("mips64el");
527 EXPECT_EQ(Triple::mips64el, T.getArch());
528 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
529 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
530 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
531
532 T = Triple("mips64-unknown-linux-gnuabi64");
533 EXPECT_EQ(Triple::mips64, T.getArch());
534 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
535 EXPECT_EQ(Triple::Linux, T.getOS());
536 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
537 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
538 T = Triple("mips64");
539 EXPECT_EQ(Triple::mips64, T.getArch());
540 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
541 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
542 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
543
544 T = Triple("mipsisa64r6el-unknown-linux-gnuabi64");
545 EXPECT_EQ(Triple::mips64el, T.getArch());
546 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
547 EXPECT_EQ(Triple::Linux, T.getOS());
548 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
549 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
550 T = Triple("mips64r6el");
551 EXPECT_EQ(Triple::mips64el, T.getArch());
552 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
553 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
554 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
555 T = Triple("mipsisa64r6el");
556 EXPECT_EQ(Triple::mips64el, T.getArch());
557 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
558 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
559 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
560
561 T = Triple("mipsisa64r6-unknown-linux-gnuabi64");
562 EXPECT_EQ(Triple::mips64, T.getArch());
563 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
564 EXPECT_EQ(Triple::Linux, T.getOS());
565 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
566 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
567 T = Triple("mips64r6");
568 EXPECT_EQ(Triple::mips64, T.getArch());
569 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
570 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
571 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
572 T = Triple("mipsisa64r6");
573 EXPECT_EQ(Triple::mips64, T.getArch());
574 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
575 EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
576 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
577
578 T = Triple("mips64el-unknown-linux-gnuabin32");
579 EXPECT_EQ(Triple::mips64el, T.getArch());
580 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
581 EXPECT_EQ(Triple::Linux, T.getOS());
582 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
583 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
584 T = Triple("mipsn32el");
585 EXPECT_EQ(Triple::mips64el, T.getArch());
586 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
587 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
588 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
589
590 T = Triple("mips64-unknown-linux-gnuabin32");
591 EXPECT_EQ(Triple::mips64, T.getArch());
592 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
593 EXPECT_EQ(Triple::Linux, T.getOS());
594 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
595 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
596 T = Triple("mipsn32");
597 EXPECT_EQ(Triple::mips64, T.getArch());
598 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
599 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
600 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
601
602 T = Triple("mipsisa64r6el-unknown-linux-gnuabin32");
603 EXPECT_EQ(Triple::mips64el, T.getArch());
604 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
605 EXPECT_EQ(Triple::Linux, T.getOS());
606 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
607 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
608 T = Triple("mipsn32r6el");
609 EXPECT_EQ(Triple::mips64el, T.getArch());
610 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
611 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
612 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
613
614 T = Triple("mipsisa64r6-unknown-linux-gnuabin32");
615 EXPECT_EQ(Triple::mips64, T.getArch());
616 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
617 EXPECT_EQ(Triple::Linux, T.getOS());
618 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
619 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
620 T = Triple("mipsn32r6");
621 EXPECT_EQ(Triple::mips64, T.getArch());
622 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
623 EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
624 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
625
626 T = Triple("mipsel-unknown-linux-gnu");
627 EXPECT_EQ(Triple::mipsel, T.getArch());
628 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
629 EXPECT_EQ(Triple::Linux, T.getOS());
630 EXPECT_EQ(Triple::GNU, T.getEnvironment());
631 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
632 T = Triple("mipsel");
633 EXPECT_EQ(Triple::mipsel, T.getArch());
634 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
635 EXPECT_EQ(Triple::GNU, T.getEnvironment());
636 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
637
638 T = Triple("mips-unknown-linux-gnu");
639 EXPECT_EQ(Triple::mips, T.getArch());
640 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
641 EXPECT_EQ(Triple::Linux, T.getOS());
642 EXPECT_EQ(Triple::GNU, T.getEnvironment());
643 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
644 T = Triple("mips");
645 EXPECT_EQ(Triple::mips, T.getArch());
646 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
647 EXPECT_EQ(Triple::GNU, T.getEnvironment());
648 EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
649
650 T = Triple("mipsisa32r6el-unknown-linux-gnu");
651 EXPECT_EQ(Triple::mipsel, T.getArch());
652 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
653 EXPECT_EQ(Triple::Linux, T.getOS());
654 EXPECT_EQ(Triple::GNU, T.getEnvironment());
655 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
656 T = Triple("mipsr6el");
657 EXPECT_EQ(Triple::mipsel, T.getArch());
658 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
659 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
660 T = Triple("mipsisa32r6el");
661 EXPECT_EQ(Triple::mipsel, T.getArch());
662 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
663 EXPECT_EQ(Triple::GNU, T.getEnvironment());
664 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
665
666 T = Triple("mipsisa32r6-unknown-linux-gnu");
667 EXPECT_EQ(Triple::mips, T.getArch());
668 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
669 EXPECT_EQ(Triple::Linux, T.getOS());
670 EXPECT_EQ(Triple::GNU, T.getEnvironment());
671 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
672 T = Triple("mipsr6");
673 EXPECT_EQ(Triple::mips, T.getArch());
674 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
675 EXPECT_EQ(Triple::GNU, T.getEnvironment());
676 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
677 T = Triple("mipsisa32r6");
678 EXPECT_EQ(Triple::mips, T.getArch());
679 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
680 EXPECT_EQ(Triple::GNU, T.getEnvironment());
681 EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
682
683 T = Triple("arm-oe-linux-gnueabi");
684 EXPECT_EQ(Triple::arm, T.getArch());
685 EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
686 EXPECT_EQ(Triple::Linux, T.getOS());
687 EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
688
689 T = Triple("aarch64-oe-linux");
690 EXPECT_EQ(Triple::aarch64, T.getArch());
691 EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
692 EXPECT_EQ(Triple::Linux, T.getOS());
693 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
694 EXPECT_TRUE(T.isArch64Bit());
695
696 T = Triple("arm64_32-apple-ios");
697 EXPECT_EQ(Triple::aarch64_32, T.getArch());
698 EXPECT_EQ(Triple::IOS, T.getOS());
699 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
700 EXPECT_TRUE(T.isArch32Bit());
701
702 T = Triple("dxil-unknown-shadermodel-pixel");
703 EXPECT_EQ(Triple::dxil, T.getArch());
704 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
705 EXPECT_EQ(Triple::ShaderModel, T.getOS());
706 EXPECT_EQ(Triple::Pixel, T.getEnvironment());
707
708 T = Triple("dxil-unknown-shadermodel-vertex");
709 EXPECT_EQ(Triple::dxil, T.getArch());
710 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
711 EXPECT_EQ(Triple::ShaderModel, T.getOS());
712 EXPECT_EQ(Triple::Vertex, T.getEnvironment());
713
714 T = Triple("dxil-unknown-shadermodel-geometry");
715 EXPECT_EQ(Triple::dxil, T.getArch());
716 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
717 EXPECT_EQ(Triple::ShaderModel, T.getOS());
718 EXPECT_EQ(Triple::Geometry, T.getEnvironment());
719
720
721 T = Triple("dxil-unknown-shadermodel-hull");
722 EXPECT_EQ(Triple::dxil, T.getArch());
723 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
724 EXPECT_EQ(Triple::ShaderModel, T.getOS());
725 EXPECT_EQ(Triple::Hull, T.getEnvironment());
726
727 T = Triple("dxil-unknown-shadermodel-domain");
728 EXPECT_EQ(Triple::dxil, T.getArch());
729 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
730 EXPECT_EQ(Triple::ShaderModel, T.getOS());
731 EXPECT_EQ(Triple::Domain, T.getEnvironment());
732
733 T = Triple("dxil-unknown-shadermodel-compute");
734 EXPECT_EQ(Triple::dxil, T.getArch());
735 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
736 EXPECT_EQ(Triple::ShaderModel, T.getOS());
737 EXPECT_EQ(Triple::Compute, T.getEnvironment());
738
739 T = Triple("dxil-unknown-shadermodel-library");
740 EXPECT_EQ(Triple::dxil, T.getArch());
741 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
742 EXPECT_EQ(Triple::ShaderModel, T.getOS());
743 EXPECT_EQ(Triple::Library, T.getEnvironment());
744
745 T = Triple("dxil-unknown-shadermodel-raygeneration");
746 EXPECT_EQ(Triple::dxil, T.getArch());
747 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
748 EXPECT_EQ(Triple::ShaderModel, T.getOS());
749 EXPECT_EQ(Triple::RayGeneration, T.getEnvironment());
750
751 T = Triple("dxil-unknown-shadermodel-intersection");
752 EXPECT_EQ(Triple::dxil, T.getArch());
753 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
754 EXPECT_EQ(Triple::ShaderModel, T.getOS());
755 EXPECT_EQ(Triple::Intersection, T.getEnvironment());
756
757 T = Triple("dxil-unknown-shadermodel-anyhit");
758 EXPECT_EQ(Triple::dxil, T.getArch());
759 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
760 EXPECT_EQ(Triple::ShaderModel, T.getOS());
761 EXPECT_EQ(Triple::AnyHit, T.getEnvironment());
762
763 T = Triple("dxil-unknown-shadermodel-closesthit");
764 EXPECT_EQ(Triple::dxil, T.getArch());
765 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
766 EXPECT_EQ(Triple::ShaderModel, T.getOS());
767 EXPECT_EQ(Triple::ClosestHit, T.getEnvironment());
768
769 T = Triple("dxil-unknown-shadermodel-miss");
770 EXPECT_EQ(Triple::dxil, T.getArch());
771 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
772 EXPECT_EQ(Triple::ShaderModel, T.getOS());
773 EXPECT_EQ(Triple::Miss, T.getEnvironment());
774
775 T = Triple("dxil-unknown-shadermodel-callable");
776 EXPECT_EQ(Triple::dxil, T.getArch());
777 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
778 EXPECT_EQ(Triple::ShaderModel, T.getOS());
779 EXPECT_EQ(Triple::Callable, T.getEnvironment());
780
781 T = Triple("dxil-unknown-shadermodel-mesh");
782 EXPECT_EQ(Triple::dxil, T.getArch());
783 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
784 EXPECT_EQ(Triple::ShaderModel, T.getOS());
785 EXPECT_EQ(Triple::Mesh, T.getEnvironment());
786
787 T = Triple("dxil-unknown-shadermodel-amplification");
788 EXPECT_EQ(Triple::dxil, T.getArch());
789 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
790 EXPECT_EQ(Triple::ShaderModel, T.getOS());
791 EXPECT_EQ(Triple::Amplification, T.getEnvironment());
792
793 T = Triple("huh");
794 EXPECT_EQ(Triple::UnknownArch, T.getArch());
795 }
796
Join(StringRef A,StringRef B,StringRef C)797 static std::string Join(StringRef A, StringRef B, StringRef C) {
798 std::string Str = std::string(A);
799 Str += '-';
800 Str += B;
801 Str += '-';
802 Str += C;
803 return Str;
804 }
805
Join(StringRef A,StringRef B,StringRef C,StringRef D)806 static std::string Join(StringRef A, StringRef B, StringRef C, StringRef D) {
807 std::string Str = std::string(A);
808 Str += '-';
809 Str += B;
810 Str += '-';
811 Str += C;
812 Str += '-';
813 Str += D;
814 return Str;
815 }
816
TEST(TripleTest,Normalization)817 TEST(TripleTest, Normalization) {
818
819 EXPECT_EQ("unknown", Triple::normalize(""));
820 EXPECT_EQ("unknown-unknown", Triple::normalize("-"));
821 EXPECT_EQ("unknown-unknown-unknown", Triple::normalize("--"));
822 EXPECT_EQ("unknown-unknown-unknown-unknown", Triple::normalize("---"));
823 EXPECT_EQ("unknown-unknown-unknown-unknown-unknown",
824 Triple::normalize("----"));
825
826 EXPECT_EQ("a", Triple::normalize("a"));
827 EXPECT_EQ("a-b", Triple::normalize("a-b"));
828 EXPECT_EQ("a-b-c", Triple::normalize("a-b-c"));
829 EXPECT_EQ("a-b-c-d", Triple::normalize("a-b-c-d"));
830
831 EXPECT_EQ("i386-b-c", Triple::normalize("i386-b-c"));
832 EXPECT_EQ("i386-a-c", Triple::normalize("a-i386-c"));
833 EXPECT_EQ("i386-a-b", Triple::normalize("a-b-i386"));
834 EXPECT_EQ("i386-a-b-c", Triple::normalize("a-b-c-i386"));
835
836 EXPECT_EQ("a-pc-c", Triple::normalize("a-pc-c"));
837 EXPECT_EQ("unknown-pc-b-c", Triple::normalize("pc-b-c"));
838 EXPECT_EQ("a-pc-b", Triple::normalize("a-b-pc"));
839 EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc"));
840
841 EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux"));
842 EXPECT_EQ("unknown-unknown-linux-b-c", Triple::normalize("linux-b-c"));
843 EXPECT_EQ("a-unknown-linux-c", Triple::normalize("a-linux-c"));
844
845 EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386"));
846 EXPECT_EQ("i386-pc-unknown", Triple::normalize("-pc-i386"));
847 EXPECT_EQ("unknown-pc-linux-c", Triple::normalize("linux-pc-c"));
848 EXPECT_EQ("unknown-pc-linux", Triple::normalize("linux-pc-"));
849
850 EXPECT_EQ("i386", Triple::normalize("i386"));
851 EXPECT_EQ("unknown-pc", Triple::normalize("pc"));
852 EXPECT_EQ("unknown-unknown-linux", Triple::normalize("linux"));
853
854 EXPECT_EQ("x86_64-unknown-linux-gnu", Triple::normalize("x86_64-gnu-linux"));
855
856 // Check that normalizing a permutated set of valid components returns a
857 // triple with the unpermuted components.
858 //
859 // We don't check every possible combination. For the set of architectures A,
860 // vendors V, operating systems O, and environments E, that would require |A|
861 // * |V| * |O| * |E| * 4! tests. Instead we check every option for any given
862 // slot and make sure it gets normalized to the correct position from every
863 // permutation. This should cover the core logic while being a tractable
864 // number of tests at (|A| + |V| + |O| + |E|) * 4!.
865 auto FirstArchType = Triple::ArchType(Triple::UnknownArch + 1);
866 auto FirstVendorType = Triple::VendorType(Triple::UnknownVendor + 1);
867 auto FirstOSType = Triple::OSType(Triple::UnknownOS + 1);
868 auto FirstEnvType = Triple::EnvironmentType(Triple::UnknownEnvironment + 1);
869 StringRef InitialC[] = {Triple::getArchTypeName(FirstArchType),
870 Triple::getVendorTypeName(FirstVendorType),
871 Triple::getOSTypeName(FirstOSType),
872 Triple::getEnvironmentTypeName(FirstEnvType)};
873 for (int Arch = FirstArchType; Arch <= Triple::LastArchType; ++Arch) {
874 StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
875 C[0] = Triple::getArchTypeName(Triple::ArchType(Arch));
876 std::string E = Join(C[0], C[1], C[2]);
877 int I[] = {0, 1, 2};
878 do {
879 EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
880 } while (std::next_permutation(std::begin(I), std::end(I)));
881 std::string F = Join(C[0], C[1], C[2], C[3]);
882 int J[] = {0, 1, 2, 3};
883 do {
884 EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
885 } while (std::next_permutation(std::begin(J), std::end(J)));
886 }
887 for (int Vendor = FirstVendorType; Vendor <= Triple::LastVendorType;
888 ++Vendor) {
889 StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
890 C[1] = Triple::getVendorTypeName(Triple::VendorType(Vendor));
891 std::string E = Join(C[0], C[1], C[2]);
892 int I[] = {0, 1, 2};
893 do {
894 EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
895 } while (std::next_permutation(std::begin(I), std::end(I)));
896 std::string F = Join(C[0], C[1], C[2], C[3]);
897 int J[] = {0, 1, 2, 3};
898 do {
899 EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
900 } while (std::next_permutation(std::begin(J), std::end(J)));
901 }
902 for (int OS = FirstOSType; OS <= Triple::LastOSType; ++OS) {
903 if (OS == Triple::Win32)
904 continue;
905 StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
906 C[2] = Triple::getOSTypeName(Triple::OSType(OS));
907 std::string E = Join(C[0], C[1], C[2]);
908 int I[] = {0, 1, 2};
909 do {
910 EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
911 } while (std::next_permutation(std::begin(I), std::end(I)));
912 std::string F = Join(C[0], C[1], C[2], C[3]);
913 int J[] = {0, 1, 2, 3};
914 do {
915 EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
916 } while (std::next_permutation(std::begin(J), std::end(J)));
917 }
918 for (int Env = FirstEnvType; Env <= Triple::LastEnvironmentType; ++Env) {
919 StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
920 C[3] = Triple::getEnvironmentTypeName(Triple::EnvironmentType(Env));
921 std::string F = Join(C[0], C[1], C[2], C[3]);
922 int J[] = {0, 1, 2, 3};
923 do {
924 EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
925 } while (std::next_permutation(std::begin(J), std::end(J)));
926 }
927
928 // Various real-world funky triples. The value returned by GCC's config.sub
929 // is given in the comment.
930 EXPECT_EQ("i386-unknown-windows-gnu",
931 Triple::normalize("i386-mingw32")); // i386-pc-mingw32
932 EXPECT_EQ("x86_64-unknown-linux-gnu",
933 Triple::normalize("x86_64-linux-gnu")); // x86_64-pc-linux-gnu
934 EXPECT_EQ("i486-unknown-linux-gnu",
935 Triple::normalize("i486-linux-gnu")); // i486-pc-linux-gnu
936 EXPECT_EQ("i386-redhat-linux",
937 Triple::normalize("i386-redhat-linux")); // i386-redhat-linux-gnu
938 EXPECT_EQ("i686-unknown-linux",
939 Triple::normalize("i686-linux")); // i686-pc-linux-gnu
940 EXPECT_EQ("arm-none-unknown-eabi",
941 Triple::normalize("arm-none-eabi")); // arm-none-eabi
942 EXPECT_EQ("ve-unknown-linux",
943 Triple::normalize("ve-linux")); // ve-linux
944 EXPECT_EQ("wasm32-unknown-wasi",
945 Triple::normalize("wasm32-wasi")); // wasm32-unknown-wasi
946 EXPECT_EQ("wasm64-unknown-wasi",
947 Triple::normalize("wasm64-wasi")); // wasm64-unknown-wasi
948 }
949
TEST(TripleTest,MutateName)950 TEST(TripleTest, MutateName) {
951 Triple T;
952 EXPECT_EQ(Triple::UnknownArch, T.getArch());
953 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
954 EXPECT_EQ(Triple::UnknownOS, T.getOS());
955 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
956
957 T.setArchName("i386");
958 EXPECT_EQ(Triple::x86, T.getArch());
959 EXPECT_EQ("i386--", T.getTriple());
960
961 T.setVendorName("pc");
962 EXPECT_EQ(Triple::x86, T.getArch());
963 EXPECT_EQ(Triple::PC, T.getVendor());
964 EXPECT_EQ("i386-pc-", T.getTriple());
965
966 T.setOSName("linux");
967 EXPECT_EQ(Triple::x86, T.getArch());
968 EXPECT_EQ(Triple::PC, T.getVendor());
969 EXPECT_EQ(Triple::Linux, T.getOS());
970 EXPECT_EQ("i386-pc-linux", T.getTriple());
971
972 T.setEnvironmentName("gnu");
973 EXPECT_EQ(Triple::x86, T.getArch());
974 EXPECT_EQ(Triple::PC, T.getVendor());
975 EXPECT_EQ(Triple::Linux, T.getOS());
976 EXPECT_EQ("i386-pc-linux-gnu", T.getTriple());
977
978 T.setOSName("freebsd");
979 EXPECT_EQ(Triple::x86, T.getArch());
980 EXPECT_EQ(Triple::PC, T.getVendor());
981 EXPECT_EQ(Triple::FreeBSD, T.getOS());
982 EXPECT_EQ("i386-pc-freebsd-gnu", T.getTriple());
983
984 T.setOSAndEnvironmentName("darwin");
985 EXPECT_EQ(Triple::x86, T.getArch());
986 EXPECT_EQ(Triple::PC, T.getVendor());
987 EXPECT_EQ(Triple::Darwin, T.getOS());
988 EXPECT_EQ("i386-pc-darwin", T.getTriple());
989 }
990
TEST(TripleTest,BitWidthPredicates)991 TEST(TripleTest, BitWidthPredicates) {
992 Triple T;
993 EXPECT_FALSE(T.isArch16Bit());
994 EXPECT_FALSE(T.isArch32Bit());
995 EXPECT_FALSE(T.isArch64Bit());
996
997 T.setArch(Triple::arm);
998 EXPECT_FALSE(T.isArch16Bit());
999 EXPECT_TRUE(T.isArch32Bit());
1000 EXPECT_FALSE(T.isArch64Bit());
1001
1002 T.setArch(Triple::hexagon);
1003 EXPECT_FALSE(T.isArch16Bit());
1004 EXPECT_TRUE(T.isArch32Bit());
1005 EXPECT_FALSE(T.isArch64Bit());
1006
1007 T.setArch(Triple::mips);
1008 EXPECT_FALSE(T.isArch16Bit());
1009 EXPECT_TRUE(T.isArch32Bit());
1010 EXPECT_FALSE(T.isArch64Bit());
1011
1012 T.setArch(Triple::mips64);
1013 EXPECT_FALSE(T.isArch16Bit());
1014 EXPECT_FALSE(T.isArch32Bit());
1015 EXPECT_TRUE(T.isArch64Bit());
1016
1017 T.setArch(Triple::msp430);
1018 EXPECT_TRUE(T.isArch16Bit());
1019 EXPECT_FALSE(T.isArch32Bit());
1020 EXPECT_FALSE(T.isArch64Bit());
1021
1022 T.setArch(Triple::ppc);
1023 EXPECT_FALSE(T.isArch16Bit());
1024 EXPECT_TRUE(T.isArch32Bit());
1025 EXPECT_FALSE(T.isArch64Bit());
1026
1027 T.setArch(Triple::ppc64);
1028 EXPECT_FALSE(T.isArch16Bit());
1029 EXPECT_FALSE(T.isArch32Bit());
1030 EXPECT_TRUE(T.isArch64Bit());
1031
1032 T.setArch(Triple::x86);
1033 EXPECT_FALSE(T.isArch16Bit());
1034 EXPECT_TRUE(T.isArch32Bit());
1035 EXPECT_FALSE(T.isArch64Bit());
1036
1037 T.setArch(Triple::x86_64);
1038 EXPECT_FALSE(T.isArch16Bit());
1039 EXPECT_FALSE(T.isArch32Bit());
1040 EXPECT_TRUE(T.isArch64Bit());
1041
1042 T.setArch(Triple::amdil);
1043 EXPECT_FALSE(T.isArch16Bit());
1044 EXPECT_TRUE(T.isArch32Bit());
1045 EXPECT_FALSE(T.isArch64Bit());
1046
1047 T.setArch(Triple::amdil64);
1048 EXPECT_FALSE(T.isArch16Bit());
1049 EXPECT_FALSE(T.isArch32Bit());
1050 EXPECT_TRUE(T.isArch64Bit());
1051
1052 T.setArch(Triple::hsail);
1053 EXPECT_FALSE(T.isArch16Bit());
1054 EXPECT_TRUE(T.isArch32Bit());
1055 EXPECT_FALSE(T.isArch64Bit());
1056
1057 T.setArch(Triple::hsail64);
1058 EXPECT_FALSE(T.isArch16Bit());
1059 EXPECT_FALSE(T.isArch32Bit());
1060 EXPECT_TRUE(T.isArch64Bit());
1061
1062 T.setArch(Triple::spir);
1063 EXPECT_FALSE(T.isArch16Bit());
1064 EXPECT_TRUE(T.isArch32Bit());
1065 EXPECT_FALSE(T.isArch64Bit());
1066
1067 T.setArch(Triple::spir64);
1068 EXPECT_FALSE(T.isArch16Bit());
1069 EXPECT_FALSE(T.isArch32Bit());
1070 EXPECT_TRUE(T.isArch64Bit());
1071
1072 T.setArch(Triple::spirv32);
1073 EXPECT_FALSE(T.isArch16Bit());
1074 EXPECT_TRUE(T.isArch32Bit());
1075 EXPECT_FALSE(T.isArch64Bit());
1076 EXPECT_TRUE(T.isSPIRV());
1077
1078 T.setArch(Triple::spirv64);
1079 EXPECT_FALSE(T.isArch16Bit());
1080 EXPECT_FALSE(T.isArch32Bit());
1081 EXPECT_TRUE(T.isArch64Bit());
1082 EXPECT_TRUE(T.isSPIRV());
1083
1084 T.setArch(Triple::sparc);
1085 EXPECT_FALSE(T.isArch16Bit());
1086 EXPECT_TRUE(T.isArch32Bit());
1087 EXPECT_FALSE(T.isArch64Bit());
1088
1089 T.setArch(Triple::sparcel);
1090 EXPECT_FALSE(T.isArch16Bit());
1091 EXPECT_TRUE(T.isArch32Bit());
1092 EXPECT_FALSE(T.isArch64Bit());
1093
1094 T.setArch(Triple::sparcv9);
1095 EXPECT_FALSE(T.isArch16Bit());
1096 EXPECT_FALSE(T.isArch32Bit());
1097 EXPECT_TRUE(T.isArch64Bit());
1098
1099 T.setArch(Triple::wasm32);
1100 EXPECT_FALSE(T.isArch16Bit());
1101 EXPECT_TRUE(T.isArch32Bit());
1102 EXPECT_FALSE(T.isArch64Bit());
1103
1104 T.setArch(Triple::wasm64);
1105 EXPECT_FALSE(T.isArch16Bit());
1106 EXPECT_FALSE(T.isArch32Bit());
1107 EXPECT_TRUE(T.isArch64Bit());
1108
1109 T.setArch(Triple::avr);
1110 EXPECT_TRUE(T.isArch16Bit());
1111 EXPECT_FALSE(T.isArch32Bit());
1112 EXPECT_FALSE(T.isArch64Bit());
1113
1114 T.setArch(Triple::lanai);
1115 EXPECT_FALSE(T.isArch16Bit());
1116 EXPECT_TRUE(T.isArch32Bit());
1117 EXPECT_FALSE(T.isArch64Bit());
1118
1119 T.setArch(Triple::riscv32);
1120 EXPECT_FALSE(T.isArch16Bit());
1121 EXPECT_TRUE(T.isArch32Bit());
1122 EXPECT_FALSE(T.isArch64Bit());
1123 EXPECT_TRUE(T.isRISCV());
1124
1125 T.setArch(Triple::riscv64);
1126 EXPECT_FALSE(T.isArch16Bit());
1127 EXPECT_FALSE(T.isArch32Bit());
1128 EXPECT_TRUE(T.isArch64Bit());
1129 EXPECT_TRUE(T.isRISCV());
1130
1131 T.setArch(Triple::csky);
1132 EXPECT_FALSE(T.isArch16Bit());
1133 EXPECT_TRUE(T.isArch32Bit());
1134 EXPECT_FALSE(T.isArch64Bit());
1135 EXPECT_TRUE(T.isCSKY());
1136
1137 T.setArch(Triple::loongarch32);
1138 EXPECT_FALSE(T.isArch16Bit());
1139 EXPECT_TRUE(T.isArch32Bit());
1140 EXPECT_FALSE(T.isArch64Bit());
1141 EXPECT_TRUE(T.isLoongArch());
1142
1143 T.setArch(Triple::loongarch64);
1144 EXPECT_FALSE(T.isArch16Bit());
1145 EXPECT_FALSE(T.isArch32Bit());
1146 EXPECT_TRUE(T.isArch64Bit());
1147 EXPECT_TRUE(T.isLoongArch());
1148
1149 T.setArch(Triple::dxil);
1150 EXPECT_FALSE(T.isArch16Bit());
1151 EXPECT_TRUE(T.isArch32Bit());
1152 EXPECT_FALSE(T.isArch64Bit());
1153 EXPECT_TRUE(T.isDXIL());
1154 }
1155
TEST(TripleTest,BitWidthArchVariants)1156 TEST(TripleTest, BitWidthArchVariants) {
1157 Triple T;
1158 EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
1159 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1160
1161 T.setArch(Triple::UnknownArch);
1162 EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
1163 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1164
1165 T.setArch(Triple::mips);
1166 EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1167 EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
1168 EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1169 EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
1170
1171 T.setArch(Triple::mips, Triple::MipsSubArch_r6);
1172 EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1173 EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
1174 EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1175 EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
1176
1177 T.setArch(Triple::mipsel);
1178 EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1179 EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
1180 EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1181 EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
1182
1183 T.setArch(Triple::mipsel, Triple::MipsSubArch_r6);
1184 EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1185 EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
1186 EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1187 EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
1188
1189 T.setArch(Triple::ppc);
1190 EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
1191 EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
1192
1193 T.setArch(Triple::nvptx);
1194 EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
1195 EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
1196
1197 T.setArch(Triple::sparc);
1198 EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
1199 EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
1200
1201 T.setArch(Triple::x86);
1202 EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
1203 EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
1204
1205 T.setArch(Triple::mips64);
1206 EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1207 EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
1208 EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1209 EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
1210
1211 T.setArch(Triple::mips64, Triple::MipsSubArch_r6);
1212 EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1213 EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
1214 EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1215 EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
1216
1217 T.setArch(Triple::mips64el);
1218 EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1219 EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
1220 EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1221 EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
1222
1223 T.setArch(Triple::mips64el, Triple::MipsSubArch_r6);
1224 EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1225 EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
1226 EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1227 EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
1228
1229 T.setArch(Triple::ppc64);
1230 EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
1231 EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
1232
1233 T.setArch(Triple::nvptx64);
1234 EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
1235 EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
1236
1237 T.setArch(Triple::sparcv9);
1238 EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
1239 EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
1240
1241 T.setArch(Triple::x86_64);
1242 EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
1243 EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
1244
1245 T.setArch(Triple::amdil);
1246 EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
1247 EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
1248
1249 T.setArch(Triple::amdil64);
1250 EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
1251 EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
1252
1253 T.setArch(Triple::hsail);
1254 EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
1255 EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
1256
1257 T.setArch(Triple::hsail64);
1258 EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
1259 EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
1260
1261 T.setArch(Triple::spir);
1262 EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
1263 EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
1264
1265 T.setArch(Triple::spir64);
1266 EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
1267 EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
1268
1269 T.setArch(Triple::spirv32);
1270 EXPECT_EQ(Triple::spirv32, T.get32BitArchVariant().getArch());
1271 EXPECT_EQ(Triple::spirv64, T.get64BitArchVariant().getArch());
1272
1273 T.setArch(Triple::spirv64);
1274 EXPECT_EQ(Triple::spirv32, T.get32BitArchVariant().getArch());
1275 EXPECT_EQ(Triple::spirv64, T.get64BitArchVariant().getArch());
1276
1277 T.setArch(Triple::wasm32);
1278 EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
1279 EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
1280
1281 T.setArch(Triple::wasm64);
1282 EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
1283 EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
1284
1285 T.setArch(Triple::riscv32);
1286 EXPECT_EQ(Triple::riscv32, T.get32BitArchVariant().getArch());
1287 EXPECT_EQ(Triple::riscv64, T.get64BitArchVariant().getArch());
1288
1289 T.setArch(Triple::riscv64);
1290 EXPECT_EQ(Triple::riscv32, T.get32BitArchVariant().getArch());
1291 EXPECT_EQ(Triple::riscv64, T.get64BitArchVariant().getArch());
1292
1293 T.setArch(Triple::csky);
1294 EXPECT_EQ(Triple::csky, T.get32BitArchVariant().getArch());
1295 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1296
1297 T.setArch(Triple::loongarch32);
1298 EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
1299 EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());
1300
1301 T.setArch(Triple::loongarch64);
1302 EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
1303 EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());
1304
1305 T.setArch(Triple::thumbeb);
1306 EXPECT_EQ(Triple::thumbeb, T.get32BitArchVariant().getArch());
1307 EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1308
1309 T.setArch(Triple::thumb);
1310 EXPECT_EQ(Triple::thumb, T.get32BitArchVariant().getArch());
1311 EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1312
1313 T.setArch(Triple::aarch64);
1314 EXPECT_EQ(Triple::arm, T.get32BitArchVariant().getArch());
1315 EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1316
1317 T.setArch(Triple::aarch64_be);
1318 EXPECT_EQ(Triple::armeb, T.get32BitArchVariant().getArch());
1319 EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1320
1321 T.setArch(Triple::renderscript32);
1322 EXPECT_EQ(Triple::renderscript32, T.get32BitArchVariant().getArch());
1323 EXPECT_EQ(Triple::renderscript64, T.get64BitArchVariant().getArch());
1324
1325 T.setArch(Triple::renderscript64);
1326 EXPECT_EQ(Triple::renderscript32, T.get32BitArchVariant().getArch());
1327 EXPECT_EQ(Triple::renderscript64, T.get64BitArchVariant().getArch());
1328
1329 T.setArch(Triple::armeb);
1330 EXPECT_EQ(Triple::armeb, T.get32BitArchVariant().getArch());
1331 EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1332
1333 T.setArch(Triple::arm);
1334 EXPECT_EQ(Triple::arm, T.get32BitArchVariant().getArch());
1335 EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1336
1337 T.setArch(Triple::systemz);
1338 EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
1339 EXPECT_EQ(Triple::systemz, T.get64BitArchVariant().getArch());
1340
1341 T.setArch(Triple::xcore);
1342 EXPECT_EQ(Triple::xcore, T.get32BitArchVariant().getArch());
1343 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1344
1345 T.setArch(Triple::dxil);
1346 EXPECT_EQ(Triple::dxil, T.get32BitArchVariant().getArch());
1347 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1348 }
1349
TEST(TripleTest,EndianArchVariants)1350 TEST(TripleTest, EndianArchVariants) {
1351 Triple T;
1352 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1353 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1354
1355 T.setArch(Triple::UnknownArch);
1356 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1357 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1358
1359 T.setArch(Triple::aarch64_be);
1360 EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
1361 EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
1362
1363 T.setArch(Triple::aarch64);
1364 EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
1365 EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
1366
1367 T.setArch(Triple::armeb);
1368 EXPECT_EQ(Triple::armeb, T.getBigEndianArchVariant().getArch());
1369 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1370
1371 T.setArch(Triple::arm);
1372 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1373 EXPECT_EQ(Triple::arm, T.getLittleEndianArchVariant().getArch());
1374 T = Triple("arm");
1375 EXPECT_TRUE(T.isLittleEndian());
1376 T = Triple("thumb");
1377 EXPECT_TRUE(T.isLittleEndian());
1378 T = Triple("armeb");
1379 EXPECT_FALSE(T.isLittleEndian());
1380 T = Triple("thumbeb");
1381 EXPECT_FALSE(T.isLittleEndian());
1382
1383 T.setArch(Triple::bpfeb);
1384 EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
1385 EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
1386
1387 T.setArch(Triple::bpfel);
1388 EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
1389 EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
1390
1391 T.setArch(Triple::mips64);
1392 EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1393 EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1394 EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1395 EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1396
1397 T.setArch(Triple::mips64, Triple::MipsSubArch_r6);
1398 EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1399 EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1400 EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1401 EXPECT_EQ(Triple::MipsSubArch_r6,
1402 T.getLittleEndianArchVariant().getSubArch());
1403
1404 T.setArch(Triple::mips64el);
1405 EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1406 EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1407 EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1408 EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1409
1410 T.setArch(Triple::mips64el, Triple::MipsSubArch_r6);
1411 EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1412 EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1413 EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1414 EXPECT_EQ(Triple::MipsSubArch_r6,
1415 T.getLittleEndianArchVariant().getSubArch());
1416
1417 T.setArch(Triple::mips);
1418 EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1419 EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1420 EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1421 EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1422
1423 T.setArch(Triple::mips, Triple::MipsSubArch_r6);
1424 EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1425 EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1426 EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1427 EXPECT_EQ(Triple::MipsSubArch_r6,
1428 T.getLittleEndianArchVariant().getSubArch());
1429
1430 T.setArch(Triple::mipsel);
1431 EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1432 EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1433 EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1434 EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1435
1436 T.setArch(Triple::mipsel, Triple::MipsSubArch_r6);
1437 EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1438 EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1439 EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1440 EXPECT_EQ(Triple::MipsSubArch_r6,
1441 T.getLittleEndianArchVariant().getSubArch());
1442
1443 T.setArch(Triple::ppc);
1444 EXPECT_EQ(Triple::ppc, T.getBigEndianArchVariant().getArch());
1445 EXPECT_EQ(Triple::ppcle, T.getLittleEndianArchVariant().getArch());
1446
1447 T.setArch(Triple::ppc64);
1448 EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
1449 EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
1450
1451 T.setArch(Triple::ppc64le);
1452 EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
1453 EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
1454
1455 T.setArch(Triple::sparc);
1456 EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
1457 EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
1458
1459 T.setArch(Triple::sparcel);
1460 EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
1461 EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
1462
1463 T.setArch(Triple::thumb);
1464 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1465 EXPECT_EQ(Triple::thumb, T.getLittleEndianArchVariant().getArch());
1466
1467 T.setArch(Triple::thumbeb);
1468 EXPECT_EQ(Triple::thumbeb, T.getBigEndianArchVariant().getArch());
1469 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1470
1471 T.setArch(Triple::lanai);
1472 EXPECT_EQ(Triple::lanai, T.getBigEndianArchVariant().getArch());
1473 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1474
1475 T.setArch(Triple::tcele);
1476 EXPECT_EQ(Triple::tce, T.getBigEndianArchVariant().getArch());
1477 EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());
1478
1479 T.setArch(Triple::tce);
1480 EXPECT_EQ(Triple::tce, T.getBigEndianArchVariant().getArch());
1481 EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());
1482
1483 T.setArch(Triple::csky);
1484 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1485 EXPECT_EQ(Triple::csky, T.getLittleEndianArchVariant().getArch());
1486
1487 T.setArch(Triple::loongarch32);
1488 EXPECT_TRUE(T.isLittleEndian());
1489 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1490 EXPECT_EQ(Triple::loongarch32, T.getLittleEndianArchVariant().getArch());
1491
1492 T.setArch(Triple::loongarch64);
1493 EXPECT_TRUE(T.isLittleEndian());
1494 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1495 EXPECT_EQ(Triple::loongarch64, T.getLittleEndianArchVariant().getArch());
1496
1497 T.setArch(Triple::dxil);
1498 EXPECT_TRUE(T.isLittleEndian());
1499 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1500 EXPECT_EQ(Triple::dxil, T.getLittleEndianArchVariant().getArch());
1501 }
1502
TEST(TripleTest,getOSVersion)1503 TEST(TripleTest, getOSVersion) {
1504 Triple T;
1505 VersionTuple Version;
1506
1507 T = Triple("i386-apple-darwin9");
1508 EXPECT_TRUE(T.isMacOSX());
1509 EXPECT_FALSE(T.isiOS());
1510 EXPECT_FALSE(T.isArch16Bit());
1511 EXPECT_TRUE(T.isArch32Bit());
1512 EXPECT_FALSE(T.isArch64Bit());
1513 T.getMacOSXVersion(Version);
1514 EXPECT_EQ(VersionTuple(10, 5), Version);
1515 Version = T.getiOSVersion();
1516 EXPECT_EQ(VersionTuple(5), Version);
1517
1518 T = Triple("x86_64-apple-darwin9");
1519 EXPECT_TRUE(T.isMacOSX());
1520 EXPECT_FALSE(T.isiOS());
1521 EXPECT_FALSE(T.isArch16Bit());
1522 EXPECT_FALSE(T.isArch32Bit());
1523 EXPECT_TRUE(T.isArch64Bit());
1524 T.getMacOSXVersion(Version);
1525 EXPECT_EQ(VersionTuple(10, 5), Version);
1526 Version = T.getiOSVersion();
1527 EXPECT_EQ(VersionTuple(5), Version);
1528
1529 T = Triple("x86_64-apple-macosx");
1530 EXPECT_TRUE(T.isMacOSX());
1531 EXPECT_FALSE(T.isiOS());
1532 EXPECT_FALSE(T.isArch16Bit());
1533 EXPECT_FALSE(T.isArch32Bit());
1534 EXPECT_TRUE(T.isArch64Bit());
1535 T.getMacOSXVersion(Version);
1536 EXPECT_EQ(VersionTuple(10, 4), Version);
1537 Version = T.getiOSVersion();
1538 EXPECT_EQ(VersionTuple(5), Version);
1539
1540 T = Triple("x86_64-apple-macosx10.7");
1541 EXPECT_TRUE(T.isMacOSX());
1542 EXPECT_FALSE(T.isiOS());
1543 EXPECT_FALSE(T.isArch16Bit());
1544 EXPECT_FALSE(T.isArch32Bit());
1545 EXPECT_TRUE(T.isArch64Bit());
1546 T.getMacOSXVersion(Version);
1547 EXPECT_EQ(VersionTuple(10, 7), Version);
1548 Version = T.getiOSVersion();
1549 EXPECT_EQ(VersionTuple(5), Version);
1550
1551 T = Triple("x86_64-apple-macos11.0");
1552 EXPECT_TRUE(T.isMacOSX());
1553 EXPECT_FALSE(T.isiOS());
1554 EXPECT_FALSE(T.isArch16Bit());
1555 EXPECT_FALSE(T.isArch32Bit());
1556 EXPECT_TRUE(T.isArch64Bit());
1557 T.getMacOSXVersion(Version);
1558 EXPECT_EQ(VersionTuple(11, 0), Version);
1559
1560 T = Triple("arm64-apple-macosx11.5.8");
1561 EXPECT_TRUE(T.isMacOSX());
1562 EXPECT_FALSE(T.isiOS());
1563 EXPECT_FALSE(T.isArch16Bit());
1564 EXPECT_FALSE(T.isArch32Bit());
1565 EXPECT_TRUE(T.isArch64Bit());
1566 T.getMacOSXVersion(Version);
1567 EXPECT_EQ(VersionTuple(11, 5, 8), Version);
1568
1569 // 10.16 forms a valid triple, even though it's not
1570 // a version of a macOS.
1571 T = Triple("x86_64-apple-macos10.16");
1572 EXPECT_TRUE(T.isMacOSX());
1573 T.getMacOSXVersion(Version);
1574 EXPECT_EQ(VersionTuple(10, 16), Version);
1575
1576 T = Triple("x86_64-apple-darwin20");
1577 EXPECT_TRUE(T.isMacOSX());
1578 T.getMacOSXVersion(Version);
1579 EXPECT_EQ(VersionTuple(11), Version);
1580
1581 // For darwin triples on macOS 11, only compare the major version.
1582 T = Triple("x86_64-apple-darwin20.2");
1583 EXPECT_TRUE(T.isMacOSX());
1584 T.getMacOSXVersion(Version);
1585 EXPECT_EQ(VersionTuple(11), Version);
1586
1587 T = Triple("armv7-apple-ios");
1588 EXPECT_FALSE(T.isMacOSX());
1589 EXPECT_TRUE(T.isiOS());
1590 EXPECT_FALSE(T.isArch16Bit());
1591 EXPECT_TRUE(T.isArch32Bit());
1592 EXPECT_FALSE(T.isArch64Bit());
1593 T.getMacOSXVersion(Version);
1594 EXPECT_EQ(VersionTuple(10, 4), Version);
1595 Version = T.getiOSVersion();
1596 EXPECT_EQ(VersionTuple(5), Version);
1597
1598 T = Triple("armv7-apple-ios7.0");
1599 EXPECT_FALSE(T.isMacOSX());
1600 EXPECT_TRUE(T.isiOS());
1601 EXPECT_FALSE(T.isArch16Bit());
1602 EXPECT_TRUE(T.isArch32Bit());
1603 EXPECT_FALSE(T.isArch64Bit());
1604 T.getMacOSXVersion(Version);
1605 EXPECT_EQ(VersionTuple(10, 4), Version);
1606 Version = T.getiOSVersion();
1607 EXPECT_EQ(VersionTuple(7, 0), Version);
1608 EXPECT_FALSE(T.isSimulatorEnvironment());
1609
1610 T = Triple("x86_64-apple-ios10.3-simulator");
1611 EXPECT_TRUE(T.isiOS());
1612 Version = T.getiOSVersion();
1613 EXPECT_EQ(VersionTuple(10, 3), Version);
1614 EXPECT_TRUE(T.isSimulatorEnvironment());
1615 EXPECT_FALSE(T.isMacCatalystEnvironment());
1616
1617 T = Triple("x86_64-apple-ios13.0-macabi");
1618 EXPECT_TRUE(T.isiOS());
1619 Version = T.getiOSVersion();
1620 EXPECT_EQ(VersionTuple(13, 0), Version);
1621 EXPECT_TRUE(T.getEnvironment() == Triple::MacABI);
1622 EXPECT_TRUE(T.isMacCatalystEnvironment());
1623 EXPECT_FALSE(T.isSimulatorEnvironment());
1624
1625 T = Triple("x86_64-apple-driverkit20.1.0");
1626 EXPECT_TRUE(T.isDriverKit());
1627 EXPECT_TRUE(T.isOSDarwin());
1628 EXPECT_FALSE(T.isMacOSX());
1629 EXPECT_FALSE(T.isiOS());
1630 Version = T.getDriverKitVersion();
1631 EXPECT_EQ(VersionTuple(20, 1), Version);
1632
1633 T = Triple("x86_64-apple-driverkit20");
1634 Version = T.getDriverKitVersion();
1635 EXPECT_EQ(VersionTuple(20, 0), Version);
1636
1637 // DriverKit version should default to 19.0.
1638 T = Triple("x86_64-apple-driverkit");
1639 Version = T.getDriverKitVersion();
1640 EXPECT_EQ(VersionTuple(19, 0), Version);
1641
1642 T = Triple("dxil-unknown-shadermodel6.6-pixel");
1643 EXPECT_EQ(Triple::dxil, T.getArch());
1644 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1645 EXPECT_EQ(Triple::ShaderModel, T.getOS());
1646 Version = T.getOSVersion();
1647 EXPECT_EQ(VersionTuple(6, 6), Version);
1648 EXPECT_EQ(Triple::Pixel, T.getEnvironment());
1649
1650 T = Triple("dxil-unknown-shadermodel6.0-pixel");
1651 EXPECT_EQ(Triple::dxil, T.getArch());
1652 EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1653 EXPECT_EQ(Triple::ShaderModel, T.getOS());
1654 Version = T.getOSVersion();
1655 EXPECT_EQ(VersionTuple(6, 0), Version);
1656 EXPECT_EQ(Triple::Pixel, T.getEnvironment());
1657 }
1658
TEST(TripleTest,getEnvironmentVersion)1659 TEST(TripleTest, getEnvironmentVersion) {
1660 Triple T;
1661 VersionTuple Version;
1662
1663 T = Triple("arm-unknown-linux-android16");
1664 EXPECT_TRUE(T.isAndroid());
1665 Version = T.getEnvironmentVersion();
1666 EXPECT_EQ(VersionTuple(16), Version);
1667 EXPECT_EQ(Triple::Android, T.getEnvironment());
1668
1669 T = Triple("aarch64-unknown-linux-android21");
1670 EXPECT_TRUE(T.isAndroid());
1671 Version = T.getEnvironmentVersion();
1672 EXPECT_EQ(VersionTuple(21), Version);
1673 EXPECT_EQ(Triple::Android, T.getEnvironment());
1674 }
1675
TEST(TripleTest,isMacOSVersionLT)1676 TEST(TripleTest, isMacOSVersionLT) {
1677 Triple T = Triple("x86_64-apple-macos11");
1678 EXPECT_TRUE(T.isMacOSXVersionLT(11, 1, 0));
1679 EXPECT_FALSE(T.isMacOSXVersionLT(10, 15, 0));
1680
1681 T = Triple("x86_64-apple-darwin20");
1682 EXPECT_TRUE(T.isMacOSXVersionLT(11, 1, 0));
1683 EXPECT_FALSE(T.isMacOSXVersionLT(11, 0, 0));
1684 EXPECT_FALSE(T.isMacOSXVersionLT(10, 15, 0));
1685 }
1686
TEST(TripleTest,CanonicalizeOSVersion)1687 TEST(TripleTest, CanonicalizeOSVersion) {
1688 EXPECT_EQ(VersionTuple(10, 15, 4),
1689 Triple::getCanonicalVersionForOS(Triple::MacOSX,
1690 VersionTuple(10, 15, 4)));
1691 EXPECT_EQ(VersionTuple(11, 0), Triple::getCanonicalVersionForOS(
1692 Triple::MacOSX, VersionTuple(10, 16)));
1693 EXPECT_EQ(VersionTuple(20),
1694 Triple::getCanonicalVersionForOS(Triple::Darwin, VersionTuple(20)));
1695 }
1696
TEST(TripleTest,FileFormat)1697 TEST(TripleTest, FileFormat) {
1698 EXPECT_EQ(Triple::ELF, Triple("i686-unknown-linux-gnu").getObjectFormat());
1699 EXPECT_EQ(Triple::ELF, Triple("i686-unknown-freebsd").getObjectFormat());
1700 EXPECT_EQ(Triple::ELF, Triple("i686-unknown-netbsd").getObjectFormat());
1701 EXPECT_EQ(Triple::ELF, Triple("i686--win32-elf").getObjectFormat());
1702 EXPECT_EQ(Triple::ELF, Triple("i686---elf").getObjectFormat());
1703
1704 EXPECT_EQ(Triple::MachO, Triple("i686-apple-macosx").getObjectFormat());
1705 EXPECT_EQ(Triple::MachO, Triple("i686-apple-ios").getObjectFormat());
1706 EXPECT_EQ(Triple::MachO, Triple("i686---macho").getObjectFormat());
1707
1708 EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat());
1709
1710 EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat());
1711 EXPECT_EQ(Triple::ELF, Triple("i686-pc-cygwin-elf").getObjectFormat());
1712
1713 EXPECT_EQ(Triple::ELF, Triple("systemz-ibm-linux").getObjectFormat());
1714 EXPECT_EQ(Triple::ELF, Triple("systemz-ibm-unknown").getObjectFormat());
1715
1716 EXPECT_EQ(Triple::GOFF, Triple("s390x-ibm-zos").getObjectFormat());
1717 EXPECT_EQ(Triple::GOFF, Triple("systemz-ibm-zos").getObjectFormat());
1718 EXPECT_EQ(Triple::GOFF, Triple("s390x-ibm-zos-goff").getObjectFormat());
1719 EXPECT_EQ(Triple::GOFF, Triple("s390x-unknown-zos-goff").getObjectFormat());
1720 EXPECT_EQ(Triple::GOFF, Triple("s390x---goff").getObjectFormat());
1721
1722 EXPECT_EQ(Triple::Wasm, Triple("wasm32-unknown-unknown").getObjectFormat());
1723 EXPECT_EQ(Triple::Wasm, Triple("wasm64-unknown-unknown").getObjectFormat());
1724 EXPECT_EQ(Triple::Wasm, Triple("wasm32-wasi").getObjectFormat());
1725 EXPECT_EQ(Triple::Wasm, Triple("wasm64-wasi").getObjectFormat());
1726 EXPECT_EQ(Triple::Wasm, Triple("wasm32-unknown-wasi").getObjectFormat());
1727 EXPECT_EQ(Triple::Wasm, Triple("wasm64-unknown-wasi").getObjectFormat());
1728
1729 EXPECT_EQ(Triple::Wasm,
1730 Triple("wasm32-unknown-unknown-wasm").getObjectFormat());
1731 EXPECT_EQ(Triple::Wasm,
1732 Triple("wasm64-unknown-unknown-wasm").getObjectFormat());
1733 EXPECT_EQ(Triple::Wasm,
1734 Triple("wasm32-wasi-wasm").getObjectFormat());
1735 EXPECT_EQ(Triple::Wasm,
1736 Triple("wasm64-wasi-wasm").getObjectFormat());
1737 EXPECT_EQ(Triple::Wasm,
1738 Triple("wasm32-unknown-wasi-wasm").getObjectFormat());
1739 EXPECT_EQ(Triple::Wasm,
1740 Triple("wasm64-unknown-wasi-wasm").getObjectFormat());
1741
1742 EXPECT_EQ(Triple::XCOFF, Triple("powerpc-ibm-aix").getObjectFormat());
1743 EXPECT_EQ(Triple::XCOFF, Triple("powerpc64-ibm-aix").getObjectFormat());
1744 EXPECT_EQ(Triple::XCOFF, Triple("powerpc---xcoff").getObjectFormat());
1745 EXPECT_EQ(Triple::XCOFF, Triple("powerpc64---xcoff").getObjectFormat());
1746
1747 EXPECT_EQ(Triple::ELF, Triple("csky-unknown-unknown").getObjectFormat());
1748 EXPECT_EQ(Triple::ELF, Triple("csky-unknown-linux").getObjectFormat());
1749
1750 EXPECT_EQ(Triple::SPIRV, Triple("spirv32-unknown-unknown").getObjectFormat());
1751 EXPECT_EQ(Triple::SPIRV, Triple("spirv64-unknown-unknown").getObjectFormat());
1752
1753 EXPECT_EQ(Triple::ELF,
1754 Triple("loongarch32-unknown-unknown").getObjectFormat());
1755 EXPECT_EQ(Triple::ELF, Triple("loongarch64-unknown-linux").getObjectFormat());
1756
1757 Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
1758 EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
1759
1760 Triple GNUWindowsNormalized(Triple::normalize("i686-pc-windows-gnu-elf"));
1761 EXPECT_EQ(Triple::ELF, GNUWindowsNormalized.getObjectFormat());
1762
1763 Triple CygnusNormalised(Triple::normalize("i686-pc-windows-cygnus-elf"));
1764 EXPECT_EQ(Triple::ELF, CygnusNormalised.getObjectFormat());
1765
1766 Triple CygwinNormalized(Triple::normalize("i686-pc-cygwin-elf"));
1767 EXPECT_EQ(Triple::ELF, CygwinNormalized.getObjectFormat());
1768
1769 EXPECT_EQ(Triple::DXContainer,
1770 Triple("dxil-unknown-shadermodel").getObjectFormat());
1771
1772 Triple T = Triple("");
1773 T.setObjectFormat(Triple::ELF);
1774 EXPECT_EQ(Triple::ELF, T.getObjectFormat());
1775
1776 T.setObjectFormat(Triple::MachO);
1777 EXPECT_EQ(Triple::MachO, T.getObjectFormat());
1778
1779 T.setObjectFormat(Triple::XCOFF);
1780 EXPECT_EQ(Triple::XCOFF, T.getObjectFormat());
1781
1782 T.setObjectFormat(Triple::GOFF);
1783 EXPECT_EQ(Triple::GOFF, T.getObjectFormat());
1784
1785 T.setObjectFormat(Triple::SPIRV);
1786 EXPECT_EQ(Triple::SPIRV, T.getObjectFormat());
1787 }
1788
TEST(TripleTest,NormalizeWindows)1789 TEST(TripleTest, NormalizeWindows) {
1790 EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
1791 EXPECT_EQ("i686-unknown-windows-msvc", Triple::normalize("i686-win32"));
1792 EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32"));
1793 EXPECT_EQ("i686-unknown-windows-gnu", Triple::normalize("i686-mingw32"));
1794 EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32-w64"));
1795 EXPECT_EQ("i686-unknown-windows-gnu", Triple::normalize("i686-mingw32-w64"));
1796 EXPECT_EQ("i686-pc-windows-cygnus", Triple::normalize("i686-pc-cygwin"));
1797 EXPECT_EQ("i686-unknown-windows-cygnus", Triple::normalize("i686-cygwin"));
1798
1799 EXPECT_EQ("x86_64-pc-windows-msvc", Triple::normalize("x86_64-pc-win32"));
1800 EXPECT_EQ("x86_64-unknown-windows-msvc", Triple::normalize("x86_64-win32"));
1801 EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32"));
1802 EXPECT_EQ("x86_64-unknown-windows-gnu", Triple::normalize("x86_64-mingw32"));
1803 EXPECT_EQ("x86_64-pc-windows-gnu",
1804 Triple::normalize("x86_64-pc-mingw32-w64"));
1805 EXPECT_EQ("x86_64-unknown-windows-gnu",
1806 Triple::normalize("x86_64-mingw32-w64"));
1807
1808 EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-win32-elf"));
1809 EXPECT_EQ("i686-unknown-windows-elf", Triple::normalize("i686-win32-elf"));
1810 EXPECT_EQ("i686-pc-windows-macho", Triple::normalize("i686-pc-win32-macho"));
1811 EXPECT_EQ("i686-unknown-windows-macho",
1812 Triple::normalize("i686-win32-macho"));
1813
1814 EXPECT_EQ("x86_64-pc-windows-elf", Triple::normalize("x86_64-pc-win32-elf"));
1815 EXPECT_EQ("x86_64-unknown-windows-elf",
1816 Triple::normalize("x86_64-win32-elf"));
1817 EXPECT_EQ("x86_64-pc-windows-macho",
1818 Triple::normalize("x86_64-pc-win32-macho"));
1819 EXPECT_EQ("x86_64-unknown-windows-macho",
1820 Triple::normalize("x86_64-win32-macho"));
1821
1822 EXPECT_EQ("i686-pc-windows-cygnus",
1823 Triple::normalize("i686-pc-windows-cygnus"));
1824 EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-windows-gnu"));
1825 EXPECT_EQ("i686-pc-windows-itanium",
1826 Triple::normalize("i686-pc-windows-itanium"));
1827 EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc"));
1828
1829 EXPECT_EQ("i686-pc-windows-elf",
1830 Triple::normalize("i686-pc-windows-elf-elf"));
1831
1832 EXPECT_TRUE(Triple("x86_64-pc-win32").isWindowsMSVCEnvironment());
1833 }
1834
TEST(TripleTest,NormalizeAndroid)1835 TEST(TripleTest, NormalizeAndroid) {
1836 EXPECT_EQ("arm-unknown-linux-android16",
1837 Triple::normalize("arm-linux-androideabi16"));
1838 EXPECT_EQ("armv7a-unknown-linux-android",
1839 Triple::normalize("armv7a-linux-androideabi"));
1840 EXPECT_EQ("aarch64-unknown-linux-android21",
1841 Triple::normalize("aarch64-linux-android21"));
1842 }
1843
TEST(TripleTest,getARMCPUForArch)1844 TEST(TripleTest, getARMCPUForArch) {
1845 // Platform specific defaults.
1846 {
1847 llvm::Triple Triple("arm--nacl");
1848 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch());
1849 }
1850 {
1851 llvm::Triple Triple("arm--openbsd");
1852 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch());
1853 }
1854 {
1855 llvm::Triple Triple("armv6-unknown-freebsd");
1856 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1857 }
1858 {
1859 llvm::Triple Triple("thumbv6-unknown-freebsd");
1860 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1861 }
1862 {
1863 llvm::Triple Triple("armebv6-unknown-freebsd");
1864 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1865 }
1866 {
1867 llvm::Triple Triple("arm--win32");
1868 EXPECT_EQ("cortex-a9", Triple.getARMCPUForArch());
1869 EXPECT_EQ("generic", Triple.getARMCPUForArch("armv8-a"));
1870 }
1871 // Some alternative architectures
1872 {
1873 llvm::Triple Triple("armv7k-apple-ios9");
1874 EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1875 }
1876 {
1877 llvm::Triple Triple("armv7k-apple-watchos3");
1878 EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1879 }
1880 {
1881 llvm::Triple Triple("armv7k-apple-tvos9");
1882 EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1883 }
1884 // armeb is permitted, but armebeb is not
1885 {
1886 llvm::Triple Triple("armeb-none-eabi");
1887 EXPECT_EQ("arm7tdmi", Triple.getARMCPUForArch());
1888 }
1889 {
1890 llvm::Triple Triple("armebeb-none-eabi");
1891 EXPECT_EQ("", Triple.getARMCPUForArch());
1892 }
1893 {
1894 llvm::Triple Triple("armebv6eb-none-eabi");
1895 EXPECT_EQ("", Triple.getARMCPUForArch());
1896 }
1897 // xscaleeb is permitted, but armebxscale is not
1898 {
1899 llvm::Triple Triple("xscaleeb-none-eabi");
1900 EXPECT_EQ("xscale", Triple.getARMCPUForArch());
1901 }
1902 {
1903 llvm::Triple Triple("armebxscale-none-eabi");
1904 EXPECT_EQ("", Triple.getARMCPUForArch());
1905 }
1906 }
1907
TEST(TripleTest,NormalizeARM)1908 TEST(TripleTest, NormalizeARM) {
1909 EXPECT_EQ("armv6-unknown-netbsd-eabi",
1910 Triple::normalize("armv6-netbsd-eabi"));
1911 EXPECT_EQ("armv7-unknown-netbsd-eabi",
1912 Triple::normalize("armv7-netbsd-eabi"));
1913 EXPECT_EQ("armv6eb-unknown-netbsd-eabi",
1914 Triple::normalize("armv6eb-netbsd-eabi"));
1915 EXPECT_EQ("armv7eb-unknown-netbsd-eabi",
1916 Triple::normalize("armv7eb-netbsd-eabi"));
1917 EXPECT_EQ("armv6-unknown-netbsd-eabihf",
1918 Triple::normalize("armv6-netbsd-eabihf"));
1919 EXPECT_EQ("armv7-unknown-netbsd-eabihf",
1920 Triple::normalize("armv7-netbsd-eabihf"));
1921 EXPECT_EQ("armv6eb-unknown-netbsd-eabihf",
1922 Triple::normalize("armv6eb-netbsd-eabihf"));
1923 EXPECT_EQ("armv7eb-unknown-netbsd-eabihf",
1924 Triple::normalize("armv7eb-netbsd-eabihf"));
1925
1926 EXPECT_EQ("armv7-suse-linux-gnueabihf",
1927 Triple::normalize("armv7-suse-linux-gnueabi"));
1928
1929 Triple T;
1930 T = Triple("armv6--netbsd-eabi");
1931 EXPECT_EQ(Triple::arm, T.getArch());
1932 T = Triple("armv6eb--netbsd-eabi");
1933 EXPECT_EQ(Triple::armeb, T.getArch());
1934 T = Triple("armv7-suse-linux-gnueabihf");
1935 EXPECT_EQ(Triple::GNUEABIHF, T.getEnvironment());
1936 }
1937
TEST(TripleTest,ParseARMArch)1938 TEST(TripleTest, ParseARMArch) {
1939 // ARM
1940 {
1941 Triple T = Triple("arm");
1942 EXPECT_EQ(Triple::arm, T.getArch());
1943 }
1944 {
1945 Triple T = Triple("armeb");
1946 EXPECT_EQ(Triple::armeb, T.getArch());
1947 }
1948 // THUMB
1949 {
1950 Triple T = Triple("thumb");
1951 EXPECT_EQ(Triple::thumb, T.getArch());
1952 }
1953 {
1954 Triple T = Triple("thumbeb");
1955 EXPECT_EQ(Triple::thumbeb, T.getArch());
1956 }
1957 // AARCH64
1958 {
1959 Triple T = Triple("arm64");
1960 EXPECT_EQ(Triple::aarch64, T.getArch());
1961 }
1962 {
1963 Triple T = Triple("arm64_32");
1964 EXPECT_EQ(Triple::aarch64_32, T.getArch());
1965 }
1966 {
1967 Triple T = Triple("aarch64");
1968 EXPECT_EQ(Triple::aarch64, T.getArch());
1969 }
1970 {
1971 Triple T = Triple("aarch64_be");
1972 EXPECT_EQ(Triple::aarch64_be, T.getArch());
1973 }
1974 {
1975 Triple T = Triple("arm64e");
1976 EXPECT_EQ(Triple::aarch64, T.getArch());
1977 EXPECT_EQ(Triple::AArch64SubArch_arm64e, T.getSubArch());
1978 }
1979 }
1980
TEST(TripleTest,isArmT32)1981 TEST(TripleTest, isArmT32) {
1982 // Not isArmT32
1983 {
1984 Triple T = Triple("thumbv6m");
1985 EXPECT_FALSE(T.isArmT32());
1986 }
1987 {
1988 Triple T = Triple("armv8m.base");
1989 EXPECT_FALSE(T.isArmT32());
1990 }
1991 {
1992 Triple T = Triple("armv7s");
1993 EXPECT_FALSE(T.isArmT32());
1994 }
1995 {
1996 Triple T = Triple("armv7k");
1997 EXPECT_FALSE(T.isArmT32());
1998 }
1999 {
2000 Triple T = Triple("armv7ve");
2001 EXPECT_FALSE(T.isArmT32());
2002 }
2003 {
2004 Triple T = Triple("armv6");
2005 EXPECT_FALSE(T.isArmT32());
2006 }
2007 {
2008 Triple T = Triple("armv6m");
2009 EXPECT_FALSE(T.isArmT32());
2010 }
2011 {
2012 Triple T = Triple("armv6k");
2013 EXPECT_FALSE(T.isArmT32());
2014 }
2015 {
2016 Triple T = Triple("armv6t2");
2017 EXPECT_FALSE(T.isArmT32());
2018 }
2019 {
2020 Triple T = Triple("armv5");
2021 EXPECT_FALSE(T.isArmT32());
2022 }
2023 {
2024 Triple T = Triple("armv5te");
2025 EXPECT_FALSE(T.isArmT32());
2026 }
2027 {
2028 Triple T = Triple("armv4t");
2029 EXPECT_FALSE(T.isArmT32());
2030 }
2031
2032 // isArmT32
2033 {
2034 Triple T = Triple("arm");
2035 EXPECT_TRUE(T.isArmT32());
2036 }
2037 {
2038 Triple T = Triple("armv7m");
2039 EXPECT_TRUE(T.isArmT32());
2040 }
2041 {
2042 Triple T = Triple("armv7em");
2043 EXPECT_TRUE(T.isArmT32());
2044 }
2045 {
2046 Triple T = Triple("armv8m.main");
2047 EXPECT_TRUE(T.isArmT32());
2048 }
2049 {
2050 Triple T = Triple("armv8.1m.main");
2051 EXPECT_TRUE(T.isArmT32());
2052 }
2053 }
2054
TEST(TripleTest,isArmMClass)2055 TEST(TripleTest, isArmMClass) {
2056 // not M-class
2057 {
2058 Triple T = Triple("armv7s");
2059 EXPECT_FALSE(T.isArmMClass());
2060 }
2061 {
2062 Triple T = Triple("armv7k");
2063 EXPECT_FALSE(T.isArmMClass());
2064 }
2065 {
2066 Triple T = Triple("armv7ve");
2067 EXPECT_FALSE(T.isArmMClass());
2068 }
2069 {
2070 Triple T = Triple("armv6");
2071 EXPECT_FALSE(T.isArmMClass());
2072 }
2073 {
2074 Triple T = Triple("armv6k");
2075 EXPECT_FALSE(T.isArmMClass());
2076 }
2077 {
2078 Triple T = Triple("armv6t2");
2079 EXPECT_FALSE(T.isArmMClass());
2080 }
2081 {
2082 Triple T = Triple("armv5");
2083 EXPECT_FALSE(T.isArmMClass());
2084 }
2085 {
2086 Triple T = Triple("armv5te");
2087 EXPECT_FALSE(T.isArmMClass());
2088 }
2089 {
2090 Triple T = Triple("armv4t");
2091 EXPECT_FALSE(T.isArmMClass());
2092 }
2093 {
2094 Triple T = Triple("arm");
2095 EXPECT_FALSE(T.isArmMClass());
2096 }
2097
2098 // is M-class
2099 {
2100 Triple T = Triple("armv6m");
2101 EXPECT_TRUE(T.isArmMClass());
2102 }
2103 {
2104 Triple T = Triple("armv7m");
2105 EXPECT_TRUE(T.isArmMClass());
2106 }
2107 {
2108 Triple T = Triple("armv7em");
2109 EXPECT_TRUE(T.isArmMClass());
2110 }
2111 {
2112 Triple T = Triple("armv8m.base");
2113 EXPECT_TRUE(T.isArmMClass());
2114 }
2115 {
2116 Triple T = Triple("armv8m.main");
2117 EXPECT_TRUE(T.isArmMClass());
2118 }
2119 {
2120 Triple T = Triple("armv8.1m.main");
2121 EXPECT_TRUE(T.isArmMClass());
2122 }
2123 }
2124 } // end anonymous namespace
2125