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