1 //===----------- Triple.cpp - Triple unit tests ---------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ADT/Triple.h"
10 #include "llvm/Support/VersionTuple.h"
11 #include "gtest/gtest.h"
12 
13 using namespace llvm;
14 
15 namespace {
16 
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-contiki-unknown");
91   EXPECT_EQ(Triple::x86, T.getArch());
92   EXPECT_EQ(Triple::PC, T.getVendor());
93   EXPECT_EQ(Triple::Contiki, T.getOS());
94   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
95 
96   T = Triple("i386-pc-hurd-gnu");
97   EXPECT_EQ(Triple::x86, T.getArch());
98   EXPECT_EQ(Triple::PC, T.getVendor());
99   EXPECT_EQ(Triple::Hurd, T.getOS());
100   EXPECT_EQ(Triple::GNU, T.getEnvironment());
101 
102   T = Triple("x86_64-pc-linux-gnu");
103   EXPECT_EQ(Triple::x86_64, T.getArch());
104   EXPECT_EQ(Triple::PC, T.getVendor());
105   EXPECT_EQ(Triple::Linux, T.getOS());
106   EXPECT_EQ(Triple::GNU, T.getEnvironment());
107 
108   T = Triple("x86_64-pc-linux-musl");
109   EXPECT_EQ(Triple::x86_64, T.getArch());
110   EXPECT_EQ(Triple::PC, T.getVendor());
111   EXPECT_EQ(Triple::Linux, T.getOS());
112   EXPECT_EQ(Triple::Musl, T.getEnvironment());
113 
114   T = Triple("x86_64-pc-linux-muslx32");
115   EXPECT_EQ(Triple::x86_64, T.getArch());
116   EXPECT_EQ(Triple::PC, T.getVendor());
117   EXPECT_EQ(Triple::Linux, T.getOS());
118   EXPECT_EQ(Triple::MuslX32, T.getEnvironment());
119 
120   T = Triple("arm-unknown-linux-android16");
121   EXPECT_EQ(Triple::arm, T.getArch());
122   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
123   EXPECT_EQ(Triple::Linux, T.getOS());
124   EXPECT_EQ(Triple::Android, T.getEnvironment());
125 
126   T = Triple("aarch64-unknown-linux-android21");
127   EXPECT_EQ(Triple::aarch64, T.getArch());
128   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
129   EXPECT_EQ(Triple::Linux, T.getOS());
130   EXPECT_EQ(Triple::Android, T.getEnvironment());
131 
132   // PS4 has two spellings for the vendor.
133   T = Triple("x86_64-scei-ps4");
134   EXPECT_EQ(Triple::x86_64, T.getArch());
135   EXPECT_EQ(Triple::SCEI, T.getVendor());
136   EXPECT_EQ(Triple::PS4, T.getOS());
137 
138   T = Triple("x86_64-sie-ps4");
139   EXPECT_EQ(Triple::x86_64, T.getArch());
140   EXPECT_EQ(Triple::SCEI, T.getVendor());
141   EXPECT_EQ(Triple::PS4, T.getOS());
142 
143   T = Triple("powerpc-ibm-aix");
144   EXPECT_EQ(Triple::ppc, T.getArch());
145   EXPECT_EQ(Triple::IBM, T.getVendor());
146   EXPECT_EQ(Triple::AIX, T.getOS());
147   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
148 
149   T = Triple("powerpc64-ibm-aix");
150   EXPECT_EQ(Triple::ppc64, T.getArch());
151   EXPECT_EQ(Triple::IBM, T.getVendor());
152   EXPECT_EQ(Triple::AIX, T.getOS());
153   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
154 
155   T = Triple("powerpc-dunno-notsure");
156   EXPECT_EQ(Triple::ppc, T.getArch());
157   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
158   EXPECT_EQ(Triple::UnknownOS, T.getOS());
159   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
160 
161   T = Triple("powerpcspe-unknown-freebsd");
162   EXPECT_EQ(Triple::ppc, T.getArch());
163   EXPECT_EQ(Triple::PPCSubArch_spe, T.getSubArch());
164   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
165   EXPECT_EQ(Triple::FreeBSD, T.getOS());
166   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
167 
168   T = Triple("s390x-ibm-zos");
169   EXPECT_EQ(Triple::systemz, T.getArch());
170   EXPECT_EQ(Triple::IBM, T.getVendor());
171   EXPECT_EQ(Triple::ZOS, T.getOS());
172   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
173 
174   T = Triple("systemz-ibm-zos");
175   EXPECT_EQ(Triple::systemz, T.getArch());
176   EXPECT_EQ(Triple::IBM, T.getVendor());
177   EXPECT_EQ(Triple::ZOS, T.getOS());
178   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
179 
180   T = Triple("arm-none-none-eabi");
181   EXPECT_EQ(Triple::arm, T.getArch());
182   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
183   EXPECT_EQ(Triple::UnknownOS, T.getOS());
184   EXPECT_EQ(Triple::EABI, T.getEnvironment());
185 
186   T = Triple("arm-none-linux-musleabi");
187   EXPECT_EQ(Triple::arm, T.getArch());
188   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
189   EXPECT_EQ(Triple::Linux, T.getOS());
190   EXPECT_EQ(Triple::MuslEABI, T.getEnvironment());
191 
192   T = Triple("armv6hl-none-linux-gnueabi");
193   EXPECT_EQ(Triple::arm, T.getArch());
194   EXPECT_EQ(Triple::Linux, T.getOS());
195   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
196   EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
197 
198   T = Triple("armv7hl-none-linux-gnueabi");
199   EXPECT_EQ(Triple::arm, T.getArch());
200   EXPECT_EQ(Triple::Linux, T.getOS());
201   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
202   EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
203 
204   T = Triple("amdil-unknown-unknown");
205   EXPECT_EQ(Triple::amdil, T.getArch());
206   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
207   EXPECT_EQ(Triple::UnknownOS, T.getOS());
208 
209   T = Triple("amdil64-unknown-unknown");
210   EXPECT_EQ(Triple::amdil64, T.getArch());
211   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
212   EXPECT_EQ(Triple::UnknownOS, T.getOS());
213 
214   T = Triple("hsail-unknown-unknown");
215   EXPECT_EQ(Triple::hsail, T.getArch());
216   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
217   EXPECT_EQ(Triple::UnknownOS, T.getOS());
218 
219   T = Triple("hsail64-unknown-unknown");
220   EXPECT_EQ(Triple::hsail64, T.getArch());
221   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
222   EXPECT_EQ(Triple::UnknownOS, T.getOS());
223 
224   T = Triple("sparcel-unknown-unknown");
225   EXPECT_EQ(Triple::sparcel, T.getArch());
226   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
227   EXPECT_EQ(Triple::UnknownOS, T.getOS());
228 
229   T = Triple("spir-unknown-unknown");
230   EXPECT_EQ(Triple::spir, T.getArch());
231   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
232   EXPECT_EQ(Triple::UnknownOS, T.getOS());
233 
234   T = Triple("spir64-unknown-unknown");
235   EXPECT_EQ(Triple::spir64, T.getArch());
236   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
237   EXPECT_EQ(Triple::UnknownOS, T.getOS());
238 
239   T = Triple("spirv32-unknown-unknown");
240   EXPECT_EQ(Triple::spirv32, T.getArch());
241   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
242   EXPECT_EQ(Triple::UnknownOS, T.getOS());
243 
244   T = Triple("spirv64-unknown-unknown");
245   EXPECT_EQ(Triple::spirv64, T.getArch());
246   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
247   EXPECT_EQ(Triple::UnknownOS, T.getOS());
248 
249   T = Triple("x86_64-unknown-ananas");
250   EXPECT_EQ(Triple::x86_64, T.getArch());
251   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
252   EXPECT_EQ(Triple::Ananas, T.getOS());
253   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
254 
255   T = Triple("x86_64-unknown-cloudabi");
256   EXPECT_EQ(Triple::x86_64, T.getArch());
257   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
258   EXPECT_EQ(Triple::CloudABI, T.getOS());
259   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
260 
261   T = Triple("x86_64-unknown-fuchsia");
262   EXPECT_EQ(Triple::x86_64, T.getArch());
263   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
264   EXPECT_EQ(Triple::Fuchsia, T.getOS());
265   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
266 
267   T = Triple("x86_64-unknown-hermit");
268   EXPECT_EQ(Triple::x86_64, T.getArch());
269   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
270   EXPECT_EQ(Triple::HermitCore, T.getOS());
271   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
272 
273   T = Triple("wasm32-unknown-unknown");
274   EXPECT_EQ(Triple::wasm32, T.getArch());
275   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
276   EXPECT_EQ(Triple::UnknownOS, T.getOS());
277   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
278 
279   T = Triple("wasm32-unknown-wasi");
280   EXPECT_EQ(Triple::wasm32, T.getArch());
281   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
282   EXPECT_EQ(Triple::WASI, T.getOS());
283   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
284 
285   T = Triple("wasm64-unknown-unknown");
286   EXPECT_EQ(Triple::wasm64, T.getArch());
287   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
288   EXPECT_EQ(Triple::UnknownOS, T.getOS());
289   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
290 
291   T = Triple("wasm64-unknown-wasi");
292   EXPECT_EQ(Triple::wasm64, T.getArch());
293   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
294   EXPECT_EQ(Triple::WASI, T.getOS());
295   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
296 
297   T = Triple("avr-unknown-unknown");
298   EXPECT_EQ(Triple::avr, T.getArch());
299   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
300   EXPECT_EQ(Triple::UnknownOS, T.getOS());
301   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
302 
303   T = Triple("avr");
304   EXPECT_EQ(Triple::avr, T.getArch());
305   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
306   EXPECT_EQ(Triple::UnknownOS, T.getOS());
307   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
308 
309   T = Triple("lanai-unknown-unknown");
310   EXPECT_EQ(Triple::lanai, T.getArch());
311   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
312   EXPECT_EQ(Triple::UnknownOS, T.getOS());
313   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
314 
315   T = Triple("lanai");
316   EXPECT_EQ(Triple::lanai, T.getArch());
317   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
318   EXPECT_EQ(Triple::UnknownOS, T.getOS());
319   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
320 
321   T = Triple("amdgcn-mesa-mesa3d");
322   EXPECT_EQ(Triple::amdgcn, T.getArch());
323   EXPECT_EQ(Triple::Mesa, T.getVendor());
324   EXPECT_EQ(Triple::Mesa3D, T.getOS());
325   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
326 
327   T = Triple("amdgcn-amd-amdhsa");
328   EXPECT_EQ(Triple::amdgcn, T.getArch());
329   EXPECT_EQ(Triple::AMD, T.getVendor());
330   EXPECT_EQ(Triple::AMDHSA, T.getOS());
331   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
332 
333   T = Triple("amdgcn-amd-amdpal");
334   EXPECT_EQ(Triple::amdgcn, T.getArch());
335   EXPECT_EQ(Triple::AMD, T.getVendor());
336   EXPECT_EQ(Triple::AMDPAL, T.getOS());
337   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
338 
339   T = Triple("ve-unknown-linux");
340   EXPECT_EQ(Triple::ve, T.getArch());
341   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
342   EXPECT_EQ(Triple::Linux, T.getOS());
343   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
344 
345   T = Triple("csky-unknown-unknown");
346   EXPECT_EQ(Triple::csky, T.getArch());
347   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
348   EXPECT_EQ(Triple::UnknownOS, T.getOS());
349   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
350 
351   T = Triple("csky-unknown-linux");
352   EXPECT_EQ(Triple::csky, T.getArch());
353   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
354   EXPECT_EQ(Triple::Linux, T.getOS());
355   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
356 
357   T = Triple("riscv32-unknown-unknown");
358   EXPECT_EQ(Triple::riscv32, T.getArch());
359   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
360   EXPECT_EQ(Triple::UnknownOS, T.getOS());
361   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
362 
363   T = Triple("riscv64-unknown-linux");
364   EXPECT_EQ(Triple::riscv64, T.getArch());
365   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
366   EXPECT_EQ(Triple::Linux, T.getOS());
367   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
368 
369   T = Triple("riscv64-unknown-freebsd");
370   EXPECT_EQ(Triple::riscv64, T.getArch());
371   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
372   EXPECT_EQ(Triple::FreeBSD, T.getOS());
373   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
374 
375   T = Triple("riscv64-suse-linux");
376   EXPECT_EQ(Triple::riscv64, T.getArch());
377   EXPECT_EQ(Triple::SUSE, T.getVendor());
378   EXPECT_EQ(Triple::Linux, T.getOS());
379   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
380 
381   T = Triple("armv7hl-suse-linux-gnueabi");
382   EXPECT_EQ(Triple::arm, T.getArch());
383   EXPECT_EQ(Triple::SUSE, T.getVendor());
384   EXPECT_EQ(Triple::Linux, T.getOS());
385   EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
386 
387   T = Triple("i586-pc-haiku");
388   EXPECT_EQ(Triple::x86, T.getArch());
389   EXPECT_EQ(Triple::PC, T.getVendor());
390   EXPECT_EQ(Triple::Haiku, T.getOS());
391   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
392 
393   T = Triple("x86_64-unknown-haiku");
394   EXPECT_EQ(Triple::x86_64, T.getArch());
395   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
396   EXPECT_EQ(Triple::Haiku, T.getOS());
397   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
398 
399   T = Triple("mips-mti-linux-gnu");
400   EXPECT_EQ(Triple::mips, T.getArch());
401   EXPECT_EQ(Triple::MipsTechnologies, T.getVendor());
402   EXPECT_EQ(Triple::Linux, T.getOS());
403   EXPECT_EQ(Triple::GNU, T.getEnvironment());
404 
405   T = Triple("mipsel-img-linux-gnu");
406   EXPECT_EQ(Triple::mipsel, T.getArch());
407   EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor());
408   EXPECT_EQ(Triple::Linux, T.getOS());
409   EXPECT_EQ(Triple::GNU, T.getEnvironment());
410 
411   T = Triple("mips64-mti-linux-gnu");
412   EXPECT_EQ(Triple::mips64, T.getArch());
413   EXPECT_EQ(Triple::MipsTechnologies, T.getVendor());
414   EXPECT_EQ(Triple::Linux, T.getOS());
415   EXPECT_EQ(Triple::GNU, T.getEnvironment());
416 
417   T = Triple("mips64el-img-linux-gnu");
418   EXPECT_EQ(Triple::mips64el, T.getArch());
419   EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor());
420   EXPECT_EQ(Triple::Linux, T.getOS());
421   EXPECT_EQ(Triple::GNU, T.getEnvironment());
422 
423   T = Triple("mips64el-img-linux-gnuabin32");
424   EXPECT_EQ(Triple::mips64el, T.getArch());
425   EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor());
426   EXPECT_EQ(Triple::Linux, T.getOS());
427   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
428 
429   T = Triple("mips64el-unknown-linux-gnuabi64");
430   EXPECT_EQ(Triple::mips64el, T.getArch());
431   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
432   EXPECT_EQ(Triple::Linux, T.getOS());
433   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
434   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
435   T = Triple("mips64el");
436   EXPECT_EQ(Triple::mips64el, T.getArch());
437   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
438   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
439   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
440 
441   T = Triple("mips64-unknown-linux-gnuabi64");
442   EXPECT_EQ(Triple::mips64, T.getArch());
443   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
444   EXPECT_EQ(Triple::Linux, T.getOS());
445   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
446   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
447   T = Triple("mips64");
448   EXPECT_EQ(Triple::mips64, T.getArch());
449   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
450   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
451   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
452 
453   T = Triple("mipsisa64r6el-unknown-linux-gnuabi64");
454   EXPECT_EQ(Triple::mips64el, T.getArch());
455   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
456   EXPECT_EQ(Triple::Linux, T.getOS());
457   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
458   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
459   T = Triple("mips64r6el");
460   EXPECT_EQ(Triple::mips64el, T.getArch());
461   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
462   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
463   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
464   T = Triple("mipsisa64r6el");
465   EXPECT_EQ(Triple::mips64el, T.getArch());
466   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
467   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
468   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
469 
470   T = Triple("mipsisa64r6-unknown-linux-gnuabi64");
471   EXPECT_EQ(Triple::mips64, T.getArch());
472   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
473   EXPECT_EQ(Triple::Linux, T.getOS());
474   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
475   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
476   T = Triple("mips64r6");
477   EXPECT_EQ(Triple::mips64, T.getArch());
478   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
479   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
480   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
481   T = Triple("mipsisa64r6");
482   EXPECT_EQ(Triple::mips64, T.getArch());
483   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
484   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
485   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
486 
487   T = Triple("mips64el-unknown-linux-gnuabin32");
488   EXPECT_EQ(Triple::mips64el, T.getArch());
489   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
490   EXPECT_EQ(Triple::Linux, T.getOS());
491   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
492   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
493   T = Triple("mipsn32el");
494   EXPECT_EQ(Triple::mips64el, T.getArch());
495   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
496   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
497   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
498 
499   T = Triple("mips64-unknown-linux-gnuabin32");
500   EXPECT_EQ(Triple::mips64, T.getArch());
501   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
502   EXPECT_EQ(Triple::Linux, T.getOS());
503   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
504   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
505   T = Triple("mipsn32");
506   EXPECT_EQ(Triple::mips64, T.getArch());
507   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
508   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
509   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
510 
511   T = Triple("mipsisa64r6el-unknown-linux-gnuabin32");
512   EXPECT_EQ(Triple::mips64el, T.getArch());
513   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
514   EXPECT_EQ(Triple::Linux, T.getOS());
515   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
516   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
517   T = Triple("mipsn32r6el");
518   EXPECT_EQ(Triple::mips64el, T.getArch());
519   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
520   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
521   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
522 
523   T = Triple("mipsisa64r6-unknown-linux-gnuabin32");
524   EXPECT_EQ(Triple::mips64, T.getArch());
525   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
526   EXPECT_EQ(Triple::Linux, T.getOS());
527   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
528   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
529   T = Triple("mipsn32r6");
530   EXPECT_EQ(Triple::mips64, T.getArch());
531   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
532   EXPECT_EQ(Triple::GNUABIN32, T.getEnvironment());
533   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
534 
535   T = Triple("mipsel-unknown-linux-gnu");
536   EXPECT_EQ(Triple::mipsel, T.getArch());
537   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
538   EXPECT_EQ(Triple::Linux, T.getOS());
539   EXPECT_EQ(Triple::GNU, T.getEnvironment());
540   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
541   T = Triple("mipsel");
542   EXPECT_EQ(Triple::mipsel, T.getArch());
543   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
544   EXPECT_EQ(Triple::GNU, T.getEnvironment());
545   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
546 
547   T = Triple("mips-unknown-linux-gnu");
548   EXPECT_EQ(Triple::mips, T.getArch());
549   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
550   EXPECT_EQ(Triple::Linux, T.getOS());
551   EXPECT_EQ(Triple::GNU, T.getEnvironment());
552   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
553   T = Triple("mips");
554   EXPECT_EQ(Triple::mips, T.getArch());
555   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
556   EXPECT_EQ(Triple::GNU, T.getEnvironment());
557   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
558 
559   T = Triple("mipsisa32r6el-unknown-linux-gnu");
560   EXPECT_EQ(Triple::mipsel, T.getArch());
561   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
562   EXPECT_EQ(Triple::Linux, T.getOS());
563   EXPECT_EQ(Triple::GNU, T.getEnvironment());
564   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
565   T = Triple("mipsr6el");
566   EXPECT_EQ(Triple::mipsel, T.getArch());
567   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
568   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
569   T = Triple("mipsisa32r6el");
570   EXPECT_EQ(Triple::mipsel, T.getArch());
571   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
572   EXPECT_EQ(Triple::GNU, T.getEnvironment());
573   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
574 
575   T = Triple("mipsisa32r6-unknown-linux-gnu");
576   EXPECT_EQ(Triple::mips, T.getArch());
577   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
578   EXPECT_EQ(Triple::Linux, T.getOS());
579   EXPECT_EQ(Triple::GNU, T.getEnvironment());
580   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
581   T = Triple("mipsr6");
582   EXPECT_EQ(Triple::mips, T.getArch());
583   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
584   EXPECT_EQ(Triple::GNU, T.getEnvironment());
585   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
586   T = Triple("mipsisa32r6");
587   EXPECT_EQ(Triple::mips, T.getArch());
588   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
589   EXPECT_EQ(Triple::GNU, T.getEnvironment());
590   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
591 
592   T = Triple("arm-oe-linux-gnueabi");
593   EXPECT_EQ(Triple::arm, T.getArch());
594   EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
595   EXPECT_EQ(Triple::Linux, T.getOS());
596   EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
597 
598   T = Triple("aarch64-oe-linux");
599   EXPECT_EQ(Triple::aarch64, T.getArch());
600   EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
601   EXPECT_EQ(Triple::Linux, T.getOS());
602   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
603   EXPECT_TRUE(T.isArch64Bit());
604 
605   T = Triple("arm64_32-apple-ios");
606   EXPECT_EQ(Triple::aarch64_32, T.getArch());
607   EXPECT_EQ(Triple::IOS, T.getOS());
608   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
609   EXPECT_TRUE(T.isArch32Bit());
610 
611   T = Triple("huh");
612   EXPECT_EQ(Triple::UnknownArch, T.getArch());
613 }
614 
615 static std::string Join(StringRef A, StringRef B, StringRef C) {
616   std::string Str = std::string(A);
617   Str += '-';
618   Str += B;
619   Str += '-';
620   Str += C;
621   return Str;
622 }
623 
624 static std::string Join(StringRef A, StringRef B, StringRef C, StringRef D) {
625   std::string Str = std::string(A);
626   Str += '-';
627   Str += B;
628   Str += '-';
629   Str += C;
630   Str += '-';
631   Str += D;
632   return Str;
633 }
634 
635 TEST(TripleTest, Normalization) {
636 
637   EXPECT_EQ("unknown", Triple::normalize(""));
638   EXPECT_EQ("unknown-unknown", Triple::normalize("-"));
639   EXPECT_EQ("unknown-unknown-unknown", Triple::normalize("--"));
640   EXPECT_EQ("unknown-unknown-unknown-unknown", Triple::normalize("---"));
641   EXPECT_EQ("unknown-unknown-unknown-unknown-unknown",
642             Triple::normalize("----"));
643 
644   EXPECT_EQ("a", Triple::normalize("a"));
645   EXPECT_EQ("a-b", Triple::normalize("a-b"));
646   EXPECT_EQ("a-b-c", Triple::normalize("a-b-c"));
647   EXPECT_EQ("a-b-c-d", Triple::normalize("a-b-c-d"));
648 
649   EXPECT_EQ("i386-b-c", Triple::normalize("i386-b-c"));
650   EXPECT_EQ("i386-a-c", Triple::normalize("a-i386-c"));
651   EXPECT_EQ("i386-a-b", Triple::normalize("a-b-i386"));
652   EXPECT_EQ("i386-a-b-c", Triple::normalize("a-b-c-i386"));
653 
654   EXPECT_EQ("a-pc-c", Triple::normalize("a-pc-c"));
655   EXPECT_EQ("unknown-pc-b-c", Triple::normalize("pc-b-c"));
656   EXPECT_EQ("a-pc-b", Triple::normalize("a-b-pc"));
657   EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc"));
658 
659   EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux"));
660   EXPECT_EQ("unknown-unknown-linux-b-c", Triple::normalize("linux-b-c"));
661   EXPECT_EQ("a-unknown-linux-c", Triple::normalize("a-linux-c"));
662 
663   EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386"));
664   EXPECT_EQ("i386-pc-unknown", Triple::normalize("-pc-i386"));
665   EXPECT_EQ("unknown-pc-linux-c", Triple::normalize("linux-pc-c"));
666   EXPECT_EQ("unknown-pc-linux", Triple::normalize("linux-pc-"));
667 
668   EXPECT_EQ("i386", Triple::normalize("i386"));
669   EXPECT_EQ("unknown-pc", Triple::normalize("pc"));
670   EXPECT_EQ("unknown-unknown-linux", Triple::normalize("linux"));
671 
672   EXPECT_EQ("x86_64-unknown-linux-gnu", Triple::normalize("x86_64-gnu-linux"));
673 
674   // Check that normalizing a permutated set of valid components returns a
675   // triple with the unpermuted components.
676   //
677   // We don't check every possible combination. For the set of architectures A,
678   // vendors V, operating systems O, and environments E, that would require |A|
679   // * |V| * |O| * |E| * 4! tests. Instead we check every option for any given
680   // slot and make sure it gets normalized to the correct position from every
681   // permutation. This should cover the core logic while being a tractable
682   // number of tests at (|A| + |V| + |O| + |E|) * 4!.
683   auto FirstArchType = Triple::ArchType(Triple::UnknownArch + 1);
684   auto FirstVendorType = Triple::VendorType(Triple::UnknownVendor + 1);
685   auto FirstOSType = Triple::OSType(Triple::UnknownOS + 1);
686   auto FirstEnvType = Triple::EnvironmentType(Triple::UnknownEnvironment + 1);
687   StringRef InitialC[] = {Triple::getArchTypeName(FirstArchType),
688                           Triple::getVendorTypeName(FirstVendorType),
689                           Triple::getOSTypeName(FirstOSType),
690                           Triple::getEnvironmentTypeName(FirstEnvType)};
691   for (int Arch = FirstArchType; Arch <= Triple::LastArchType; ++Arch) {
692     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
693     C[0] = Triple::getArchTypeName(Triple::ArchType(Arch));
694     std::string E = Join(C[0], C[1], C[2]);
695     int I[] = {0, 1, 2};
696     do {
697       EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
698     } while (std::next_permutation(std::begin(I), std::end(I)));
699     std::string F = Join(C[0], C[1], C[2], C[3]);
700     int J[] = {0, 1, 2, 3};
701     do {
702       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
703     } while (std::next_permutation(std::begin(J), std::end(J)));
704   }
705   for (int Vendor = FirstVendorType; Vendor <= Triple::LastVendorType;
706        ++Vendor) {
707     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
708     C[1] = Triple::getVendorTypeName(Triple::VendorType(Vendor));
709     std::string E = Join(C[0], C[1], C[2]);
710     int I[] = {0, 1, 2};
711     do {
712       EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
713     } while (std::next_permutation(std::begin(I), std::end(I)));
714     std::string F = Join(C[0], C[1], C[2], C[3]);
715     int J[] = {0, 1, 2, 3};
716     do {
717       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
718     } while (std::next_permutation(std::begin(J), std::end(J)));
719   }
720   for (int OS = FirstOSType; OS <= Triple::LastOSType; ++OS) {
721     if (OS == Triple::Win32)
722       continue;
723     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
724     C[2] = Triple::getOSTypeName(Triple::OSType(OS));
725     std::string E = Join(C[0], C[1], C[2]);
726     int I[] = {0, 1, 2};
727     do {
728       EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
729     } while (std::next_permutation(std::begin(I), std::end(I)));
730     std::string F = Join(C[0], C[1], C[2], C[3]);
731     int J[] = {0, 1, 2, 3};
732     do {
733       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
734     } while (std::next_permutation(std::begin(J), std::end(J)));
735   }
736   for (int Env = FirstEnvType; Env <= Triple::LastEnvironmentType; ++Env) {
737     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
738     C[3] = Triple::getEnvironmentTypeName(Triple::EnvironmentType(Env));
739     std::string F = Join(C[0], C[1], C[2], C[3]);
740     int J[] = {0, 1, 2, 3};
741     do {
742       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
743     } while (std::next_permutation(std::begin(J), std::end(J)));
744   }
745 
746   // Various real-world funky triples.  The value returned by GCC's config.sub
747   // is given in the comment.
748   EXPECT_EQ("i386-unknown-windows-gnu",
749             Triple::normalize("i386-mingw32")); // i386-pc-mingw32
750   EXPECT_EQ("x86_64-unknown-linux-gnu",
751             Triple::normalize("x86_64-linux-gnu")); // x86_64-pc-linux-gnu
752   EXPECT_EQ("i486-unknown-linux-gnu",
753             Triple::normalize("i486-linux-gnu")); // i486-pc-linux-gnu
754   EXPECT_EQ("i386-redhat-linux",
755             Triple::normalize("i386-redhat-linux")); // i386-redhat-linux-gnu
756   EXPECT_EQ("i686-unknown-linux",
757             Triple::normalize("i686-linux")); // i686-pc-linux-gnu
758   EXPECT_EQ("arm-none-unknown-eabi",
759             Triple::normalize("arm-none-eabi")); // arm-none-eabi
760   EXPECT_EQ("ve-unknown-linux",
761             Triple::normalize("ve-linux")); // ve-linux
762   EXPECT_EQ("wasm32-unknown-wasi",
763             Triple::normalize("wasm32-wasi")); // wasm32-unknown-wasi
764   EXPECT_EQ("wasm64-unknown-wasi",
765             Triple::normalize("wasm64-wasi")); // wasm64-unknown-wasi
766 }
767 
768 TEST(TripleTest, MutateName) {
769   Triple T;
770   EXPECT_EQ(Triple::UnknownArch, T.getArch());
771   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
772   EXPECT_EQ(Triple::UnknownOS, T.getOS());
773   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
774 
775   T.setArchName("i386");
776   EXPECT_EQ(Triple::x86, T.getArch());
777   EXPECT_EQ("i386--", T.getTriple());
778 
779   T.setVendorName("pc");
780   EXPECT_EQ(Triple::x86, T.getArch());
781   EXPECT_EQ(Triple::PC, T.getVendor());
782   EXPECT_EQ("i386-pc-", T.getTriple());
783 
784   T.setOSName("linux");
785   EXPECT_EQ(Triple::x86, T.getArch());
786   EXPECT_EQ(Triple::PC, T.getVendor());
787   EXPECT_EQ(Triple::Linux, T.getOS());
788   EXPECT_EQ("i386-pc-linux", T.getTriple());
789 
790   T.setEnvironmentName("gnu");
791   EXPECT_EQ(Triple::x86, T.getArch());
792   EXPECT_EQ(Triple::PC, T.getVendor());
793   EXPECT_EQ(Triple::Linux, T.getOS());
794   EXPECT_EQ("i386-pc-linux-gnu", T.getTriple());
795 
796   T.setOSName("freebsd");
797   EXPECT_EQ(Triple::x86, T.getArch());
798   EXPECT_EQ(Triple::PC, T.getVendor());
799   EXPECT_EQ(Triple::FreeBSD, T.getOS());
800   EXPECT_EQ("i386-pc-freebsd-gnu", T.getTriple());
801 
802   T.setOSAndEnvironmentName("darwin");
803   EXPECT_EQ(Triple::x86, T.getArch());
804   EXPECT_EQ(Triple::PC, T.getVendor());
805   EXPECT_EQ(Triple::Darwin, T.getOS());
806   EXPECT_EQ("i386-pc-darwin", T.getTriple());
807 }
808 
809 TEST(TripleTest, BitWidthPredicates) {
810   Triple T;
811   EXPECT_FALSE(T.isArch16Bit());
812   EXPECT_FALSE(T.isArch32Bit());
813   EXPECT_FALSE(T.isArch64Bit());
814 
815   T.setArch(Triple::arm);
816   EXPECT_FALSE(T.isArch16Bit());
817   EXPECT_TRUE(T.isArch32Bit());
818   EXPECT_FALSE(T.isArch64Bit());
819 
820   T.setArch(Triple::hexagon);
821   EXPECT_FALSE(T.isArch16Bit());
822   EXPECT_TRUE(T.isArch32Bit());
823   EXPECT_FALSE(T.isArch64Bit());
824 
825   T.setArch(Triple::mips);
826   EXPECT_FALSE(T.isArch16Bit());
827   EXPECT_TRUE(T.isArch32Bit());
828   EXPECT_FALSE(T.isArch64Bit());
829 
830   T.setArch(Triple::mips64);
831   EXPECT_FALSE(T.isArch16Bit());
832   EXPECT_FALSE(T.isArch32Bit());
833   EXPECT_TRUE(T.isArch64Bit());
834 
835   T.setArch(Triple::msp430);
836   EXPECT_TRUE(T.isArch16Bit());
837   EXPECT_FALSE(T.isArch32Bit());
838   EXPECT_FALSE(T.isArch64Bit());
839 
840   T.setArch(Triple::ppc);
841   EXPECT_FALSE(T.isArch16Bit());
842   EXPECT_TRUE(T.isArch32Bit());
843   EXPECT_FALSE(T.isArch64Bit());
844 
845   T.setArch(Triple::ppc64);
846   EXPECT_FALSE(T.isArch16Bit());
847   EXPECT_FALSE(T.isArch32Bit());
848   EXPECT_TRUE(T.isArch64Bit());
849 
850   T.setArch(Triple::x86);
851   EXPECT_FALSE(T.isArch16Bit());
852   EXPECT_TRUE(T.isArch32Bit());
853   EXPECT_FALSE(T.isArch64Bit());
854 
855   T.setArch(Triple::x86_64);
856   EXPECT_FALSE(T.isArch16Bit());
857   EXPECT_FALSE(T.isArch32Bit());
858   EXPECT_TRUE(T.isArch64Bit());
859 
860   T.setArch(Triple::amdil);
861   EXPECT_FALSE(T.isArch16Bit());
862   EXPECT_TRUE(T.isArch32Bit());
863   EXPECT_FALSE(T.isArch64Bit());
864 
865   T.setArch(Triple::amdil64);
866   EXPECT_FALSE(T.isArch16Bit());
867   EXPECT_FALSE(T.isArch32Bit());
868   EXPECT_TRUE(T.isArch64Bit());
869 
870   T.setArch(Triple::hsail);
871   EXPECT_FALSE(T.isArch16Bit());
872   EXPECT_TRUE(T.isArch32Bit());
873   EXPECT_FALSE(T.isArch64Bit());
874 
875   T.setArch(Triple::hsail64);
876   EXPECT_FALSE(T.isArch16Bit());
877   EXPECT_FALSE(T.isArch32Bit());
878   EXPECT_TRUE(T.isArch64Bit());
879 
880   T.setArch(Triple::spir);
881   EXPECT_FALSE(T.isArch16Bit());
882   EXPECT_TRUE(T.isArch32Bit());
883   EXPECT_FALSE(T.isArch64Bit());
884 
885   T.setArch(Triple::spir64);
886   EXPECT_FALSE(T.isArch16Bit());
887   EXPECT_FALSE(T.isArch32Bit());
888   EXPECT_TRUE(T.isArch64Bit());
889 
890   T.setArch(Triple::spirv32);
891   EXPECT_FALSE(T.isArch16Bit());
892   EXPECT_TRUE(T.isArch32Bit());
893   EXPECT_FALSE(T.isArch64Bit());
894 
895   T.setArch(Triple::spirv64);
896   EXPECT_FALSE(T.isArch16Bit());
897   EXPECT_FALSE(T.isArch32Bit());
898   EXPECT_TRUE(T.isArch64Bit());
899 
900   T.setArch(Triple::sparc);
901   EXPECT_FALSE(T.isArch16Bit());
902   EXPECT_TRUE(T.isArch32Bit());
903   EXPECT_FALSE(T.isArch64Bit());
904 
905   T.setArch(Triple::sparcel);
906   EXPECT_FALSE(T.isArch16Bit());
907   EXPECT_TRUE(T.isArch32Bit());
908   EXPECT_FALSE(T.isArch64Bit());
909 
910   T.setArch(Triple::sparcv9);
911   EXPECT_FALSE(T.isArch16Bit());
912   EXPECT_FALSE(T.isArch32Bit());
913   EXPECT_TRUE(T.isArch64Bit());
914 
915   T.setArch(Triple::wasm32);
916   EXPECT_FALSE(T.isArch16Bit());
917   EXPECT_TRUE(T.isArch32Bit());
918   EXPECT_FALSE(T.isArch64Bit());
919 
920   T.setArch(Triple::wasm64);
921   EXPECT_FALSE(T.isArch16Bit());
922   EXPECT_FALSE(T.isArch32Bit());
923   EXPECT_TRUE(T.isArch64Bit());
924 
925   T.setArch(Triple::avr);
926   EXPECT_TRUE(T.isArch16Bit());
927   EXPECT_FALSE(T.isArch32Bit());
928   EXPECT_FALSE(T.isArch64Bit());
929 
930   T.setArch(Triple::lanai);
931   EXPECT_FALSE(T.isArch16Bit());
932   EXPECT_TRUE(T.isArch32Bit());
933   EXPECT_FALSE(T.isArch64Bit());
934 
935   T.setArch(Triple::riscv32);
936   EXPECT_FALSE(T.isArch16Bit());
937   EXPECT_TRUE(T.isArch32Bit());
938   EXPECT_FALSE(T.isArch64Bit());
939   EXPECT_TRUE(T.isRISCV());
940 
941   T.setArch(Triple::riscv64);
942   EXPECT_FALSE(T.isArch16Bit());
943   EXPECT_FALSE(T.isArch32Bit());
944   EXPECT_TRUE(T.isArch64Bit());
945   EXPECT_TRUE(T.isRISCV());
946 
947   T.setArch(Triple::csky);
948   EXPECT_FALSE(T.isArch16Bit());
949   EXPECT_TRUE(T.isArch32Bit());
950   EXPECT_FALSE(T.isArch64Bit());
951   EXPECT_TRUE(T.isCSKY());
952 }
953 
954 TEST(TripleTest, BitWidthArchVariants) {
955   Triple T;
956   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
957   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
958 
959   T.setArch(Triple::UnknownArch);
960   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
961   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
962 
963   T.setArch(Triple::mips);
964   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
965   EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
966   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
967   EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
968 
969   T.setArch(Triple::mips, Triple::MipsSubArch_r6);
970   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
971   EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
972   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
973   EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
974 
975   T.setArch(Triple::mipsel);
976   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
977   EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
978   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
979   EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
980 
981   T.setArch(Triple::mipsel, Triple::MipsSubArch_r6);
982   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
983   EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
984   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
985   EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
986 
987   T.setArch(Triple::ppc);
988   EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
989   EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
990 
991   T.setArch(Triple::nvptx);
992   EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
993   EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
994 
995   T.setArch(Triple::sparc);
996   EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
997   EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
998 
999   T.setArch(Triple::x86);
1000   EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
1001   EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
1002 
1003   T.setArch(Triple::mips64);
1004   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1005   EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
1006   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1007   EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
1008 
1009   T.setArch(Triple::mips64, Triple::MipsSubArch_r6);
1010   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1011   EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
1012   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1013   EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
1014 
1015   T.setArch(Triple::mips64el);
1016   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1017   EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch());
1018   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1019   EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch());
1020 
1021   T.setArch(Triple::mips64el, Triple::MipsSubArch_r6);
1022   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1023   EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch());
1024   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1025   EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch());
1026 
1027   T.setArch(Triple::ppc64);
1028   EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
1029   EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
1030 
1031   T.setArch(Triple::nvptx64);
1032   EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
1033   EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
1034 
1035   T.setArch(Triple::sparcv9);
1036   EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
1037   EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
1038 
1039   T.setArch(Triple::x86_64);
1040   EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
1041   EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
1042 
1043   T.setArch(Triple::amdil);
1044   EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
1045   EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
1046 
1047   T.setArch(Triple::amdil64);
1048   EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
1049   EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
1050 
1051   T.setArch(Triple::hsail);
1052   EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
1053   EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
1054 
1055   T.setArch(Triple::hsail64);
1056   EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
1057   EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
1058 
1059   T.setArch(Triple::spir);
1060   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
1061   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
1062 
1063   T.setArch(Triple::spir64);
1064   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
1065   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
1066 
1067   T.setArch(Triple::spirv32);
1068   EXPECT_EQ(Triple::spirv32, T.get32BitArchVariant().getArch());
1069   EXPECT_EQ(Triple::spirv64, T.get64BitArchVariant().getArch());
1070 
1071   T.setArch(Triple::spirv64);
1072   EXPECT_EQ(Triple::spirv32, T.get32BitArchVariant().getArch());
1073   EXPECT_EQ(Triple::spirv64, T.get64BitArchVariant().getArch());
1074 
1075   T.setArch(Triple::wasm32);
1076   EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
1077   EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
1078 
1079   T.setArch(Triple::wasm64);
1080   EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
1081   EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
1082 
1083   T.setArch(Triple::riscv32);
1084   EXPECT_EQ(Triple::riscv32, T.get32BitArchVariant().getArch());
1085   EXPECT_EQ(Triple::riscv64, T.get64BitArchVariant().getArch());
1086 
1087   T.setArch(Triple::riscv64);
1088   EXPECT_EQ(Triple::riscv32, T.get32BitArchVariant().getArch());
1089   EXPECT_EQ(Triple::riscv64, T.get64BitArchVariant().getArch());
1090 
1091   T.setArch(Triple::csky);
1092   EXPECT_EQ(Triple::csky, T.get32BitArchVariant().getArch());
1093   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1094 
1095   T.setArch(Triple::thumbeb);
1096   EXPECT_EQ(Triple::thumbeb, T.get32BitArchVariant().getArch());
1097   EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1098 
1099   T.setArch(Triple::thumb);
1100   EXPECT_EQ(Triple::thumb, T.get32BitArchVariant().getArch());
1101   EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1102 
1103   T.setArch(Triple::aarch64);
1104   EXPECT_EQ(Triple::arm, T.get32BitArchVariant().getArch());
1105   EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1106 
1107   T.setArch(Triple::aarch64_be);
1108   EXPECT_EQ(Triple::armeb, T.get32BitArchVariant().getArch());
1109   EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1110 
1111   T.setArch(Triple::renderscript32);
1112   EXPECT_EQ(Triple::renderscript32, T.get32BitArchVariant().getArch());
1113   EXPECT_EQ(Triple::renderscript64, T.get64BitArchVariant().getArch());
1114 
1115   T.setArch(Triple::renderscript64);
1116   EXPECT_EQ(Triple::renderscript32, T.get32BitArchVariant().getArch());
1117   EXPECT_EQ(Triple::renderscript64, T.get64BitArchVariant().getArch());
1118 
1119   T.setArch(Triple::armeb);
1120   EXPECT_EQ(Triple::armeb, T.get32BitArchVariant().getArch());
1121   EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1122 
1123   T.setArch(Triple::arm);
1124   EXPECT_EQ(Triple::arm, T.get32BitArchVariant().getArch());
1125   EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1126 
1127   T.setArch(Triple::systemz);
1128   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
1129   EXPECT_EQ(Triple::systemz, T.get64BitArchVariant().getArch());
1130 
1131   T.setArch(Triple::xcore);
1132   EXPECT_EQ(Triple::xcore, T.get32BitArchVariant().getArch());
1133   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1134 }
1135 
1136 TEST(TripleTest, EndianArchVariants) {
1137   Triple T;
1138   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1139   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1140 
1141   T.setArch(Triple::UnknownArch);
1142   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1143   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1144 
1145   T.setArch(Triple::aarch64_be);
1146   EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
1147   EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
1148 
1149   T.setArch(Triple::aarch64);
1150   EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
1151   EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
1152 
1153   T.setArch(Triple::armeb);
1154   EXPECT_EQ(Triple::armeb, T.getBigEndianArchVariant().getArch());
1155   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1156 
1157   T.setArch(Triple::arm);
1158   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1159   EXPECT_EQ(Triple::arm, T.getLittleEndianArchVariant().getArch());
1160   T = Triple("arm");
1161   EXPECT_TRUE(T.isLittleEndian());
1162   T = Triple("thumb");
1163   EXPECT_TRUE(T.isLittleEndian());
1164   T = Triple("armeb");
1165   EXPECT_FALSE(T.isLittleEndian());
1166   T = Triple("thumbeb");
1167   EXPECT_FALSE(T.isLittleEndian());
1168 
1169   T.setArch(Triple::bpfeb);
1170   EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
1171   EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
1172 
1173   T.setArch(Triple::bpfel);
1174   EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
1175   EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
1176 
1177   T.setArch(Triple::mips64);
1178   EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1179   EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1180   EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1181   EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1182 
1183   T.setArch(Triple::mips64, Triple::MipsSubArch_r6);
1184   EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1185   EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1186   EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1187   EXPECT_EQ(Triple::MipsSubArch_r6,
1188             T.getLittleEndianArchVariant().getSubArch());
1189 
1190   T.setArch(Triple::mips64el);
1191   EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1192   EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1193   EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1194   EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1195 
1196   T.setArch(Triple::mips64el, Triple::MipsSubArch_r6);
1197   EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1198   EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1199   EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1200   EXPECT_EQ(Triple::MipsSubArch_r6,
1201             T.getLittleEndianArchVariant().getSubArch());
1202 
1203   T.setArch(Triple::mips);
1204   EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1205   EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1206   EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1207   EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1208 
1209   T.setArch(Triple::mips, Triple::MipsSubArch_r6);
1210   EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1211   EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1212   EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1213   EXPECT_EQ(Triple::MipsSubArch_r6,
1214             T.getLittleEndianArchVariant().getSubArch());
1215 
1216   T.setArch(Triple::mipsel);
1217   EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1218   EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch());
1219   EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1220   EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch());
1221 
1222   T.setArch(Triple::mipsel, Triple::MipsSubArch_r6);
1223   EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1224   EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch());
1225   EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1226   EXPECT_EQ(Triple::MipsSubArch_r6,
1227             T.getLittleEndianArchVariant().getSubArch());
1228 
1229   T.setArch(Triple::ppc);
1230   EXPECT_EQ(Triple::ppc, T.getBigEndianArchVariant().getArch());
1231   EXPECT_EQ(Triple::ppcle, T.getLittleEndianArchVariant().getArch());
1232 
1233   T.setArch(Triple::ppc64);
1234   EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
1235   EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
1236 
1237   T.setArch(Triple::ppc64le);
1238   EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
1239   EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
1240 
1241   T.setArch(Triple::sparc);
1242   EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
1243   EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
1244 
1245   T.setArch(Triple::sparcel);
1246   EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
1247   EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
1248 
1249   T.setArch(Triple::thumb);
1250   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1251   EXPECT_EQ(Triple::thumb, T.getLittleEndianArchVariant().getArch());
1252 
1253   T.setArch(Triple::thumbeb);
1254   EXPECT_EQ(Triple::thumbeb, T.getBigEndianArchVariant().getArch());
1255   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1256 
1257   T.setArch(Triple::lanai);
1258   EXPECT_EQ(Triple::lanai, T.getBigEndianArchVariant().getArch());
1259   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1260 
1261   T.setArch(Triple::tcele);
1262   EXPECT_EQ(Triple::tce, T.getBigEndianArchVariant().getArch());
1263   EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());
1264 
1265   T.setArch(Triple::tce);
1266   EXPECT_EQ(Triple::tce, T.getBigEndianArchVariant().getArch());
1267   EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());
1268 
1269   T.setArch(Triple::csky);
1270   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1271   EXPECT_EQ(Triple::csky, T.getLittleEndianArchVariant().getArch());
1272 }
1273 
1274 TEST(TripleTest, getOSVersion) {
1275   Triple T;
1276   VersionTuple Version;
1277 
1278   T = Triple("i386-apple-darwin9");
1279   EXPECT_TRUE(T.isMacOSX());
1280   EXPECT_FALSE(T.isiOS());
1281   EXPECT_FALSE(T.isArch16Bit());
1282   EXPECT_TRUE(T.isArch32Bit());
1283   EXPECT_FALSE(T.isArch64Bit());
1284   T.getMacOSXVersion(Version);
1285   EXPECT_EQ(VersionTuple(10, 5), Version);
1286   Version = T.getiOSVersion();
1287   EXPECT_EQ(VersionTuple(5), Version);
1288 
1289   T = Triple("x86_64-apple-darwin9");
1290   EXPECT_TRUE(T.isMacOSX());
1291   EXPECT_FALSE(T.isiOS());
1292   EXPECT_FALSE(T.isArch16Bit());
1293   EXPECT_FALSE(T.isArch32Bit());
1294   EXPECT_TRUE(T.isArch64Bit());
1295   T.getMacOSXVersion(Version);
1296   EXPECT_EQ(VersionTuple(10, 5), Version);
1297   Version = T.getiOSVersion();
1298   EXPECT_EQ(VersionTuple(5), Version);
1299 
1300   T = Triple("x86_64-apple-macosx");
1301   EXPECT_TRUE(T.isMacOSX());
1302   EXPECT_FALSE(T.isiOS());
1303   EXPECT_FALSE(T.isArch16Bit());
1304   EXPECT_FALSE(T.isArch32Bit());
1305   EXPECT_TRUE(T.isArch64Bit());
1306   T.getMacOSXVersion(Version);
1307   EXPECT_EQ(VersionTuple(10, 4), Version);
1308   Version = T.getiOSVersion();
1309   EXPECT_EQ(VersionTuple(5), Version);
1310 
1311   T = Triple("x86_64-apple-macosx10.7");
1312   EXPECT_TRUE(T.isMacOSX());
1313   EXPECT_FALSE(T.isiOS());
1314   EXPECT_FALSE(T.isArch16Bit());
1315   EXPECT_FALSE(T.isArch32Bit());
1316   EXPECT_TRUE(T.isArch64Bit());
1317   T.getMacOSXVersion(Version);
1318   EXPECT_EQ(VersionTuple(10, 7), Version);
1319   Version = T.getiOSVersion();
1320   EXPECT_EQ(VersionTuple(5), Version);
1321 
1322   T = Triple("x86_64-apple-macos11.0");
1323   EXPECT_TRUE(T.isMacOSX());
1324   EXPECT_FALSE(T.isiOS());
1325   EXPECT_FALSE(T.isArch16Bit());
1326   EXPECT_FALSE(T.isArch32Bit());
1327   EXPECT_TRUE(T.isArch64Bit());
1328   T.getMacOSXVersion(Version);
1329   EXPECT_EQ(VersionTuple(11, 0), Version);
1330 
1331   T = Triple("arm64-apple-macosx11.5.8");
1332   EXPECT_TRUE(T.isMacOSX());
1333   EXPECT_FALSE(T.isiOS());
1334   EXPECT_FALSE(T.isArch16Bit());
1335   EXPECT_FALSE(T.isArch32Bit());
1336   EXPECT_TRUE(T.isArch64Bit());
1337   T.getMacOSXVersion(Version);
1338   EXPECT_EQ(VersionTuple(11, 5, 8), Version);
1339 
1340   // 10.16 forms a valid triple, even though it's not
1341   // a version of a macOS.
1342   T = Triple("x86_64-apple-macos10.16");
1343   EXPECT_TRUE(T.isMacOSX());
1344   T.getMacOSXVersion(Version);
1345   EXPECT_EQ(VersionTuple(10, 16), Version);
1346 
1347   T = Triple("x86_64-apple-darwin20");
1348   EXPECT_TRUE(T.isMacOSX());
1349   T.getMacOSXVersion(Version);
1350   EXPECT_EQ(VersionTuple(11), Version);
1351 
1352   // For darwin triples on macOS 11, only compare the major version.
1353   T = Triple("x86_64-apple-darwin20.2");
1354   EXPECT_TRUE(T.isMacOSX());
1355   T.getMacOSXVersion(Version);
1356   EXPECT_EQ(VersionTuple(11), Version);
1357 
1358   T = Triple("armv7-apple-ios");
1359   EXPECT_FALSE(T.isMacOSX());
1360   EXPECT_TRUE(T.isiOS());
1361   EXPECT_FALSE(T.isArch16Bit());
1362   EXPECT_TRUE(T.isArch32Bit());
1363   EXPECT_FALSE(T.isArch64Bit());
1364   T.getMacOSXVersion(Version);
1365   EXPECT_EQ(VersionTuple(10, 4), Version);
1366   Version = T.getiOSVersion();
1367   EXPECT_EQ(VersionTuple(5), Version);
1368 
1369   T = Triple("armv7-apple-ios7.0");
1370   EXPECT_FALSE(T.isMacOSX());
1371   EXPECT_TRUE(T.isiOS());
1372   EXPECT_FALSE(T.isArch16Bit());
1373   EXPECT_TRUE(T.isArch32Bit());
1374   EXPECT_FALSE(T.isArch64Bit());
1375   T.getMacOSXVersion(Version);
1376   EXPECT_EQ(VersionTuple(10, 4), Version);
1377   Version = T.getiOSVersion();
1378   EXPECT_EQ(VersionTuple(7, 0), Version);
1379   EXPECT_FALSE(T.isSimulatorEnvironment());
1380 
1381   T = Triple("x86_64-apple-ios10.3-simulator");
1382   EXPECT_TRUE(T.isiOS());
1383   Version = T.getiOSVersion();
1384   EXPECT_EQ(VersionTuple(10, 3), Version);
1385   EXPECT_TRUE(T.isSimulatorEnvironment());
1386   EXPECT_FALSE(T.isMacCatalystEnvironment());
1387 
1388   T = Triple("x86_64-apple-ios13.0-macabi");
1389   EXPECT_TRUE(T.isiOS());
1390   Version = T.getiOSVersion();
1391   EXPECT_EQ(VersionTuple(13, 0), Version);
1392   EXPECT_TRUE(T.getEnvironment() == Triple::MacABI);
1393   EXPECT_TRUE(T.isMacCatalystEnvironment());
1394   EXPECT_FALSE(T.isSimulatorEnvironment());
1395 }
1396 
1397 TEST(TripleTest, getEnvironmentVersion) {
1398   Triple T;
1399   VersionTuple Version;
1400 
1401   T = Triple("arm-unknown-linux-android16");
1402   EXPECT_TRUE(T.isAndroid());
1403   Version = T.getEnvironmentVersion();
1404   EXPECT_EQ(VersionTuple(16), Version);
1405   EXPECT_EQ(Triple::Android, T.getEnvironment());
1406 
1407   T = Triple("aarch64-unknown-linux-android21");
1408   EXPECT_TRUE(T.isAndroid());
1409   Version = T.getEnvironmentVersion();
1410   EXPECT_EQ(VersionTuple(21), Version);
1411   EXPECT_EQ(Triple::Android, T.getEnvironment());
1412 }
1413 
1414 TEST(TripleTest, isMacOSVersionLT) {
1415   Triple T = Triple("x86_64-apple-macos11");
1416   EXPECT_TRUE(T.isMacOSXVersionLT(11, 1, 0));
1417   EXPECT_FALSE(T.isMacOSXVersionLT(10, 15, 0));
1418 
1419   T = Triple("x86_64-apple-darwin20");
1420   EXPECT_TRUE(T.isMacOSXVersionLT(11, 1, 0));
1421   EXPECT_FALSE(T.isMacOSXVersionLT(11, 0, 0));
1422   EXPECT_FALSE(T.isMacOSXVersionLT(10, 15, 0));
1423 }
1424 
1425 TEST(TripleTest, CanonicalizeOSVersion) {
1426   EXPECT_EQ(VersionTuple(10, 15, 4),
1427             Triple::getCanonicalVersionForOS(Triple::MacOSX,
1428                                              VersionTuple(10, 15, 4)));
1429   EXPECT_EQ(VersionTuple(11, 0), Triple::getCanonicalVersionForOS(
1430                                      Triple::MacOSX, VersionTuple(10, 16)));
1431   EXPECT_EQ(VersionTuple(20),
1432             Triple::getCanonicalVersionForOS(Triple::Darwin, VersionTuple(20)));
1433 }
1434 
1435 TEST(TripleTest, FileFormat) {
1436   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-linux-gnu").getObjectFormat());
1437   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-freebsd").getObjectFormat());
1438   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-netbsd").getObjectFormat());
1439   EXPECT_EQ(Triple::ELF, Triple("i686--win32-elf").getObjectFormat());
1440   EXPECT_EQ(Triple::ELF, Triple("i686---elf").getObjectFormat());
1441 
1442   EXPECT_EQ(Triple::MachO, Triple("i686-apple-macosx").getObjectFormat());
1443   EXPECT_EQ(Triple::MachO, Triple("i686-apple-ios").getObjectFormat());
1444   EXPECT_EQ(Triple::MachO, Triple("i686---macho").getObjectFormat());
1445 
1446   EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat());
1447 
1448   EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat());
1449   EXPECT_EQ(Triple::ELF, Triple("i686-pc-cygwin-elf").getObjectFormat());
1450 
1451   EXPECT_EQ(Triple::ELF, Triple("systemz-ibm-linux").getObjectFormat());
1452   EXPECT_EQ(Triple::ELF, Triple("systemz-ibm-unknown").getObjectFormat());
1453 
1454   EXPECT_EQ(Triple::GOFF, Triple("s390x-ibm-zos").getObjectFormat());
1455   EXPECT_EQ(Triple::GOFF, Triple("systemz-ibm-zos").getObjectFormat());
1456   EXPECT_EQ(Triple::GOFF, Triple("s390x-ibm-zos-goff").getObjectFormat());
1457   EXPECT_EQ(Triple::GOFF, Triple("s390x-unknown-zos-goff").getObjectFormat());
1458   EXPECT_EQ(Triple::GOFF, Triple("s390x---goff").getObjectFormat());
1459 
1460   EXPECT_EQ(Triple::Wasm, Triple("wasm32-unknown-unknown").getObjectFormat());
1461   EXPECT_EQ(Triple::Wasm, Triple("wasm64-unknown-unknown").getObjectFormat());
1462   EXPECT_EQ(Triple::Wasm, Triple("wasm32-wasi").getObjectFormat());
1463   EXPECT_EQ(Triple::Wasm, Triple("wasm64-wasi").getObjectFormat());
1464   EXPECT_EQ(Triple::Wasm, Triple("wasm32-unknown-wasi").getObjectFormat());
1465   EXPECT_EQ(Triple::Wasm, Triple("wasm64-unknown-wasi").getObjectFormat());
1466 
1467   EXPECT_EQ(Triple::Wasm,
1468             Triple("wasm32-unknown-unknown-wasm").getObjectFormat());
1469   EXPECT_EQ(Triple::Wasm,
1470             Triple("wasm64-unknown-unknown-wasm").getObjectFormat());
1471   EXPECT_EQ(Triple::Wasm,
1472             Triple("wasm32-wasi-wasm").getObjectFormat());
1473   EXPECT_EQ(Triple::Wasm,
1474             Triple("wasm64-wasi-wasm").getObjectFormat());
1475   EXPECT_EQ(Triple::Wasm,
1476             Triple("wasm32-unknown-wasi-wasm").getObjectFormat());
1477   EXPECT_EQ(Triple::Wasm,
1478             Triple("wasm64-unknown-wasi-wasm").getObjectFormat());
1479 
1480   EXPECT_EQ(Triple::XCOFF, Triple("powerpc-ibm-aix").getObjectFormat());
1481   EXPECT_EQ(Triple::XCOFF, Triple("powerpc64-ibm-aix").getObjectFormat());
1482   EXPECT_EQ(Triple::XCOFF, Triple("powerpc---xcoff").getObjectFormat());
1483   EXPECT_EQ(Triple::XCOFF, Triple("powerpc64---xcoff").getObjectFormat());
1484 
1485   EXPECT_EQ(Triple::ELF, Triple("csky-unknown-unknown").getObjectFormat());
1486   EXPECT_EQ(Triple::ELF, Triple("csky-unknown-linux").getObjectFormat());
1487 
1488   Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
1489   EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
1490 
1491   Triple GNUWindowsNormalized(Triple::normalize("i686-pc-windows-gnu-elf"));
1492   EXPECT_EQ(Triple::ELF, GNUWindowsNormalized.getObjectFormat());
1493 
1494   Triple CygnusNormalised(Triple::normalize("i686-pc-windows-cygnus-elf"));
1495   EXPECT_EQ(Triple::ELF, CygnusNormalised.getObjectFormat());
1496 
1497   Triple CygwinNormalized(Triple::normalize("i686-pc-cygwin-elf"));
1498   EXPECT_EQ(Triple::ELF, CygwinNormalized.getObjectFormat());
1499 
1500   Triple T = Triple("");
1501   T.setObjectFormat(Triple::ELF);
1502   EXPECT_EQ(Triple::ELF, T.getObjectFormat());
1503 
1504   T.setObjectFormat(Triple::MachO);
1505   EXPECT_EQ(Triple::MachO, T.getObjectFormat());
1506 
1507   T.setObjectFormat(Triple::XCOFF);
1508   EXPECT_EQ(Triple::XCOFF, T.getObjectFormat());
1509 
1510   T.setObjectFormat(Triple::GOFF);
1511   EXPECT_EQ(Triple::GOFF, T.getObjectFormat());
1512 }
1513 
1514 TEST(TripleTest, NormalizeWindows) {
1515   EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
1516   EXPECT_EQ("i686-unknown-windows-msvc", Triple::normalize("i686-win32"));
1517   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32"));
1518   EXPECT_EQ("i686-unknown-windows-gnu", Triple::normalize("i686-mingw32"));
1519   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32-w64"));
1520   EXPECT_EQ("i686-unknown-windows-gnu", Triple::normalize("i686-mingw32-w64"));
1521   EXPECT_EQ("i686-pc-windows-cygnus", Triple::normalize("i686-pc-cygwin"));
1522   EXPECT_EQ("i686-unknown-windows-cygnus", Triple::normalize("i686-cygwin"));
1523 
1524   EXPECT_EQ("x86_64-pc-windows-msvc", Triple::normalize("x86_64-pc-win32"));
1525   EXPECT_EQ("x86_64-unknown-windows-msvc", Triple::normalize("x86_64-win32"));
1526   EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32"));
1527   EXPECT_EQ("x86_64-unknown-windows-gnu", Triple::normalize("x86_64-mingw32"));
1528   EXPECT_EQ("x86_64-pc-windows-gnu",
1529             Triple::normalize("x86_64-pc-mingw32-w64"));
1530   EXPECT_EQ("x86_64-unknown-windows-gnu",
1531             Triple::normalize("x86_64-mingw32-w64"));
1532 
1533   EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-win32-elf"));
1534   EXPECT_EQ("i686-unknown-windows-elf", Triple::normalize("i686-win32-elf"));
1535   EXPECT_EQ("i686-pc-windows-macho", Triple::normalize("i686-pc-win32-macho"));
1536   EXPECT_EQ("i686-unknown-windows-macho",
1537             Triple::normalize("i686-win32-macho"));
1538 
1539   EXPECT_EQ("x86_64-pc-windows-elf", Triple::normalize("x86_64-pc-win32-elf"));
1540   EXPECT_EQ("x86_64-unknown-windows-elf",
1541             Triple::normalize("x86_64-win32-elf"));
1542   EXPECT_EQ("x86_64-pc-windows-macho",
1543             Triple::normalize("x86_64-pc-win32-macho"));
1544   EXPECT_EQ("x86_64-unknown-windows-macho",
1545             Triple::normalize("x86_64-win32-macho"));
1546 
1547   EXPECT_EQ("i686-pc-windows-cygnus",
1548             Triple::normalize("i686-pc-windows-cygnus"));
1549   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-windows-gnu"));
1550   EXPECT_EQ("i686-pc-windows-itanium",
1551             Triple::normalize("i686-pc-windows-itanium"));
1552   EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc"));
1553 
1554   EXPECT_EQ("i686-pc-windows-elf",
1555             Triple::normalize("i686-pc-windows-elf-elf"));
1556 
1557   EXPECT_TRUE(Triple("x86_64-pc-win32").isWindowsMSVCEnvironment());
1558 }
1559 
1560 TEST(TripleTest, NormalizeAndroid) {
1561   EXPECT_EQ("arm-unknown-linux-android16",
1562             Triple::normalize("arm-linux-androideabi16"));
1563   EXPECT_EQ("armv7a-unknown-linux-android",
1564             Triple::normalize("armv7a-linux-androideabi"));
1565   EXPECT_EQ("aarch64-unknown-linux-android21",
1566             Triple::normalize("aarch64-linux-android21"));
1567 }
1568 
1569 TEST(TripleTest, getARMCPUForArch) {
1570   // Platform specific defaults.
1571   {
1572     llvm::Triple Triple("arm--nacl");
1573     EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch());
1574   }
1575   {
1576     llvm::Triple Triple("arm--openbsd");
1577     EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch());
1578   }
1579   {
1580     llvm::Triple Triple("armv6-unknown-freebsd");
1581     EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1582   }
1583   {
1584     llvm::Triple Triple("thumbv6-unknown-freebsd");
1585     EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1586   }
1587   {
1588     llvm::Triple Triple("armebv6-unknown-freebsd");
1589     EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1590   }
1591   {
1592     llvm::Triple Triple("arm--win32");
1593     EXPECT_EQ("cortex-a9", Triple.getARMCPUForArch());
1594     EXPECT_EQ("generic", Triple.getARMCPUForArch("armv8-a"));
1595   }
1596   // Some alternative architectures
1597   {
1598     llvm::Triple Triple("armv7k-apple-ios9");
1599     EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1600   }
1601   {
1602     llvm::Triple Triple("armv7k-apple-watchos3");
1603     EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1604   }
1605   {
1606     llvm::Triple Triple("armv7k-apple-tvos9");
1607     EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1608   }
1609   // armeb is permitted, but armebeb is not
1610   {
1611     llvm::Triple Triple("armeb-none-eabi");
1612     EXPECT_EQ("arm7tdmi", Triple.getARMCPUForArch());
1613   }
1614   {
1615     llvm::Triple Triple("armebeb-none-eabi");
1616     EXPECT_EQ("", Triple.getARMCPUForArch());
1617   }
1618   {
1619     llvm::Triple Triple("armebv6eb-none-eabi");
1620     EXPECT_EQ("", Triple.getARMCPUForArch());
1621   }
1622   // xscaleeb is permitted, but armebxscale is not
1623   {
1624     llvm::Triple Triple("xscaleeb-none-eabi");
1625     EXPECT_EQ("xscale", Triple.getARMCPUForArch());
1626   }
1627   {
1628     llvm::Triple Triple("armebxscale-none-eabi");
1629     EXPECT_EQ("", Triple.getARMCPUForArch());
1630   }
1631 }
1632 
1633 TEST(TripleTest, NormalizeARM) {
1634   EXPECT_EQ("armv6-unknown-netbsd-eabi",
1635             Triple::normalize("armv6-netbsd-eabi"));
1636   EXPECT_EQ("armv7-unknown-netbsd-eabi",
1637             Triple::normalize("armv7-netbsd-eabi"));
1638   EXPECT_EQ("armv6eb-unknown-netbsd-eabi",
1639             Triple::normalize("armv6eb-netbsd-eabi"));
1640   EXPECT_EQ("armv7eb-unknown-netbsd-eabi",
1641             Triple::normalize("armv7eb-netbsd-eabi"));
1642   EXPECT_EQ("armv6-unknown-netbsd-eabihf",
1643             Triple::normalize("armv6-netbsd-eabihf"));
1644   EXPECT_EQ("armv7-unknown-netbsd-eabihf",
1645             Triple::normalize("armv7-netbsd-eabihf"));
1646   EXPECT_EQ("armv6eb-unknown-netbsd-eabihf",
1647             Triple::normalize("armv6eb-netbsd-eabihf"));
1648   EXPECT_EQ("armv7eb-unknown-netbsd-eabihf",
1649             Triple::normalize("armv7eb-netbsd-eabihf"));
1650 
1651   EXPECT_EQ("armv7-suse-linux-gnueabihf",
1652             Triple::normalize("armv7-suse-linux-gnueabi"));
1653 
1654   Triple T;
1655   T = Triple("armv6--netbsd-eabi");
1656   EXPECT_EQ(Triple::arm, T.getArch());
1657   T = Triple("armv6eb--netbsd-eabi");
1658   EXPECT_EQ(Triple::armeb, T.getArch());
1659   T = Triple("armv7-suse-linux-gnueabihf");
1660   EXPECT_EQ(Triple::GNUEABIHF, T.getEnvironment());
1661 }
1662 
1663 TEST(TripleTest, ParseARMArch) {
1664   // ARM
1665   {
1666     Triple T = Triple("arm");
1667     EXPECT_EQ(Triple::arm, T.getArch());
1668   }
1669   {
1670     Triple T = Triple("armeb");
1671     EXPECT_EQ(Triple::armeb, T.getArch());
1672   }
1673   // THUMB
1674   {
1675     Triple T = Triple("thumb");
1676     EXPECT_EQ(Triple::thumb, T.getArch());
1677   }
1678   {
1679     Triple T = Triple("thumbeb");
1680     EXPECT_EQ(Triple::thumbeb, T.getArch());
1681   }
1682   // AARCH64
1683   {
1684     Triple T = Triple("arm64");
1685     EXPECT_EQ(Triple::aarch64, T.getArch());
1686   }
1687   {
1688     Triple T = Triple("arm64_32");
1689     EXPECT_EQ(Triple::aarch64_32, T.getArch());
1690   }
1691   {
1692     Triple T = Triple("aarch64");
1693     EXPECT_EQ(Triple::aarch64, T.getArch());
1694   }
1695   {
1696     Triple T = Triple("aarch64_be");
1697     EXPECT_EQ(Triple::aarch64_be, T.getArch());
1698   }
1699   {
1700     Triple T = Triple("arm64e");
1701     EXPECT_EQ(Triple::aarch64, T.getArch());
1702     EXPECT_EQ(Triple::AArch64SubArch_arm64e, T.getSubArch());
1703   }
1704 }
1705 } // end anonymous namespace
1706