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("mips64-unknown-freebsd-purecap");
548   EXPECT_EQ(Triple::mips64, T.getArch());
549   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
550   EXPECT_EQ(Triple::FreeBSD, T.getOS());
551   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
552   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
553 
554   T = Triple("mips64-unknown-linux-cheripurecap");
555   EXPECT_EQ(Triple::mips64, T.getArch());
556   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
557   EXPECT_EQ(Triple::Linux, T.getOS());
558   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
559   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
560   // Also allow mips64c as purecap triple
561   // And mips allow mips64c256 as purecap triple with cheri256
562   T = Triple("mips64c");
563   EXPECT_EQ(Triple::mips64, T.getArch());
564   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
565   EXPECT_EQ(Triple::UnknownOS, T.getOS());
566   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
567   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
568 
569   // Backwards compat with build scripts:
570   T = Triple("cheri-unknown-freebsd");
571   EXPECT_EQ(Triple::mips64, T.getArch());
572   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
573   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
574   EXPECT_EQ(Triple::FreeBSD, T.getOS());
575   EXPECT_EQ(Triple::MipsSubArch_cheri128, T.getSubArch());
576   EXPECT_EQ(T.normalize(), "mips64c128-unknown-freebsd");
577 
578   T = Triple("mips64c128");
579   EXPECT_EQ(Triple::mips64, T.getArch());
580   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
581   EXPECT_EQ(Triple::MipsSubArch_cheri128, T.getSubArch());
582   EXPECT_EQ(T.normalize(), "mips64c128-unknown-unknown-purecap");
583   T = Triple("mips64c256");
584   EXPECT_EQ(Triple::mips64, T.getArch());
585   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
586   EXPECT_EQ(Triple::MipsSubArch_cheri256, T.getSubArch());
587   EXPECT_EQ(T.normalize(), "mips64c256-unknown-unknown-purecap");
588   T = Triple("mips64c64");
589   EXPECT_EQ(Triple::mips64, T.getArch());
590   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
591   EXPECT_EQ(Triple::MipsSubArch_cheri64, T.getSubArch());
592   EXPECT_EQ(T.normalize(), "mips64c64-unknown-unknown-purecap");
593 
594   T = Triple("mips64c128hybrid");
595   EXPECT_EQ(Triple::mips64, T.getArch());
596   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
597   EXPECT_EQ(Triple::MipsSubArch_cheri128, T.getSubArch());
598   EXPECT_EQ(T.normalize(), "mips64c128-unknown-unknown-gnuabi64");
599   T = Triple("mips64c256hybrid");
600   EXPECT_EQ(Triple::mips64, T.getArch());
601   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
602   EXPECT_EQ(Triple::MipsSubArch_cheri256, T.getSubArch());
603   EXPECT_EQ(T.normalize(), "mips64c256-unknown-unknown-gnuabi64");
604   T = Triple("mips64c64hybrid");
605   EXPECT_EQ(Triple::mips64, T.getArch());
606   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
607   EXPECT_EQ(Triple::MipsSubArch_cheri64, T.getSubArch());
608   EXPECT_EQ(T.normalize(), "mips64c64-unknown-unknown-gnuabi64");
609 
610   T = Triple("mipsisa32r6-unknown-linux-gnu");
611   EXPECT_EQ(Triple::mips, T.getArch());
612   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
613   EXPECT_EQ(Triple::Linux, T.getOS());
614   EXPECT_EQ(Triple::GNU, T.getEnvironment());
615   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
616   T = Triple("mipsr6");
617   EXPECT_EQ(Triple::mips, T.getArch());
618   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
619   EXPECT_EQ(Triple::GNU, T.getEnvironment());
620   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
621   T = Triple("mipsisa32r6");
622   EXPECT_EQ(Triple::mips, T.getArch());
623   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
624   EXPECT_EQ(Triple::GNU, T.getEnvironment());
625   EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
626 
627   T = Triple("arm-oe-linux-gnueabi");
628   EXPECT_EQ(Triple::arm, T.getArch());
629   EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
630   EXPECT_EQ(Triple::Linux, T.getOS());
631   EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
632 
633   T = Triple("aarch64-oe-linux");
634   EXPECT_EQ(Triple::aarch64, T.getArch());
635   EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
636   EXPECT_EQ(Triple::Linux, T.getOS());
637   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
638   EXPECT_TRUE(T.isArch64Bit());
639 
640   T = Triple("arm64_32-apple-ios");
641   EXPECT_EQ(Triple::aarch64_32, T.getArch());
642   EXPECT_EQ(Triple::IOS, T.getOS());
643   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
644   EXPECT_TRUE(T.isArch32Bit());
645 
646   T = Triple("huh");
647   EXPECT_EQ(Triple::UnknownArch, T.getArch());
648 }
649 
Join(StringRef A,StringRef B,StringRef C)650 static std::string Join(StringRef A, StringRef B, StringRef C) {
651   std::string Str = std::string(A);
652   Str += '-';
653   Str += B;
654   Str += '-';
655   Str += C;
656   return Str;
657 }
658 
Join(StringRef A,StringRef B,StringRef C,StringRef D)659 static std::string Join(StringRef A, StringRef B, StringRef C, StringRef D) {
660   std::string Str = std::string(A);
661   Str += '-';
662   Str += B;
663   Str += '-';
664   Str += C;
665   Str += '-';
666   Str += D;
667   return Str;
668 }
669 
TEST(TripleTest,Normalization)670 TEST(TripleTest, Normalization) {
671 
672   EXPECT_EQ("unknown", Triple::normalize(""));
673   EXPECT_EQ("unknown-unknown", Triple::normalize("-"));
674   EXPECT_EQ("unknown-unknown-unknown", Triple::normalize("--"));
675   EXPECT_EQ("unknown-unknown-unknown-unknown", Triple::normalize("---"));
676   EXPECT_EQ("unknown-unknown-unknown-unknown-unknown",
677             Triple::normalize("----"));
678 
679   EXPECT_EQ("a", Triple::normalize("a"));
680   EXPECT_EQ("a-b", Triple::normalize("a-b"));
681   EXPECT_EQ("a-b-c", Triple::normalize("a-b-c"));
682   EXPECT_EQ("a-b-c-d", Triple::normalize("a-b-c-d"));
683 
684   EXPECT_EQ("i386-b-c", Triple::normalize("i386-b-c"));
685   EXPECT_EQ("i386-a-c", Triple::normalize("a-i386-c"));
686   EXPECT_EQ("i386-a-b", Triple::normalize("a-b-i386"));
687   EXPECT_EQ("i386-a-b-c", Triple::normalize("a-b-c-i386"));
688 
689   EXPECT_EQ("a-pc-c", Triple::normalize("a-pc-c"));
690   EXPECT_EQ("unknown-pc-b-c", Triple::normalize("pc-b-c"));
691   EXPECT_EQ("a-pc-b", Triple::normalize("a-b-pc"));
692   EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc"));
693 
694   EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux"));
695   EXPECT_EQ("unknown-unknown-linux-b-c", Triple::normalize("linux-b-c"));
696   EXPECT_EQ("a-unknown-linux-c", Triple::normalize("a-linux-c"));
697 
698   EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386"));
699   EXPECT_EQ("i386-pc-unknown", Triple::normalize("-pc-i386"));
700   EXPECT_EQ("unknown-pc-linux-c", Triple::normalize("linux-pc-c"));
701   EXPECT_EQ("unknown-pc-linux", Triple::normalize("linux-pc-"));
702 
703   EXPECT_EQ("i386", Triple::normalize("i386"));
704   EXPECT_EQ("unknown-pc", Triple::normalize("pc"));
705   EXPECT_EQ("unknown-unknown-linux", Triple::normalize("linux"));
706 
707   EXPECT_EQ("x86_64-unknown-linux-gnu", Triple::normalize("x86_64-gnu-linux"));
708 
709   // Check that normalizing a permutated set of valid components returns a
710   // triple with the unpermuted components.
711   //
712   // We don't check every possible combination. For the set of architectures A,
713   // vendors V, operating systems O, and environments E, that would require |A|
714   // * |V| * |O| * |E| * 4! tests. Instead we check every option for any given
715   // slot and make sure it gets normalized to the correct position from every
716   // permutation. This should cover the core logic while being a tractable
717   // number of tests at (|A| + |V| + |O| + |E|) * 4!.
718   auto FirstArchType = Triple::ArchType(Triple::UnknownArch + 1);
719   auto FirstVendorType = Triple::VendorType(Triple::UnknownVendor + 1);
720   auto FirstOSType = Triple::OSType(Triple::UnknownOS + 1);
721   auto FirstEnvType = Triple::EnvironmentType(Triple::UnknownEnvironment + 1);
722   StringRef InitialC[] = {Triple::getArchTypeName(FirstArchType),
723                           Triple::getVendorTypeName(FirstVendorType),
724                           Triple::getOSTypeName(FirstOSType),
725                           Triple::getEnvironmentTypeName(FirstEnvType)};
726   for (int Arch = FirstArchType; Arch <= Triple::LastArchType; ++Arch) {
727     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
728     C[0] = Triple::getArchTypeName(Triple::ArchType(Arch));
729     std::string E = Join(C[0], C[1], C[2]);
730     int I[] = {0, 1, 2};
731     do {
732       EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
733     } while (std::next_permutation(std::begin(I), std::end(I)));
734     std::string F = Join(C[0], C[1], C[2], C[3]);
735     int J[] = {0, 1, 2, 3};
736     do {
737       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
738     } while (std::next_permutation(std::begin(J), std::end(J)));
739   }
740   for (int Vendor = FirstVendorType; Vendor <= Triple::LastVendorType;
741        ++Vendor) {
742     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
743     C[1] = Triple::getVendorTypeName(Triple::VendorType(Vendor));
744     std::string E = Join(C[0], C[1], C[2]);
745     int I[] = {0, 1, 2};
746     do {
747       EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
748     } while (std::next_permutation(std::begin(I), std::end(I)));
749     std::string F = Join(C[0], C[1], C[2], C[3]);
750     int J[] = {0, 1, 2, 3};
751     do {
752       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
753     } while (std::next_permutation(std::begin(J), std::end(J)));
754   }
755   for (int OS = FirstOSType; OS <= Triple::LastOSType; ++OS) {
756     if (OS == Triple::Win32)
757       continue;
758     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
759     C[2] = Triple::getOSTypeName(Triple::OSType(OS));
760     std::string E = Join(C[0], C[1], C[2]);
761     int I[] = {0, 1, 2};
762     do {
763       EXPECT_EQ(E, Triple::normalize(Join(C[I[0]], C[I[1]], C[I[2]])));
764     } while (std::next_permutation(std::begin(I), std::end(I)));
765     std::string F = Join(C[0], C[1], C[2], C[3]);
766     int J[] = {0, 1, 2, 3};
767     do {
768       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
769     } while (std::next_permutation(std::begin(J), std::end(J)));
770   }
771   for (int Env = FirstEnvType; Env <= Triple::LastEnvironmentType; ++Env) {
772     StringRef C[] = {InitialC[0], InitialC[1], InitialC[2], InitialC[3]};
773     C[3] = Triple::getEnvironmentTypeName(Triple::EnvironmentType(Env));
774     std::string F = Join(C[0], C[1], C[2], C[3]);
775     int J[] = {0, 1, 2, 3};
776     do {
777       EXPECT_EQ(F, Triple::normalize(Join(C[J[0]], C[J[1]], C[J[2]], C[J[3]])));
778     } while (std::next_permutation(std::begin(J), std::end(J)));
779   }
780 
781   // Various real-world funky triples.  The value returned by GCC's config.sub
782   // is given in the comment.
783   EXPECT_EQ("i386-unknown-windows-gnu",
784             Triple::normalize("i386-mingw32")); // i386-pc-mingw32
785   EXPECT_EQ("x86_64-unknown-linux-gnu",
786             Triple::normalize("x86_64-linux-gnu")); // x86_64-pc-linux-gnu
787   EXPECT_EQ("i486-unknown-linux-gnu",
788             Triple::normalize("i486-linux-gnu")); // i486-pc-linux-gnu
789   EXPECT_EQ("i386-redhat-linux",
790             Triple::normalize("i386-redhat-linux")); // i386-redhat-linux-gnu
791   EXPECT_EQ("i686-unknown-linux",
792             Triple::normalize("i686-linux")); // i686-pc-linux-gnu
793   EXPECT_EQ("arm-none-unknown-eabi",
794             Triple::normalize("arm-none-eabi")); // arm-none-eabi
795   EXPECT_EQ("ve-unknown-linux",
796             Triple::normalize("ve-linux")); // ve-linux
797   EXPECT_EQ("wasm32-unknown-wasi",
798             Triple::normalize("wasm32-wasi")); // wasm32-unknown-wasi
799   EXPECT_EQ("wasm64-unknown-wasi",
800             Triple::normalize("wasm64-wasi")); // wasm64-unknown-wasi
801 }
802 
TEST(TripleTest,MutateNameCHERI)803 TEST(TripleTest, MutateNameCHERI) {
804   Triple T = Triple("mips64c");
805   EXPECT_EQ(Triple::mips64, T.getArch());
806   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
807   EXPECT_EQ(Triple::UnknownOS, T.getOS());
808   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
809   EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
810   EXPECT_EQ(T.str(), "mips64c---purecap");
811   T.setOS(Triple::FreeBSD);
812   EXPECT_EQ(T.str(), "mips64c--freebsd-purecap");
813   T.setEnvironment(Triple::CheriPurecap);
814   EXPECT_EQ(Triple::CheriPurecap, T.getEnvironment());
815   EXPECT_EQ(T.str(), "mips64c--freebsd-purecap");
816   T.setEnvironment(Triple::GNUABI64);
817   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
818   EXPECT_EQ(T.str(), "mips64c--freebsd-gnuabi64");
819 }
820 
TEST(TripleTest,MutateName)821 TEST(TripleTest, MutateName) {
822   Triple T;
823   EXPECT_EQ(Triple::UnknownArch, T.getArch());
824   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
825   EXPECT_EQ(Triple::UnknownOS, T.getOS());
826   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
827 
828   T.setArchName("i386");
829   EXPECT_EQ(Triple::x86, T.getArch());
830   EXPECT_EQ("i386--", T.getTriple());
831 
832   T.setVendorName("pc");
833   EXPECT_EQ(Triple::x86, T.getArch());
834   EXPECT_EQ(Triple::PC, T.getVendor());
835   EXPECT_EQ("i386-pc-", T.getTriple());
836 
837   T.setOSName("linux");
838   EXPECT_EQ(Triple::x86, T.getArch());
839   EXPECT_EQ(Triple::PC, T.getVendor());
840   EXPECT_EQ(Triple::Linux, T.getOS());
841   EXPECT_EQ("i386-pc-linux", T.getTriple());
842 
843   T.setEnvironmentName("gnu");
844   EXPECT_EQ(Triple::x86, T.getArch());
845   EXPECT_EQ(Triple::PC, T.getVendor());
846   EXPECT_EQ(Triple::Linux, T.getOS());
847   EXPECT_EQ("i386-pc-linux-gnu", T.getTriple());
848 
849   T.setOSName("freebsd");
850   EXPECT_EQ(Triple::x86, T.getArch());
851   EXPECT_EQ(Triple::PC, T.getVendor());
852   EXPECT_EQ(Triple::FreeBSD, T.getOS());
853   EXPECT_EQ("i386-pc-freebsd-gnu", T.getTriple());
854 
855   T.setOSAndEnvironmentName("darwin");
856   EXPECT_EQ(Triple::x86, T.getArch());
857   EXPECT_EQ(Triple::PC, T.getVendor());
858   EXPECT_EQ(Triple::Darwin, T.getOS());
859   EXPECT_EQ("i386-pc-darwin", T.getTriple());
860 }
861 
TEST(TripleTest,BitWidthPredicates)862 TEST(TripleTest, BitWidthPredicates) {
863   Triple T;
864   EXPECT_FALSE(T.isArch16Bit());
865   EXPECT_FALSE(T.isArch32Bit());
866   EXPECT_FALSE(T.isArch64Bit());
867 
868   T.setArch(Triple::arm);
869   EXPECT_FALSE(T.isArch16Bit());
870   EXPECT_TRUE(T.isArch32Bit());
871   EXPECT_FALSE(T.isArch64Bit());
872 
873   T.setArch(Triple::hexagon);
874   EXPECT_FALSE(T.isArch16Bit());
875   EXPECT_TRUE(T.isArch32Bit());
876   EXPECT_FALSE(T.isArch64Bit());
877 
878   T.setArch(Triple::mips);
879   EXPECT_FALSE(T.isArch16Bit());
880   EXPECT_TRUE(T.isArch32Bit());
881   EXPECT_FALSE(T.isArch64Bit());
882 
883   T.setArch(Triple::mips64);
884   EXPECT_FALSE(T.isArch16Bit());
885   EXPECT_FALSE(T.isArch32Bit());
886   EXPECT_TRUE(T.isArch64Bit());
887 
888   T.setArch(Triple::msp430);
889   EXPECT_TRUE(T.isArch16Bit());
890   EXPECT_FALSE(T.isArch32Bit());
891   EXPECT_FALSE(T.isArch64Bit());
892 
893   T.setArch(Triple::ppc);
894   EXPECT_FALSE(T.isArch16Bit());
895   EXPECT_TRUE(T.isArch32Bit());
896   EXPECT_FALSE(T.isArch64Bit());
897 
898   T.setArch(Triple::ppc64);
899   EXPECT_FALSE(T.isArch16Bit());
900   EXPECT_FALSE(T.isArch32Bit());
901   EXPECT_TRUE(T.isArch64Bit());
902 
903   T.setArch(Triple::x86);
904   EXPECT_FALSE(T.isArch16Bit());
905   EXPECT_TRUE(T.isArch32Bit());
906   EXPECT_FALSE(T.isArch64Bit());
907 
908   T.setArch(Triple::x86_64);
909   EXPECT_FALSE(T.isArch16Bit());
910   EXPECT_FALSE(T.isArch32Bit());
911   EXPECT_TRUE(T.isArch64Bit());
912 
913   T.setArch(Triple::amdil);
914   EXPECT_FALSE(T.isArch16Bit());
915   EXPECT_TRUE(T.isArch32Bit());
916   EXPECT_FALSE(T.isArch64Bit());
917 
918   T.setArch(Triple::amdil64);
919   EXPECT_FALSE(T.isArch16Bit());
920   EXPECT_FALSE(T.isArch32Bit());
921   EXPECT_TRUE(T.isArch64Bit());
922 
923   T.setArch(Triple::hsail);
924   EXPECT_FALSE(T.isArch16Bit());
925   EXPECT_TRUE(T.isArch32Bit());
926   EXPECT_FALSE(T.isArch64Bit());
927 
928   T.setArch(Triple::hsail64);
929   EXPECT_FALSE(T.isArch16Bit());
930   EXPECT_FALSE(T.isArch32Bit());
931   EXPECT_TRUE(T.isArch64Bit());
932 
933   T.setArch(Triple::spir);
934   EXPECT_FALSE(T.isArch16Bit());
935   EXPECT_TRUE(T.isArch32Bit());
936   EXPECT_FALSE(T.isArch64Bit());
937 
938   T.setArch(Triple::spir64);
939   EXPECT_FALSE(T.isArch16Bit());
940   EXPECT_FALSE(T.isArch32Bit());
941   EXPECT_TRUE(T.isArch64Bit());
942 
943   T.setArch(Triple::sparc);
944   EXPECT_FALSE(T.isArch16Bit());
945   EXPECT_TRUE(T.isArch32Bit());
946   EXPECT_FALSE(T.isArch64Bit());
947 
948   T.setArch(Triple::sparcel);
949   EXPECT_FALSE(T.isArch16Bit());
950   EXPECT_TRUE(T.isArch32Bit());
951   EXPECT_FALSE(T.isArch64Bit());
952 
953   T.setArch(Triple::sparcv9);
954   EXPECT_FALSE(T.isArch16Bit());
955   EXPECT_FALSE(T.isArch32Bit());
956   EXPECT_TRUE(T.isArch64Bit());
957 
958   T.setArch(Triple::wasm32);
959   EXPECT_FALSE(T.isArch16Bit());
960   EXPECT_TRUE(T.isArch32Bit());
961   EXPECT_FALSE(T.isArch64Bit());
962 
963   T.setArch(Triple::wasm64);
964   EXPECT_FALSE(T.isArch16Bit());
965   EXPECT_FALSE(T.isArch32Bit());
966   EXPECT_TRUE(T.isArch64Bit());
967 
968   T.setArch(Triple::avr);
969   EXPECT_TRUE(T.isArch16Bit());
970   EXPECT_FALSE(T.isArch32Bit());
971   EXPECT_FALSE(T.isArch64Bit());
972 
973   T.setArch(Triple::lanai);
974   EXPECT_FALSE(T.isArch16Bit());
975   EXPECT_TRUE(T.isArch32Bit());
976   EXPECT_FALSE(T.isArch64Bit());
977 
978   T.setArch(Triple::riscv32);
979   EXPECT_FALSE(T.isArch16Bit());
980   EXPECT_TRUE(T.isArch32Bit());
981   EXPECT_FALSE(T.isArch64Bit());
982   EXPECT_TRUE(T.isRISCV());
983 
984   T.setArch(Triple::riscv64);
985   EXPECT_FALSE(T.isArch16Bit());
986   EXPECT_FALSE(T.isArch32Bit());
987   EXPECT_TRUE(T.isArch64Bit());
988   EXPECT_TRUE(T.isRISCV());
989 }
990 
TEST(TripleTest,BitWidthArchVariants)991 TEST(TripleTest, BitWidthArchVariants) {
992   Triple T;
993   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
994   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
995 
996   T.setArch(Triple::UnknownArch);
997   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
998   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
999 
1000   T.setArch(Triple::mips);
1001   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1002   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1003 
1004   T.setArch(Triple::mipsel);
1005   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1006   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1007 
1008   T.setArch(Triple::ppc);
1009   EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
1010   EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
1011 
1012   T.setArch(Triple::nvptx);
1013   EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
1014   EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
1015 
1016   T.setArch(Triple::sparc);
1017   EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
1018   EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
1019 
1020   T.setArch(Triple::x86);
1021   EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
1022   EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
1023 
1024   T.setArch(Triple::mips64);
1025   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
1026   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
1027 
1028   T.setArch(Triple::mips64el);
1029   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
1030   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
1031 
1032   T.setArch(Triple::ppc64);
1033   EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
1034   EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
1035 
1036   T.setArch(Triple::nvptx64);
1037   EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
1038   EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
1039 
1040   T.setArch(Triple::sparcv9);
1041   EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
1042   EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
1043 
1044   T.setArch(Triple::x86_64);
1045   EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
1046   EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
1047 
1048   T.setArch(Triple::amdil);
1049   EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
1050   EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
1051 
1052   T.setArch(Triple::amdil64);
1053   EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
1054   EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
1055 
1056   T.setArch(Triple::hsail);
1057   EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
1058   EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
1059 
1060   T.setArch(Triple::hsail64);
1061   EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
1062   EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
1063 
1064   T.setArch(Triple::spir);
1065   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
1066   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
1067 
1068   T.setArch(Triple::spir64);
1069   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
1070   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
1071 
1072   T.setArch(Triple::wasm32);
1073   EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
1074   EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
1075 
1076   T.setArch(Triple::wasm64);
1077   EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
1078   EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
1079 
1080   T.setArch(Triple::riscv32);
1081   EXPECT_EQ(Triple::riscv32, T.get32BitArchVariant().getArch());
1082   EXPECT_EQ(Triple::riscv64, T.get64BitArchVariant().getArch());
1083 
1084   T.setArch(Triple::riscv64);
1085   EXPECT_EQ(Triple::riscv32, T.get32BitArchVariant().getArch());
1086   EXPECT_EQ(Triple::riscv64, T.get64BitArchVariant().getArch());
1087 
1088   T.setArch(Triple::thumbeb);
1089   EXPECT_EQ(Triple::thumbeb, T.get32BitArchVariant().getArch());
1090   EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1091 
1092   T.setArch(Triple::thumb);
1093   EXPECT_EQ(Triple::thumb, T.get32BitArchVariant().getArch());
1094   EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1095 
1096   T.setArch(Triple::aarch64);
1097   EXPECT_EQ(Triple::arm, T.get32BitArchVariant().getArch());
1098   EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1099 
1100   T.setArch(Triple::aarch64_be);
1101   EXPECT_EQ(Triple::armeb, T.get32BitArchVariant().getArch());
1102   EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1103 
1104   T.setArch(Triple::renderscript32);
1105   EXPECT_EQ(Triple::renderscript32, T.get32BitArchVariant().getArch());
1106   EXPECT_EQ(Triple::renderscript64, T.get64BitArchVariant().getArch());
1107 
1108   T.setArch(Triple::renderscript64);
1109   EXPECT_EQ(Triple::renderscript32, T.get32BitArchVariant().getArch());
1110   EXPECT_EQ(Triple::renderscript64, T.get64BitArchVariant().getArch());
1111 
1112   T.setArch(Triple::le32);
1113   EXPECT_EQ(Triple::le32, T.get32BitArchVariant().getArch());
1114   EXPECT_EQ(Triple::le64, T.get64BitArchVariant().getArch());
1115 
1116   T.setArch(Triple::le64);
1117   EXPECT_EQ(Triple::le32, T.get32BitArchVariant().getArch());
1118   EXPECT_EQ(Triple::le64, T.get64BitArchVariant().getArch());
1119 
1120   T.setArch(Triple::armeb);
1121   EXPECT_EQ(Triple::armeb, T.get32BitArchVariant().getArch());
1122   EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
1123 
1124   T.setArch(Triple::arm);
1125   EXPECT_EQ(Triple::arm, T.get32BitArchVariant().getArch());
1126   EXPECT_EQ(Triple::aarch64, T.get64BitArchVariant().getArch());
1127 
1128   T.setArch(Triple::systemz);
1129   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
1130   EXPECT_EQ(Triple::systemz, T.get64BitArchVariant().getArch());
1131 
1132   T.setArch(Triple::xcore);
1133   EXPECT_EQ(Triple::xcore, T.get32BitArchVariant().getArch());
1134   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1135 }
1136 
TEST(TripleTest,EndianArchVariants)1137 TEST(TripleTest, EndianArchVariants) {
1138   Triple T;
1139   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1140   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1141 
1142   T.setArch(Triple::UnknownArch);
1143   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1144   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1145 
1146   T.setArch(Triple::aarch64_be);
1147   EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
1148   EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
1149 
1150   T.setArch(Triple::aarch64);
1151   EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
1152   EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
1153 
1154   T.setArch(Triple::armeb);
1155   EXPECT_EQ(Triple::armeb, T.getBigEndianArchVariant().getArch());
1156   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1157 
1158   T.setArch(Triple::arm);
1159   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1160   EXPECT_EQ(Triple::arm, T.getLittleEndianArchVariant().getArch());
1161   T = Triple("arm");
1162   EXPECT_TRUE(T.isLittleEndian());
1163   T = Triple("thumb");
1164   EXPECT_TRUE(T.isLittleEndian());
1165   T = Triple("armeb");
1166   EXPECT_FALSE(T.isLittleEndian());
1167   T = Triple("thumbeb");
1168   EXPECT_FALSE(T.isLittleEndian());
1169 
1170   T.setArch(Triple::bpfeb);
1171   EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
1172   EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
1173 
1174   T.setArch(Triple::bpfel);
1175   EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
1176   EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
1177 
1178   T.setArch(Triple::mips64);
1179   EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1180   EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1181 
1182   T.setArch(Triple::mips64el);
1183   EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
1184   EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
1185 
1186   T.setArch(Triple::mips);
1187   EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1188   EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1189 
1190   T.setArch(Triple::mipsel);
1191   EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
1192   EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
1193 
1194   T.setArch(Triple::ppc);
1195   EXPECT_EQ(Triple::ppc, T.getBigEndianArchVariant().getArch());
1196   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1197 
1198   T.setArch(Triple::ppc64);
1199   EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
1200   EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
1201 
1202   T.setArch(Triple::ppc64le);
1203   EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
1204   EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
1205 
1206   T.setArch(Triple::sparc);
1207   EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
1208   EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
1209 
1210   T.setArch(Triple::sparcel);
1211   EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
1212   EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
1213 
1214   T.setArch(Triple::thumb);
1215   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1216   EXPECT_EQ(Triple::thumb, T.getLittleEndianArchVariant().getArch());
1217 
1218   T.setArch(Triple::thumbeb);
1219   EXPECT_EQ(Triple::thumbeb, T.getBigEndianArchVariant().getArch());
1220   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1221 
1222   T.setArch(Triple::lanai);
1223   EXPECT_EQ(Triple::lanai, T.getBigEndianArchVariant().getArch());
1224   EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
1225 
1226   T.setArch(Triple::tcele);
1227   EXPECT_EQ(Triple::tce, T.getBigEndianArchVariant().getArch());
1228   EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());
1229 
1230   T.setArch(Triple::tce);
1231   EXPECT_EQ(Triple::tce, T.getBigEndianArchVariant().getArch());
1232   EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());
1233 
1234   T.setArch(Triple::le32);
1235   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1236   EXPECT_EQ(Triple::le32, T.getLittleEndianArchVariant().getArch());
1237 
1238   T.setArch(Triple::le64);
1239   EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1240   EXPECT_EQ(Triple::le64, T.getLittleEndianArchVariant().getArch());
1241 }
1242 
TEST(TripleTest,getOSVersion)1243 TEST(TripleTest, getOSVersion) {
1244   Triple T;
1245   unsigned Major, Minor, Micro;
1246 
1247   T = Triple("i386-apple-darwin9");
1248   EXPECT_TRUE(T.isMacOSX());
1249   EXPECT_FALSE(T.isiOS());
1250   EXPECT_FALSE(T.isArch16Bit());
1251   EXPECT_TRUE(T.isArch32Bit());
1252   EXPECT_FALSE(T.isArch64Bit());
1253   T.getMacOSXVersion(Major, Minor, Micro);
1254   EXPECT_EQ((unsigned)10, Major);
1255   EXPECT_EQ((unsigned)5, Minor);
1256   EXPECT_EQ((unsigned)0, Micro);
1257   T.getiOSVersion(Major, Minor, Micro);
1258   EXPECT_EQ((unsigned)5, Major);
1259   EXPECT_EQ((unsigned)0, Minor);
1260   EXPECT_EQ((unsigned)0, Micro);
1261 
1262   T = Triple("x86_64-apple-darwin9");
1263   EXPECT_TRUE(T.isMacOSX());
1264   EXPECT_FALSE(T.isiOS());
1265   EXPECT_FALSE(T.isArch16Bit());
1266   EXPECT_FALSE(T.isArch32Bit());
1267   EXPECT_TRUE(T.isArch64Bit());
1268   T.getMacOSXVersion(Major, Minor, Micro);
1269   EXPECT_EQ((unsigned)10, Major);
1270   EXPECT_EQ((unsigned)5, Minor);
1271   EXPECT_EQ((unsigned)0, Micro);
1272   T.getiOSVersion(Major, Minor, Micro);
1273   EXPECT_EQ((unsigned)5, Major);
1274   EXPECT_EQ((unsigned)0, Minor);
1275   EXPECT_EQ((unsigned)0, Micro);
1276 
1277   T = Triple("x86_64-apple-macosx");
1278   EXPECT_TRUE(T.isMacOSX());
1279   EXPECT_FALSE(T.isiOS());
1280   EXPECT_FALSE(T.isArch16Bit());
1281   EXPECT_FALSE(T.isArch32Bit());
1282   EXPECT_TRUE(T.isArch64Bit());
1283   T.getMacOSXVersion(Major, Minor, Micro);
1284   EXPECT_EQ((unsigned)10, Major);
1285   EXPECT_EQ((unsigned)4, Minor);
1286   EXPECT_EQ((unsigned)0, Micro);
1287   T.getiOSVersion(Major, Minor, Micro);
1288   EXPECT_EQ((unsigned)5, Major);
1289   EXPECT_EQ((unsigned)0, Minor);
1290   EXPECT_EQ((unsigned)0, Micro);
1291 
1292   T = Triple("x86_64-apple-macosx10.7");
1293   EXPECT_TRUE(T.isMacOSX());
1294   EXPECT_FALSE(T.isiOS());
1295   EXPECT_FALSE(T.isArch16Bit());
1296   EXPECT_FALSE(T.isArch32Bit());
1297   EXPECT_TRUE(T.isArch64Bit());
1298   T.getMacOSXVersion(Major, Minor, Micro);
1299   EXPECT_EQ((unsigned)10, Major);
1300   EXPECT_EQ((unsigned)7, Minor);
1301   EXPECT_EQ((unsigned)0, Micro);
1302   T.getiOSVersion(Major, Minor, Micro);
1303   EXPECT_EQ((unsigned)5, Major);
1304   EXPECT_EQ((unsigned)0, Minor);
1305   EXPECT_EQ((unsigned)0, Micro);
1306 
1307   T = Triple("x86_64-apple-macos11.0");
1308   EXPECT_TRUE(T.isMacOSX());
1309   EXPECT_FALSE(T.isiOS());
1310   EXPECT_FALSE(T.isArch16Bit());
1311   EXPECT_FALSE(T.isArch32Bit());
1312   EXPECT_TRUE(T.isArch64Bit());
1313   T.getMacOSXVersion(Major, Minor, Micro);
1314   EXPECT_EQ((unsigned)11, Major);
1315   EXPECT_EQ((unsigned)0, Minor);
1316   EXPECT_EQ((unsigned)0, Micro);
1317 
1318   T = Triple("arm64-apple-macosx11.5.8");
1319   EXPECT_TRUE(T.isMacOSX());
1320   EXPECT_FALSE(T.isiOS());
1321   EXPECT_FALSE(T.isArch16Bit());
1322   EXPECT_FALSE(T.isArch32Bit());
1323   EXPECT_TRUE(T.isArch64Bit());
1324   T.getMacOSXVersion(Major, Minor, Micro);
1325   EXPECT_EQ((unsigned)11, Major);
1326   EXPECT_EQ((unsigned)5, Minor);
1327   EXPECT_EQ((unsigned)8, Micro);
1328 
1329   // 10.16 forms a valid triple, even though it's not
1330   // a version of a macOS.
1331   T = Triple("x86_64-apple-macos10.16");
1332   EXPECT_TRUE(T.isMacOSX());
1333   T.getMacOSXVersion(Major, Minor, Micro);
1334   EXPECT_EQ((unsigned)10, Major);
1335   EXPECT_EQ((unsigned)16, Minor);
1336   EXPECT_EQ((unsigned)0, Micro);
1337 
1338   T = Triple("x86_64-apple-darwin20");
1339   EXPECT_TRUE(T.isMacOSX());
1340   T.getMacOSXVersion(Major, Minor, Micro);
1341   EXPECT_EQ((unsigned)11, Major);
1342   EXPECT_EQ((unsigned)0, Minor);
1343   EXPECT_EQ((unsigned)0, Micro);
1344 
1345   T = Triple("armv7-apple-ios");
1346   EXPECT_FALSE(T.isMacOSX());
1347   EXPECT_TRUE(T.isiOS());
1348   EXPECT_FALSE(T.isArch16Bit());
1349   EXPECT_TRUE(T.isArch32Bit());
1350   EXPECT_FALSE(T.isArch64Bit());
1351   T.getMacOSXVersion(Major, Minor, Micro);
1352   EXPECT_EQ((unsigned)10, Major);
1353   EXPECT_EQ((unsigned)4, Minor);
1354   EXPECT_EQ((unsigned)0, Micro);
1355   T.getiOSVersion(Major, Minor, Micro);
1356   EXPECT_EQ((unsigned)5, Major);
1357   EXPECT_EQ((unsigned)0, Minor);
1358   EXPECT_EQ((unsigned)0, Micro);
1359 
1360   T = Triple("armv7-apple-ios7.0");
1361   EXPECT_FALSE(T.isMacOSX());
1362   EXPECT_TRUE(T.isiOS());
1363   EXPECT_FALSE(T.isArch16Bit());
1364   EXPECT_TRUE(T.isArch32Bit());
1365   EXPECT_FALSE(T.isArch64Bit());
1366   T.getMacOSXVersion(Major, Minor, Micro);
1367   EXPECT_EQ((unsigned)10, Major);
1368   EXPECT_EQ((unsigned)4, Minor);
1369   EXPECT_EQ((unsigned)0, Micro);
1370   T.getiOSVersion(Major, Minor, Micro);
1371   EXPECT_EQ((unsigned)7, Major);
1372   EXPECT_EQ((unsigned)0, Minor);
1373   EXPECT_EQ((unsigned)0, Micro);
1374   EXPECT_FALSE(T.isSimulatorEnvironment());
1375 
1376   T = Triple("x86_64-apple-ios10.3-simulator");
1377   EXPECT_TRUE(T.isiOS());
1378   T.getiOSVersion(Major, Minor, Micro);
1379   EXPECT_EQ((unsigned)10, Major);
1380   EXPECT_EQ((unsigned)3, Minor);
1381   EXPECT_EQ((unsigned)0, Micro);
1382   EXPECT_TRUE(T.isSimulatorEnvironment());
1383   EXPECT_FALSE(T.isMacCatalystEnvironment());
1384 
1385   T = Triple("x86_64-apple-ios13.0-macabi");
1386   EXPECT_TRUE(T.isiOS());
1387   T.getiOSVersion(Major, Minor, Micro);
1388   EXPECT_EQ((unsigned)13, Major);
1389   EXPECT_EQ((unsigned)0, Minor);
1390   EXPECT_EQ((unsigned)0, Micro);
1391   EXPECT_TRUE(T.getEnvironment() == Triple::MacABI);
1392   EXPECT_TRUE(T.isMacCatalystEnvironment());
1393   EXPECT_FALSE(T.isSimulatorEnvironment());
1394 }
1395 
TEST(TripleTest,isMacOSVersionLT)1396 TEST(TripleTest, isMacOSVersionLT) {
1397   Triple T = Triple("x86_64-apple-macos11");
1398   EXPECT_TRUE(T.isMacOSXVersionLT(11, 1, 0));
1399   EXPECT_FALSE(T.isMacOSXVersionLT(10, 15, 0));
1400 
1401   T = Triple("x86_64-apple-darwin20");
1402   EXPECT_TRUE(T.isMacOSXVersionLT(11, 1, 0));
1403   EXPECT_FALSE(T.isMacOSXVersionLT(11, 0, 0));
1404   EXPECT_FALSE(T.isMacOSXVersionLT(10, 15, 0));
1405 }
1406 
TEST(TripleTest,CanonicalizeOSVersion)1407 TEST(TripleTest, CanonicalizeOSVersion) {
1408   EXPECT_EQ(VersionTuple(10, 15, 4),
1409             Triple::getCanonicalVersionForOS(Triple::MacOSX,
1410                                              VersionTuple(10, 15, 4)));
1411   EXPECT_EQ(VersionTuple(11, 0), Triple::getCanonicalVersionForOS(
1412                                      Triple::MacOSX, VersionTuple(10, 16)));
1413   EXPECT_EQ(VersionTuple(20),
1414             Triple::getCanonicalVersionForOS(Triple::Darwin, VersionTuple(20)));
1415 }
1416 
TEST(TripleTest,FileFormat)1417 TEST(TripleTest, FileFormat) {
1418   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-linux-gnu").getObjectFormat());
1419   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-freebsd").getObjectFormat());
1420   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-netbsd").getObjectFormat());
1421   EXPECT_EQ(Triple::ELF, Triple("i686--win32-elf").getObjectFormat());
1422   EXPECT_EQ(Triple::ELF, Triple("i686---elf").getObjectFormat());
1423 
1424   EXPECT_EQ(Triple::MachO, Triple("i686-apple-macosx").getObjectFormat());
1425   EXPECT_EQ(Triple::MachO, Triple("i686-apple-ios").getObjectFormat());
1426   EXPECT_EQ(Triple::MachO, Triple("i686---macho").getObjectFormat());
1427 
1428   EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat());
1429 
1430   EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat());
1431   EXPECT_EQ(Triple::ELF, Triple("i686-pc-cygwin-elf").getObjectFormat());
1432 
1433   EXPECT_EQ(Triple::Wasm, Triple("wasm32-unknown-unknown").getObjectFormat());
1434   EXPECT_EQ(Triple::Wasm, Triple("wasm64-unknown-unknown").getObjectFormat());
1435   EXPECT_EQ(Triple::Wasm, Triple("wasm32-wasi").getObjectFormat());
1436   EXPECT_EQ(Triple::Wasm, Triple("wasm64-wasi").getObjectFormat());
1437   EXPECT_EQ(Triple::Wasm, Triple("wasm32-unknown-wasi").getObjectFormat());
1438   EXPECT_EQ(Triple::Wasm, Triple("wasm64-unknown-wasi").getObjectFormat());
1439 
1440   EXPECT_EQ(Triple::Wasm,
1441             Triple("wasm32-unknown-unknown-wasm").getObjectFormat());
1442   EXPECT_EQ(Triple::Wasm,
1443             Triple("wasm64-unknown-unknown-wasm").getObjectFormat());
1444   EXPECT_EQ(Triple::Wasm,
1445             Triple("wasm32-wasi-wasm").getObjectFormat());
1446   EXPECT_EQ(Triple::Wasm,
1447             Triple("wasm64-wasi-wasm").getObjectFormat());
1448   EXPECT_EQ(Triple::Wasm,
1449             Triple("wasm32-unknown-wasi-wasm").getObjectFormat());
1450   EXPECT_EQ(Triple::Wasm,
1451             Triple("wasm64-unknown-wasi-wasm").getObjectFormat());
1452 
1453   EXPECT_EQ(Triple::XCOFF, Triple("powerpc-ibm-aix").getObjectFormat());
1454   EXPECT_EQ(Triple::XCOFF, Triple("powerpc64-ibm-aix").getObjectFormat());
1455   EXPECT_EQ(Triple::XCOFF, Triple("powerpc---xcoff").getObjectFormat());
1456   EXPECT_EQ(Triple::XCOFF, Triple("powerpc64---xcoff").getObjectFormat());
1457 
1458   Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
1459   EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
1460 
1461   Triple GNUWindowsNormalized(Triple::normalize("i686-pc-windows-gnu-elf"));
1462   EXPECT_EQ(Triple::ELF, GNUWindowsNormalized.getObjectFormat());
1463 
1464   Triple CygnusNormalised(Triple::normalize("i686-pc-windows-cygnus-elf"));
1465   EXPECT_EQ(Triple::ELF, CygnusNormalised.getObjectFormat());
1466 
1467   Triple CygwinNormalized(Triple::normalize("i686-pc-cygwin-elf"));
1468   EXPECT_EQ(Triple::ELF, CygwinNormalized.getObjectFormat());
1469 
1470   Triple T = Triple("");
1471   T.setObjectFormat(Triple::ELF);
1472   EXPECT_EQ(Triple::ELF, T.getObjectFormat());
1473 
1474   T.setObjectFormat(Triple::MachO);
1475   EXPECT_EQ(Triple::MachO, T.getObjectFormat());
1476 
1477   T.setObjectFormat(Triple::XCOFF);
1478   EXPECT_EQ(Triple::XCOFF, T.getObjectFormat());
1479 }
1480 
TEST(TripleTest,NormalizeWindows)1481 TEST(TripleTest, NormalizeWindows) {
1482   EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
1483   EXPECT_EQ("i686-unknown-windows-msvc", Triple::normalize("i686-win32"));
1484   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32"));
1485   EXPECT_EQ("i686-unknown-windows-gnu", Triple::normalize("i686-mingw32"));
1486   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32-w64"));
1487   EXPECT_EQ("i686-unknown-windows-gnu", Triple::normalize("i686-mingw32-w64"));
1488   EXPECT_EQ("i686-pc-windows-cygnus", Triple::normalize("i686-pc-cygwin"));
1489   EXPECT_EQ("i686-unknown-windows-cygnus", Triple::normalize("i686-cygwin"));
1490 
1491   EXPECT_EQ("x86_64-pc-windows-msvc", Triple::normalize("x86_64-pc-win32"));
1492   EXPECT_EQ("x86_64-unknown-windows-msvc", Triple::normalize("x86_64-win32"));
1493   EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32"));
1494   EXPECT_EQ("x86_64-unknown-windows-gnu", Triple::normalize("x86_64-mingw32"));
1495   EXPECT_EQ("x86_64-pc-windows-gnu",
1496             Triple::normalize("x86_64-pc-mingw32-w64"));
1497   EXPECT_EQ("x86_64-unknown-windows-gnu",
1498             Triple::normalize("x86_64-mingw32-w64"));
1499 
1500   EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-win32-elf"));
1501   EXPECT_EQ("i686-unknown-windows-elf", Triple::normalize("i686-win32-elf"));
1502   EXPECT_EQ("i686-pc-windows-macho", Triple::normalize("i686-pc-win32-macho"));
1503   EXPECT_EQ("i686-unknown-windows-macho",
1504             Triple::normalize("i686-win32-macho"));
1505 
1506   EXPECT_EQ("x86_64-pc-windows-elf", Triple::normalize("x86_64-pc-win32-elf"));
1507   EXPECT_EQ("x86_64-unknown-windows-elf",
1508             Triple::normalize("x86_64-win32-elf"));
1509   EXPECT_EQ("x86_64-pc-windows-macho",
1510             Triple::normalize("x86_64-pc-win32-macho"));
1511   EXPECT_EQ("x86_64-unknown-windows-macho",
1512             Triple::normalize("x86_64-win32-macho"));
1513 
1514   EXPECT_EQ("i686-pc-windows-cygnus",
1515             Triple::normalize("i686-pc-windows-cygnus"));
1516   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-windows-gnu"));
1517   EXPECT_EQ("i686-pc-windows-itanium",
1518             Triple::normalize("i686-pc-windows-itanium"));
1519   EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc"));
1520 
1521   EXPECT_EQ("i686-pc-windows-elf",
1522             Triple::normalize("i686-pc-windows-elf-elf"));
1523 
1524   EXPECT_TRUE(Triple("x86_64-pc-win32").isWindowsMSVCEnvironment());
1525 }
1526 
TEST(TripleTest,getARMCPUForArch)1527 TEST(TripleTest, getARMCPUForArch) {
1528   // Platform specific defaults.
1529   {
1530     llvm::Triple Triple("arm--nacl");
1531     EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch());
1532   }
1533   {
1534     llvm::Triple Triple("arm--openbsd");
1535     EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch());
1536   }
1537   {
1538     llvm::Triple Triple("armv6-unknown-freebsd");
1539     EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1540   }
1541   {
1542     llvm::Triple Triple("thumbv6-unknown-freebsd");
1543     EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1544   }
1545   {
1546     llvm::Triple Triple("armebv6-unknown-freebsd");
1547     EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch());
1548   }
1549   {
1550     llvm::Triple Triple("arm--win32");
1551     EXPECT_EQ("cortex-a9", Triple.getARMCPUForArch());
1552   }
1553   // Some alternative architectures
1554   {
1555     llvm::Triple Triple("armv7k-apple-ios9");
1556     EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1557   }
1558   {
1559     llvm::Triple Triple("armv7k-apple-watchos3");
1560     EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1561   }
1562   {
1563     llvm::Triple Triple("armv7k-apple-tvos9");
1564     EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch());
1565   }
1566   // armeb is permitted, but armebeb is not
1567   {
1568     llvm::Triple Triple("armeb-none-eabi");
1569     EXPECT_EQ("arm7tdmi", Triple.getARMCPUForArch());
1570   }
1571   {
1572     llvm::Triple Triple("armebeb-none-eabi");
1573     EXPECT_EQ("", Triple.getARMCPUForArch());
1574   }
1575   {
1576     llvm::Triple Triple("armebv6eb-none-eabi");
1577     EXPECT_EQ("", Triple.getARMCPUForArch());
1578   }
1579   // xscaleeb is permitted, but armebxscale is not
1580   {
1581     llvm::Triple Triple("xscaleeb-none-eabi");
1582     EXPECT_EQ("xscale", Triple.getARMCPUForArch());
1583   }
1584   {
1585     llvm::Triple Triple("armebxscale-none-eabi");
1586     EXPECT_EQ("", Triple.getARMCPUForArch());
1587   }
1588 }
1589 
TEST(TripleTest,NormalizeARM)1590 TEST(TripleTest, NormalizeARM) {
1591   EXPECT_EQ("armv6-unknown-netbsd-eabi",
1592             Triple::normalize("armv6-netbsd-eabi"));
1593   EXPECT_EQ("armv7-unknown-netbsd-eabi",
1594             Triple::normalize("armv7-netbsd-eabi"));
1595   EXPECT_EQ("armv6eb-unknown-netbsd-eabi",
1596             Triple::normalize("armv6eb-netbsd-eabi"));
1597   EXPECT_EQ("armv7eb-unknown-netbsd-eabi",
1598             Triple::normalize("armv7eb-netbsd-eabi"));
1599   EXPECT_EQ("armv6-unknown-netbsd-eabihf",
1600             Triple::normalize("armv6-netbsd-eabihf"));
1601   EXPECT_EQ("armv7-unknown-netbsd-eabihf",
1602             Triple::normalize("armv7-netbsd-eabihf"));
1603   EXPECT_EQ("armv6eb-unknown-netbsd-eabihf",
1604             Triple::normalize("armv6eb-netbsd-eabihf"));
1605   EXPECT_EQ("armv7eb-unknown-netbsd-eabihf",
1606             Triple::normalize("armv7eb-netbsd-eabihf"));
1607 
1608   EXPECT_EQ("armv7-suse-linux-gnueabihf",
1609             Triple::normalize("armv7-suse-linux-gnueabi"));
1610 
1611   Triple T;
1612   T = Triple("armv6--netbsd-eabi");
1613   EXPECT_EQ(Triple::arm, T.getArch());
1614   T = Triple("armv6eb--netbsd-eabi");
1615   EXPECT_EQ(Triple::armeb, T.getArch());
1616   T = Triple("armv7-suse-linux-gnueabihf");
1617   EXPECT_EQ(Triple::GNUEABIHF, T.getEnvironment());
1618 }
1619 
TEST(TripleTest,ParseARMArch)1620 TEST(TripleTest, ParseARMArch) {
1621   // ARM
1622   {
1623     Triple T = Triple("arm");
1624     EXPECT_EQ(Triple::arm, T.getArch());
1625   }
1626   {
1627     Triple T = Triple("armeb");
1628     EXPECT_EQ(Triple::armeb, T.getArch());
1629   }
1630   // THUMB
1631   {
1632     Triple T = Triple("thumb");
1633     EXPECT_EQ(Triple::thumb, T.getArch());
1634   }
1635   {
1636     Triple T = Triple("thumbeb");
1637     EXPECT_EQ(Triple::thumbeb, T.getArch());
1638   }
1639   // AARCH64
1640   {
1641     Triple T = Triple("arm64");
1642     EXPECT_EQ(Triple::aarch64, T.getArch());
1643   }
1644   {
1645     Triple T = Triple("arm64_32");
1646     EXPECT_EQ(Triple::aarch64_32, T.getArch());
1647   }
1648   {
1649     Triple T = Triple("aarch64");
1650     EXPECT_EQ(Triple::aarch64, T.getArch());
1651   }
1652   {
1653     Triple T = Triple("aarch64_be");
1654     EXPECT_EQ(Triple::aarch64_be, T.getArch());
1655   }
1656 }
1657 } // end anonymous namespace
1658