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