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