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