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