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