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