1 //===--- Triple.cpp - Target triple helper class --------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/Triple.h"
10 #include "llvm/ADT/STLExtras.h"
11 #include "llvm/ADT/SmallString.h"
12 #include "llvm/ADT/StringSwitch.h"
13 #include "llvm/Support/ErrorHandling.h"
14 #include "llvm/Support/Host.h"
15 #include "llvm/Support/TargetParser.h"
19 StringRef
Triple::getArchTypeName(ArchType Kind
) {
21 case UnknownArch
: return "unknown";
23 case aarch64
: return "aarch64";
24 case aarch64_be
: return "aarch64_be";
25 case aarch64_32
: return "aarch64_32";
26 case arm
: return "arm";
27 case armeb
: return "armeb";
28 case arc
: return "arc";
29 case avr
: return "avr";
30 case bpfel
: return "bpfel";
31 case bpfeb
: return "bpfeb";
32 case hexagon
: return "hexagon";
33 case mips
: return "mips";
34 case mipsel
: return "mipsel";
35 case mips64
: return "mips64";
36 case mips64el
: return "mips64el";
37 case msp430
: return "msp430";
38 case ppc64
: return "powerpc64";
39 case ppc64le
: return "powerpc64le";
40 case ppc
: return "powerpc";
41 case r600
: return "r600";
42 case amdgcn
: return "amdgcn";
43 case riscv32
: return "riscv32";
44 case riscv64
: return "riscv64";
45 case sparc
: return "sparc";
46 case sparcv9
: return "sparcv9";
47 case sparcel
: return "sparcel";
48 case systemz
: return "s390x";
49 case tce
: return "tce";
50 case tcele
: return "tcele";
51 case thumb
: return "thumb";
52 case thumbeb
: return "thumbeb";
53 case x86
: return "i386";
54 case x86_64
: return "x86_64";
55 case xcore
: return "xcore";
56 case nvptx
: return "nvptx";
57 case nvptx64
: return "nvptx64";
58 case le32
: return "le32";
59 case le64
: return "le64";
60 case amdil
: return "amdil";
61 case amdil64
: return "amdil64";
62 case hsail
: return "hsail";
63 case hsail64
: return "hsail64";
64 case spir
: return "spir";
65 case spir64
: return "spir64";
66 case kalimba
: return "kalimba";
67 case lanai
: return "lanai";
68 case shave
: return "shave";
69 case wasm32
: return "wasm32";
70 case wasm64
: return "wasm64";
71 case renderscript32
: return "renderscript32";
72 case renderscript64
: return "renderscript64";
75 llvm_unreachable("Invalid ArchType!");
78 StringRef
Triple::getArchTypePrefix(ArchType Kind
) {
85 case aarch64_32
: return "aarch64";
87 case arc
: return "arc";
92 case thumbeb
: return "arm";
94 case avr
: return "avr";
98 case ppc
: return "ppc";
103 case mips64el
: return "mips";
105 case hexagon
: return "hexagon";
107 case amdgcn
: return "amdgcn";
108 case r600
: return "r600";
111 case bpfeb
: return "bpf";
115 case sparc
: return "sparc";
117 case systemz
: return "s390";
120 case x86_64
: return "x86";
122 case xcore
: return "xcore";
124 // NVPTX intrinsics are namespaced under nvvm.
125 case nvptx
: return "nvvm";
126 case nvptx64
: return "nvvm";
128 case le32
: return "le32";
129 case le64
: return "le64";
132 case amdil64
: return "amdil";
135 case hsail64
: return "hsail";
138 case spir64
: return "spir";
139 case kalimba
: return "kalimba";
140 case lanai
: return "lanai";
141 case shave
: return "shave";
143 case wasm64
: return "wasm";
146 case riscv64
: return "riscv";
150 StringRef
Triple::getVendorTypeName(VendorType Kind
) {
152 case UnknownVendor
: return "unknown";
154 case Apple
: return "apple";
155 case PC
: return "pc";
156 case SCEI
: return "scei";
157 case BGP
: return "bgp";
158 case BGQ
: return "bgq";
159 case Freescale
: return "fsl";
160 case IBM
: return "ibm";
161 case ImaginationTechnologies
: return "img";
162 case MipsTechnologies
: return "mti";
163 case NVIDIA
: return "nvidia";
164 case CSR
: return "csr";
165 case Myriad
: return "myriad";
166 case AMD
: return "amd";
167 case Mesa
: return "mesa";
168 case SUSE
: return "suse";
169 case OpenEmbedded
: return "oe";
172 llvm_unreachable("Invalid VendorType!");
175 StringRef
Triple::getOSTypeName(OSType Kind
) {
177 case UnknownOS
: return "unknown";
179 case Ananas
: return "ananas";
180 case CloudABI
: return "cloudabi";
181 case Darwin
: return "darwin";
182 case DragonFly
: return "dragonfly";
183 case FreeBSD
: return "freebsd";
184 case Fuchsia
: return "fuchsia";
185 case IOS
: return "ios";
186 case KFreeBSD
: return "kfreebsd";
187 case Linux
: return "linux";
188 case Lv2
: return "lv2";
189 case MacOSX
: return "macosx";
190 case NetBSD
: return "netbsd";
191 case OpenBSD
: return "openbsd";
192 case Solaris
: return "solaris";
193 case Win32
: return "windows";
194 case Haiku
: return "haiku";
195 case Minix
: return "minix";
196 case RTEMS
: return "rtems";
197 case NaCl
: return "nacl";
198 case CNK
: return "cnk";
199 case AIX
: return "aix";
200 case CUDA
: return "cuda";
201 case NVCL
: return "nvcl";
202 case AMDHSA
: return "amdhsa";
203 case PS4
: return "ps4";
204 case ELFIAMCU
: return "elfiamcu";
205 case TvOS
: return "tvos";
206 case WatchOS
: return "watchos";
207 case Mesa3D
: return "mesa3d";
208 case Contiki
: return "contiki";
209 case AMDPAL
: return "amdpal";
210 case HermitCore
: return "hermit";
211 case Hurd
: return "hurd";
212 case WASI
: return "wasi";
213 case Emscripten
: return "emscripten";
216 llvm_unreachable("Invalid OSType");
219 StringRef
Triple::getEnvironmentTypeName(EnvironmentType Kind
) {
221 case UnknownEnvironment
: return "unknown";
222 case GNU
: return "gnu";
223 case GNUABIN32
: return "gnuabin32";
224 case GNUABI64
: return "gnuabi64";
225 case GNUEABIHF
: return "gnueabihf";
226 case GNUEABI
: return "gnueabi";
227 case GNUX32
: return "gnux32";
228 case CODE16
: return "code16";
229 case EABI
: return "eabi";
230 case EABIHF
: return "eabihf";
231 case ELFv1
: return "elfv1";
232 case ELFv2
: return "elfv2";
233 case Android
: return "android";
234 case Musl
: return "musl";
235 case MuslEABI
: return "musleabi";
236 case MuslEABIHF
: return "musleabihf";
237 case MSVC
: return "msvc";
238 case Itanium
: return "itanium";
239 case Cygnus
: return "cygnus";
240 case CoreCLR
: return "coreclr";
241 case Simulator
: return "simulator";
242 case MacABI
: return "macabi";
245 llvm_unreachable("Invalid EnvironmentType!");
248 static Triple::ArchType
parseBPFArch(StringRef ArchName
) {
249 if (ArchName
.equals("bpf")) {
250 if (sys::IsLittleEndianHost
)
251 return Triple::bpfel
;
253 return Triple::bpfeb
;
254 } else if (ArchName
.equals("bpf_be") || ArchName
.equals("bpfeb")) {
255 return Triple::bpfeb
;
256 } else if (ArchName
.equals("bpf_le") || ArchName
.equals("bpfel")) {
257 return Triple::bpfel
;
259 return Triple::UnknownArch
;
263 Triple::ArchType
Triple::getArchTypeForLLVMName(StringRef Name
) {
264 Triple::ArchType
BPFArch(parseBPFArch(Name
));
265 return StringSwitch
<Triple::ArchType
>(Name
)
266 .Case("aarch64", aarch64
)
267 .Case("aarch64_be", aarch64_be
)
268 .Case("aarch64_32", aarch64_32
)
270 .Case("arm64", aarch64
) // "arm64" is an alias for "aarch64"
271 .Case("arm64_32", aarch64_32
)
273 .Case("armeb", armeb
)
275 .StartsWith("bpf", BPFArch
)
277 .Case("mipsel", mipsel
)
278 .Case("mips64", mips64
)
279 .Case("mips64el", mips64el
)
280 .Case("msp430", msp430
)
281 .Case("ppc64", ppc64
)
284 .Case("ppc64le", ppc64le
)
286 .Case("amdgcn", amdgcn
)
287 .Case("riscv32", riscv32
)
288 .Case("riscv64", riscv64
)
289 .Case("hexagon", hexagon
)
290 .Case("sparc", sparc
)
291 .Case("sparcel", sparcel
)
292 .Case("sparcv9", sparcv9
)
293 .Case("systemz", systemz
)
295 .Case("tcele", tcele
)
296 .Case("thumb", thumb
)
297 .Case("thumbeb", thumbeb
)
299 .Case("x86-64", x86_64
)
300 .Case("xcore", xcore
)
301 .Case("nvptx", nvptx
)
302 .Case("nvptx64", nvptx64
)
305 .Case("amdil", amdil
)
306 .Case("amdil64", amdil64
)
307 .Case("hsail", hsail
)
308 .Case("hsail64", hsail64
)
310 .Case("spir64", spir64
)
311 .Case("kalimba", kalimba
)
312 .Case("lanai", lanai
)
313 .Case("shave", shave
)
314 .Case("wasm32", wasm32
)
315 .Case("wasm64", wasm64
)
316 .Case("renderscript32", renderscript32
)
317 .Case("renderscript64", renderscript64
)
318 .Default(UnknownArch
);
321 static Triple::ArchType
parseARMArch(StringRef ArchName
) {
322 ARM::ISAKind ISA
= ARM::parseArchISA(ArchName
);
323 ARM::EndianKind ENDIAN
= ARM::parseArchEndian(ArchName
);
325 Triple::ArchType arch
= Triple::UnknownArch
;
327 case ARM::EndianKind::LITTLE
: {
329 case ARM::ISAKind::ARM
:
332 case ARM::ISAKind::THUMB
:
333 arch
= Triple::thumb
;
335 case ARM::ISAKind::AARCH64
:
336 arch
= Triple::aarch64
;
338 case ARM::ISAKind::INVALID
:
343 case ARM::EndianKind::BIG
: {
345 case ARM::ISAKind::ARM
:
346 arch
= Triple::armeb
;
348 case ARM::ISAKind::THUMB
:
349 arch
= Triple::thumbeb
;
351 case ARM::ISAKind::AARCH64
:
352 arch
= Triple::aarch64_be
;
354 case ARM::ISAKind::INVALID
:
359 case ARM::EndianKind::INVALID
: {
364 ArchName
= ARM::getCanonicalArchName(ArchName
);
365 if (ArchName
.empty())
366 return Triple::UnknownArch
;
368 // Thumb only exists in v4+
369 if (ISA
== ARM::ISAKind::THUMB
&&
370 (ArchName
.startswith("v2") || ArchName
.startswith("v3")))
371 return Triple::UnknownArch
;
373 // Thumb only for v6m
374 ARM::ProfileKind Profile
= ARM::parseArchProfile(ArchName
);
375 unsigned Version
= ARM::parseArchVersion(ArchName
);
376 if (Profile
== ARM::ProfileKind::M
&& Version
== 6) {
377 if (ENDIAN
== ARM::EndianKind::BIG
)
378 return Triple::thumbeb
;
380 return Triple::thumb
;
386 static Triple::ArchType
parseArch(StringRef ArchName
) {
387 auto AT
= StringSwitch
<Triple::ArchType
>(ArchName
)
388 .Cases("i386", "i486", "i586", "i686", Triple::x86
)
389 // FIXME: Do we need to support these?
390 .Cases("i786", "i886", "i986", Triple::x86
)
391 .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64
)
392 .Cases("powerpc", "ppc", "ppc32", Triple::ppc
)
393 .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64
)
394 .Cases("powerpc64le", "ppc64le", Triple::ppc64le
)
395 .Case("xscale", Triple::arm
)
396 .Case("xscaleeb", Triple::armeb
)
397 .Case("aarch64", Triple::aarch64
)
398 .Case("aarch64_be", Triple::aarch64_be
)
399 .Case("aarch64_32", Triple::aarch64_32
)
400 .Case("arc", Triple::arc
)
401 .Case("arm64", Triple::aarch64
)
402 .Case("arm64_32", Triple::aarch64_32
)
403 .Case("arm", Triple::arm
)
404 .Case("armeb", Triple::armeb
)
405 .Case("thumb", Triple::thumb
)
406 .Case("thumbeb", Triple::thumbeb
)
407 .Case("avr", Triple::avr
)
408 .Case("msp430", Triple::msp430
)
409 .Cases("mips", "mipseb", "mipsallegrex", "mipsisa32r6",
410 "mipsr6", Triple::mips
)
411 .Cases("mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el",
413 .Cases("mips64", "mips64eb", "mipsn32", "mipsisa64r6",
414 "mips64r6", "mipsn32r6", Triple::mips64
)
415 .Cases("mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",
416 "mipsn32r6el", Triple::mips64el
)
417 .Case("r600", Triple::r600
)
418 .Case("amdgcn", Triple::amdgcn
)
419 .Case("riscv32", Triple::riscv32
)
420 .Case("riscv64", Triple::riscv64
)
421 .Case("hexagon", Triple::hexagon
)
422 .Cases("s390x", "systemz", Triple::systemz
)
423 .Case("sparc", Triple::sparc
)
424 .Case("sparcel", Triple::sparcel
)
425 .Cases("sparcv9", "sparc64", Triple::sparcv9
)
426 .Case("tce", Triple::tce
)
427 .Case("tcele", Triple::tcele
)
428 .Case("xcore", Triple::xcore
)
429 .Case("nvptx", Triple::nvptx
)
430 .Case("nvptx64", Triple::nvptx64
)
431 .Case("le32", Triple::le32
)
432 .Case("le64", Triple::le64
)
433 .Case("amdil", Triple::amdil
)
434 .Case("amdil64", Triple::amdil64
)
435 .Case("hsail", Triple::hsail
)
436 .Case("hsail64", Triple::hsail64
)
437 .Case("spir", Triple::spir
)
438 .Case("spir64", Triple::spir64
)
439 .StartsWith("kalimba", Triple::kalimba
)
440 .Case("lanai", Triple::lanai
)
441 .Case("shave", Triple::shave
)
442 .Case("wasm32", Triple::wasm32
)
443 .Case("wasm64", Triple::wasm64
)
444 .Case("renderscript32", Triple::renderscript32
)
445 .Case("renderscript64", Triple::renderscript64
)
446 .Default(Triple::UnknownArch
);
448 // Some architectures require special parsing logic just to compute the
450 if (AT
== Triple::UnknownArch
) {
451 if (ArchName
.startswith("arm") || ArchName
.startswith("thumb") ||
452 ArchName
.startswith("aarch64"))
453 return parseARMArch(ArchName
);
454 if (ArchName
.startswith("bpf"))
455 return parseBPFArch(ArchName
);
461 static Triple::VendorType
parseVendor(StringRef VendorName
) {
462 return StringSwitch
<Triple::VendorType
>(VendorName
)
463 .Case("apple", Triple::Apple
)
464 .Case("pc", Triple::PC
)
465 .Case("scei", Triple::SCEI
)
466 .Case("bgp", Triple::BGP
)
467 .Case("bgq", Triple::BGQ
)
468 .Case("fsl", Triple::Freescale
)
469 .Case("ibm", Triple::IBM
)
470 .Case("img", Triple::ImaginationTechnologies
)
471 .Case("mti", Triple::MipsTechnologies
)
472 .Case("nvidia", Triple::NVIDIA
)
473 .Case("csr", Triple::CSR
)
474 .Case("myriad", Triple::Myriad
)
475 .Case("amd", Triple::AMD
)
476 .Case("mesa", Triple::Mesa
)
477 .Case("suse", Triple::SUSE
)
478 .Case("oe", Triple::OpenEmbedded
)
479 .Default(Triple::UnknownVendor
);
482 static Triple::OSType
parseOS(StringRef OSName
) {
483 return StringSwitch
<Triple::OSType
>(OSName
)
484 .StartsWith("ananas", Triple::Ananas
)
485 .StartsWith("cloudabi", Triple::CloudABI
)
486 .StartsWith("darwin", Triple::Darwin
)
487 .StartsWith("dragonfly", Triple::DragonFly
)
488 .StartsWith("freebsd", Triple::FreeBSD
)
489 .StartsWith("fuchsia", Triple::Fuchsia
)
490 .StartsWith("ios", Triple::IOS
)
491 .StartsWith("kfreebsd", Triple::KFreeBSD
)
492 .StartsWith("linux", Triple::Linux
)
493 .StartsWith("lv2", Triple::Lv2
)
494 .StartsWith("macos", Triple::MacOSX
)
495 .StartsWith("netbsd", Triple::NetBSD
)
496 .StartsWith("openbsd", Triple::OpenBSD
)
497 .StartsWith("solaris", Triple::Solaris
)
498 .StartsWith("win32", Triple::Win32
)
499 .StartsWith("windows", Triple::Win32
)
500 .StartsWith("haiku", Triple::Haiku
)
501 .StartsWith("minix", Triple::Minix
)
502 .StartsWith("rtems", Triple::RTEMS
)
503 .StartsWith("nacl", Triple::NaCl
)
504 .StartsWith("cnk", Triple::CNK
)
505 .StartsWith("aix", Triple::AIX
)
506 .StartsWith("cuda", Triple::CUDA
)
507 .StartsWith("nvcl", Triple::NVCL
)
508 .StartsWith("amdhsa", Triple::AMDHSA
)
509 .StartsWith("ps4", Triple::PS4
)
510 .StartsWith("elfiamcu", Triple::ELFIAMCU
)
511 .StartsWith("tvos", Triple::TvOS
)
512 .StartsWith("watchos", Triple::WatchOS
)
513 .StartsWith("mesa3d", Triple::Mesa3D
)
514 .StartsWith("contiki", Triple::Contiki
)
515 .StartsWith("amdpal", Triple::AMDPAL
)
516 .StartsWith("hermit", Triple::HermitCore
)
517 .StartsWith("hurd", Triple::Hurd
)
518 .StartsWith("wasi", Triple::WASI
)
519 .StartsWith("emscripten", Triple::Emscripten
)
520 .Default(Triple::UnknownOS
);
523 static Triple::EnvironmentType
parseEnvironment(StringRef EnvironmentName
) {
524 return StringSwitch
<Triple::EnvironmentType
>(EnvironmentName
)
525 .StartsWith("eabihf", Triple::EABIHF
)
526 .StartsWith("eabi", Triple::EABI
)
527 .StartsWith("elfv1", Triple::ELFv1
)
528 .StartsWith("elfv2", Triple::ELFv2
)
529 .StartsWith("gnuabin32", Triple::GNUABIN32
)
530 .StartsWith("gnuabi64", Triple::GNUABI64
)
531 .StartsWith("gnueabihf", Triple::GNUEABIHF
)
532 .StartsWith("gnueabi", Triple::GNUEABI
)
533 .StartsWith("gnux32", Triple::GNUX32
)
534 .StartsWith("code16", Triple::CODE16
)
535 .StartsWith("gnu", Triple::GNU
)
536 .StartsWith("android", Triple::Android
)
537 .StartsWith("musleabihf", Triple::MuslEABIHF
)
538 .StartsWith("musleabi", Triple::MuslEABI
)
539 .StartsWith("musl", Triple::Musl
)
540 .StartsWith("msvc", Triple::MSVC
)
541 .StartsWith("itanium", Triple::Itanium
)
542 .StartsWith("cygnus", Triple::Cygnus
)
543 .StartsWith("coreclr", Triple::CoreCLR
)
544 .StartsWith("simulator", Triple::Simulator
)
545 .StartsWith("macabi", Triple::MacABI
)
546 .Default(Triple::UnknownEnvironment
);
549 static Triple::ObjectFormatType
parseFormat(StringRef EnvironmentName
) {
550 return StringSwitch
<Triple::ObjectFormatType
>(EnvironmentName
)
551 // "xcoff" must come before "coff" because of the order-dependendent
553 .EndsWith("xcoff", Triple::XCOFF
)
554 .EndsWith("coff", Triple::COFF
)
555 .EndsWith("elf", Triple::ELF
)
556 .EndsWith("macho", Triple::MachO
)
557 .EndsWith("wasm", Triple::Wasm
)
558 .Default(Triple::UnknownObjectFormat
);
561 static Triple::SubArchType
parseSubArch(StringRef SubArchName
) {
562 if (SubArchName
.startswith("mips") &&
563 (SubArchName
.endswith("r6el") || SubArchName
.endswith("r6")))
564 return Triple::MipsSubArch_r6
;
566 StringRef ARMSubArch
= ARM::getCanonicalArchName(SubArchName
);
568 // For now, this is the small part. Early return.
569 if (ARMSubArch
.empty())
570 return StringSwitch
<Triple::SubArchType
>(SubArchName
)
571 .EndsWith("kalimba3", Triple::KalimbaSubArch_v3
)
572 .EndsWith("kalimba4", Triple::KalimbaSubArch_v4
)
573 .EndsWith("kalimba5", Triple::KalimbaSubArch_v5
)
574 .Default(Triple::NoSubArch
);
577 switch(ARM::parseArch(ARMSubArch
)) {
578 case ARM::ArchKind::ARMV4
:
579 return Triple::NoSubArch
;
580 case ARM::ArchKind::ARMV4T
:
581 return Triple::ARMSubArch_v4t
;
582 case ARM::ArchKind::ARMV5T
:
583 return Triple::ARMSubArch_v5
;
584 case ARM::ArchKind::ARMV5TE
:
585 case ARM::ArchKind::IWMMXT
:
586 case ARM::ArchKind::IWMMXT2
:
587 case ARM::ArchKind::XSCALE
:
588 case ARM::ArchKind::ARMV5TEJ
:
589 return Triple::ARMSubArch_v5te
;
590 case ARM::ArchKind::ARMV6
:
591 return Triple::ARMSubArch_v6
;
592 case ARM::ArchKind::ARMV6K
:
593 case ARM::ArchKind::ARMV6KZ
:
594 return Triple::ARMSubArch_v6k
;
595 case ARM::ArchKind::ARMV6T2
:
596 return Triple::ARMSubArch_v6t2
;
597 case ARM::ArchKind::ARMV6M
:
598 return Triple::ARMSubArch_v6m
;
599 case ARM::ArchKind::ARMV7A
:
600 case ARM::ArchKind::ARMV7R
:
601 return Triple::ARMSubArch_v7
;
602 case ARM::ArchKind::ARMV7VE
:
603 return Triple::ARMSubArch_v7ve
;
604 case ARM::ArchKind::ARMV7K
:
605 return Triple::ARMSubArch_v7k
;
606 case ARM::ArchKind::ARMV7M
:
607 return Triple::ARMSubArch_v7m
;
608 case ARM::ArchKind::ARMV7S
:
609 return Triple::ARMSubArch_v7s
;
610 case ARM::ArchKind::ARMV7EM
:
611 return Triple::ARMSubArch_v7em
;
612 case ARM::ArchKind::ARMV8A
:
613 return Triple::ARMSubArch_v8
;
614 case ARM::ArchKind::ARMV8_1A
:
615 return Triple::ARMSubArch_v8_1a
;
616 case ARM::ArchKind::ARMV8_2A
:
617 return Triple::ARMSubArch_v8_2a
;
618 case ARM::ArchKind::ARMV8_3A
:
619 return Triple::ARMSubArch_v8_3a
;
620 case ARM::ArchKind::ARMV8_4A
:
621 return Triple::ARMSubArch_v8_4a
;
622 case ARM::ArchKind::ARMV8_5A
:
623 return Triple::ARMSubArch_v8_5a
;
624 case ARM::ArchKind::ARMV8R
:
625 return Triple::ARMSubArch_v8r
;
626 case ARM::ArchKind::ARMV8MBaseline
:
627 return Triple::ARMSubArch_v8m_baseline
;
628 case ARM::ArchKind::ARMV8MMainline
:
629 return Triple::ARMSubArch_v8m_mainline
;
630 case ARM::ArchKind::ARMV8_1MMainline
:
631 return Triple::ARMSubArch_v8_1m_mainline
;
633 return Triple::NoSubArch
;
637 static StringRef
getObjectFormatTypeName(Triple::ObjectFormatType Kind
) {
639 case Triple::UnknownObjectFormat
: return "";
640 case Triple::COFF
: return "coff";
641 case Triple::ELF
: return "elf";
642 case Triple::MachO
: return "macho";
643 case Triple::Wasm
: return "wasm";
644 case Triple::XCOFF
: return "xcoff";
646 llvm_unreachable("unknown object format type");
649 static Triple::ObjectFormatType
getDefaultFormat(const Triple
&T
) {
650 switch (T
.getArch()) {
651 case Triple::UnknownArch
:
652 case Triple::aarch64
:
653 case Triple::aarch64_32
:
659 return Triple::MachO
;
660 else if (T
.isOSWindows())
664 case Triple::aarch64_be
:
668 case Triple::amdil64
:
673 case Triple::hexagon
:
676 case Triple::hsail64
:
677 case Triple::kalimba
:
682 case Triple::mips64el
:
686 case Triple::nvptx64
:
687 case Triple::ppc64le
:
689 case Triple::renderscript32
:
690 case Triple::renderscript64
:
691 case Triple::riscv32
:
692 case Triple::riscv64
:
695 case Triple::sparcel
:
696 case Triple::sparcv9
:
699 case Triple::systemz
:
702 case Triple::thumbeb
:
709 return Triple::MachO
;
710 else if (T
.isOSAIX())
711 return Triple::XCOFF
;
718 llvm_unreachable("unknown architecture");
721 /// Construct a triple from the string representation provided.
723 /// This stores the string representation and parses the various pieces into
725 Triple::Triple(const Twine
&Str
)
726 : Data(Str
.str()), Arch(UnknownArch
), SubArch(NoSubArch
),
727 Vendor(UnknownVendor
), OS(UnknownOS
), Environment(UnknownEnvironment
),
728 ObjectFormat(UnknownObjectFormat
) {
729 // Do minimal parsing by hand here.
730 SmallVector
<StringRef
, 4> Components
;
731 StringRef(Data
).split(Components
, '-', /*MaxSplit*/ 3);
732 if (Components
.size() > 0) {
733 Arch
= parseArch(Components
[0]);
734 SubArch
= parseSubArch(Components
[0]);
735 if (Components
.size() > 1) {
736 Vendor
= parseVendor(Components
[1]);
737 if (Components
.size() > 2) {
738 OS
= parseOS(Components
[2]);
739 if (Components
.size() > 3) {
740 Environment
= parseEnvironment(Components
[3]);
741 ObjectFormat
= parseFormat(Components
[3]);
746 StringSwitch
<Triple::EnvironmentType
>(Components
[0])
747 .StartsWith("mipsn32", Triple::GNUABIN32
)
748 .StartsWith("mips64", Triple::GNUABI64
)
749 .StartsWith("mipsisa64", Triple::GNUABI64
)
750 .StartsWith("mipsisa32", Triple::GNU
)
751 .Cases("mips", "mipsel", "mipsr6", "mipsr6el", Triple::GNU
)
752 .Default(UnknownEnvironment
);
755 if (ObjectFormat
== UnknownObjectFormat
)
756 ObjectFormat
= getDefaultFormat(*this);
759 /// Construct a triple from string representations of the architecture,
762 /// This joins each argument into a canonical string representation and parses
763 /// them into enum members. It leaves the environment unknown and omits it from
764 /// the string representation.
765 Triple::Triple(const Twine
&ArchStr
, const Twine
&VendorStr
, const Twine
&OSStr
)
766 : Data((ArchStr
+ Twine('-') + VendorStr
+ Twine('-') + OSStr
).str()),
767 Arch(parseArch(ArchStr
.str())),
768 SubArch(parseSubArch(ArchStr
.str())),
769 Vendor(parseVendor(VendorStr
.str())),
770 OS(parseOS(OSStr
.str())),
771 Environment(), ObjectFormat(Triple::UnknownObjectFormat
) {
772 ObjectFormat
= getDefaultFormat(*this);
775 /// Construct a triple from string representations of the architecture,
776 /// vendor, OS, and environment.
778 /// This joins each argument into a canonical string representation and parses
779 /// them into enum members.
780 Triple::Triple(const Twine
&ArchStr
, const Twine
&VendorStr
, const Twine
&OSStr
,
781 const Twine
&EnvironmentStr
)
782 : Data((ArchStr
+ Twine('-') + VendorStr
+ Twine('-') + OSStr
+ Twine('-') +
783 EnvironmentStr
).str()),
784 Arch(parseArch(ArchStr
.str())),
785 SubArch(parseSubArch(ArchStr
.str())),
786 Vendor(parseVendor(VendorStr
.str())),
787 OS(parseOS(OSStr
.str())),
788 Environment(parseEnvironment(EnvironmentStr
.str())),
789 ObjectFormat(parseFormat(EnvironmentStr
.str())) {
790 if (ObjectFormat
== Triple::UnknownObjectFormat
)
791 ObjectFormat
= getDefaultFormat(*this);
794 std::string
Triple::normalize(StringRef Str
) {
795 bool IsMinGW32
= false;
796 bool IsCygwin
= false;
798 // Parse into components.
799 SmallVector
<StringRef
, 4> Components
;
800 Str
.split(Components
, '-');
802 // If the first component corresponds to a known architecture, preferentially
803 // use it for the architecture. If the second component corresponds to a
804 // known vendor, preferentially use it for the vendor, etc. This avoids silly
805 // component movement when a component parses as (eg) both a valid arch and a
807 ArchType Arch
= UnknownArch
;
808 if (Components
.size() > 0)
809 Arch
= parseArch(Components
[0]);
810 VendorType Vendor
= UnknownVendor
;
811 if (Components
.size() > 1)
812 Vendor
= parseVendor(Components
[1]);
813 OSType OS
= UnknownOS
;
814 if (Components
.size() > 2) {
815 OS
= parseOS(Components
[2]);
816 IsCygwin
= Components
[2].startswith("cygwin");
817 IsMinGW32
= Components
[2].startswith("mingw");
819 EnvironmentType Environment
= UnknownEnvironment
;
820 if (Components
.size() > 3)
821 Environment
= parseEnvironment(Components
[3]);
822 ObjectFormatType ObjectFormat
= UnknownObjectFormat
;
823 if (Components
.size() > 4)
824 ObjectFormat
= parseFormat(Components
[4]);
826 // Note which components are already in their final position. These will not
829 Found
[0] = Arch
!= UnknownArch
;
830 Found
[1] = Vendor
!= UnknownVendor
;
831 Found
[2] = OS
!= UnknownOS
;
832 Found
[3] = Environment
!= UnknownEnvironment
;
834 // If they are not there already, permute the components into their canonical
835 // positions by seeing if they parse as a valid architecture, and if so moving
836 // the component to the architecture position etc.
837 for (unsigned Pos
= 0; Pos
!= array_lengthof(Found
); ++Pos
) {
839 continue; // Already in the canonical position.
841 for (unsigned Idx
= 0; Idx
!= Components
.size(); ++Idx
) {
842 // Do not reparse any components that already matched.
843 if (Idx
< array_lengthof(Found
) && Found
[Idx
])
846 // Does this component parse as valid for the target position?
848 StringRef Comp
= Components
[Idx
];
850 default: llvm_unreachable("unexpected component type!");
852 Arch
= parseArch(Comp
);
853 Valid
= Arch
!= UnknownArch
;
856 Vendor
= parseVendor(Comp
);
857 Valid
= Vendor
!= UnknownVendor
;
861 IsCygwin
= Comp
.startswith("cygwin");
862 IsMinGW32
= Comp
.startswith("mingw");
863 Valid
= OS
!= UnknownOS
|| IsCygwin
|| IsMinGW32
;
866 Environment
= parseEnvironment(Comp
);
867 Valid
= Environment
!= UnknownEnvironment
;
869 ObjectFormat
= parseFormat(Comp
);
870 Valid
= ObjectFormat
!= UnknownObjectFormat
;
875 continue; // Nope, try the next component.
877 // Move the component to the target position, pushing any non-fixed
878 // components that are in the way to the right. This tends to give
879 // good results in the common cases of a forgotten vendor component
880 // or a wrongly positioned environment.
882 // Insert left, pushing the existing components to the right. For
883 // example, a-b-i386 -> i386-a-b when moving i386 to the front.
884 StringRef
CurrentComponent(""); // The empty component.
885 // Replace the component we are moving with an empty component.
886 std::swap(CurrentComponent
, Components
[Idx
]);
887 // Insert the component being moved at Pos, displacing any existing
888 // components to the right.
889 for (unsigned i
= Pos
; !CurrentComponent
.empty(); ++i
) {
890 // Skip over any fixed components.
891 while (i
< array_lengthof(Found
) && Found
[i
])
893 // Place the component at the new position, getting the component
894 // that was at this position - it will be moved right.
895 std::swap(CurrentComponent
, Components
[i
]);
897 } else if (Pos
> Idx
) {
898 // Push right by inserting empty components until the component at Idx
899 // reaches the target position Pos. For example, pc-a -> -pc-a when
900 // moving pc to the second position.
902 // Insert one empty component at Idx.
903 StringRef
CurrentComponent(""); // The empty component.
904 for (unsigned i
= Idx
; i
< Components
.size();) {
905 // Place the component at the new position, getting the component
906 // that was at this position - it will be moved right.
907 std::swap(CurrentComponent
, Components
[i
]);
908 // If it was placed on top of an empty component then we are done.
909 if (CurrentComponent
.empty())
911 // Advance to the next component, skipping any fixed components.
912 while (++i
< array_lengthof(Found
) && Found
[i
])
915 // The last component was pushed off the end - append it.
916 if (!CurrentComponent
.empty())
917 Components
.push_back(CurrentComponent
);
919 // Advance Idx to the component's new position.
920 while (++Idx
< array_lengthof(Found
) && Found
[Idx
])
922 } while (Idx
< Pos
); // Add more until the final position is reached.
924 assert(Pos
< Components
.size() && Components
[Pos
] == Comp
&&
925 "Component moved wrong!");
931 // Replace empty components with "unknown" value.
932 for (unsigned i
= 0, e
= Components
.size(); i
< e
; ++i
) {
933 if (Components
[i
].empty())
934 Components
[i
] = "unknown";
937 // Special case logic goes here. At this point Arch, Vendor and OS have the
938 // correct values for the computed components.
939 std::string NormalizedEnvironment
;
940 if (Environment
== Triple::Android
&& Components
[3].startswith("androideabi")) {
941 StringRef AndroidVersion
= Components
[3].drop_front(strlen("androideabi"));
942 if (AndroidVersion
.empty()) {
943 Components
[3] = "android";
945 NormalizedEnvironment
= Twine("android", AndroidVersion
).str();
946 Components
[3] = NormalizedEnvironment
;
950 // SUSE uses "gnueabi" to mean "gnueabihf"
951 if (Vendor
== Triple::SUSE
&& Environment
== llvm::Triple::GNUEABI
)
952 Components
[3] = "gnueabihf";
954 if (OS
== Triple::Win32
) {
955 Components
.resize(4);
956 Components
[2] = "windows";
957 if (Environment
== UnknownEnvironment
) {
958 if (ObjectFormat
== UnknownObjectFormat
|| ObjectFormat
== Triple::COFF
)
959 Components
[3] = "msvc";
961 Components
[3] = getObjectFormatTypeName(ObjectFormat
);
963 } else if (IsMinGW32
) {
964 Components
.resize(4);
965 Components
[2] = "windows";
966 Components
[3] = "gnu";
967 } else if (IsCygwin
) {
968 Components
.resize(4);
969 Components
[2] = "windows";
970 Components
[3] = "cygnus";
972 if (IsMinGW32
|| IsCygwin
||
973 (OS
== Triple::Win32
&& Environment
!= UnknownEnvironment
)) {
974 if (ObjectFormat
!= UnknownObjectFormat
&& ObjectFormat
!= Triple::COFF
) {
975 Components
.resize(5);
976 Components
[4] = getObjectFormatTypeName(ObjectFormat
);
980 // Stick the corrected components back together to form the normalized string.
981 std::string Normalized
;
982 for (unsigned i
= 0, e
= Components
.size(); i
!= e
; ++i
) {
983 if (i
) Normalized
+= '-';
984 Normalized
+= Components
[i
];
989 StringRef
Triple::getArchName() const {
990 return StringRef(Data
).split('-').first
; // Isolate first component
993 StringRef
Triple::getVendorName() const {
994 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
995 return Tmp
.split('-').first
; // Isolate second component
998 StringRef
Triple::getOSName() const {
999 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
1000 Tmp
= Tmp
.split('-').second
; // Strip second component
1001 return Tmp
.split('-').first
; // Isolate third component
1004 StringRef
Triple::getEnvironmentName() const {
1005 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
1006 Tmp
= Tmp
.split('-').second
; // Strip second component
1007 return Tmp
.split('-').second
; // Strip third component
1010 StringRef
Triple::getOSAndEnvironmentName() const {
1011 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
1012 return Tmp
.split('-').second
; // Strip second component
1015 static unsigned EatNumber(StringRef
&Str
) {
1016 assert(!Str
.empty() && Str
[0] >= '0' && Str
[0] <= '9' && "Not a number");
1017 unsigned Result
= 0;
1020 // Consume the leading digit.
1021 Result
= Result
*10 + (Str
[0] - '0');
1024 Str
= Str
.substr(1);
1025 } while (!Str
.empty() && Str
[0] >= '0' && Str
[0] <= '9');
1030 static void parseVersionFromName(StringRef Name
, unsigned &Major
,
1031 unsigned &Minor
, unsigned &Micro
) {
1032 // Any unset version defaults to 0.
1033 Major
= Minor
= Micro
= 0;
1035 // Parse up to three components.
1036 unsigned *Components
[3] = {&Major
, &Minor
, &Micro
};
1037 for (unsigned i
= 0; i
!= 3; ++i
) {
1038 if (Name
.empty() || Name
[0] < '0' || Name
[0] > '9')
1041 // Consume the leading number.
1042 *Components
[i
] = EatNumber(Name
);
1044 // Consume the separator, if present.
1045 if (Name
.startswith("."))
1046 Name
= Name
.substr(1);
1050 void Triple::getEnvironmentVersion(unsigned &Major
, unsigned &Minor
,
1051 unsigned &Micro
) const {
1052 StringRef EnvironmentName
= getEnvironmentName();
1053 StringRef EnvironmentTypeName
= getEnvironmentTypeName(getEnvironment());
1054 if (EnvironmentName
.startswith(EnvironmentTypeName
))
1055 EnvironmentName
= EnvironmentName
.substr(EnvironmentTypeName
.size());
1057 parseVersionFromName(EnvironmentName
, Major
, Minor
, Micro
);
1060 void Triple::getOSVersion(unsigned &Major
, unsigned &Minor
,
1061 unsigned &Micro
) const {
1062 StringRef OSName
= getOSName();
1063 // Assume that the OS portion of the triple starts with the canonical name.
1064 StringRef OSTypeName
= getOSTypeName(getOS());
1065 if (OSName
.startswith(OSTypeName
))
1066 OSName
= OSName
.substr(OSTypeName
.size());
1067 else if (getOS() == MacOSX
)
1068 OSName
.consume_front("macos");
1070 parseVersionFromName(OSName
, Major
, Minor
, Micro
);
1073 bool Triple::getMacOSXVersion(unsigned &Major
, unsigned &Minor
,
1074 unsigned &Micro
) const {
1075 getOSVersion(Major
, Minor
, Micro
);
1078 default: llvm_unreachable("unexpected OS for Darwin triple");
1080 // Default to darwin8, i.e., MacOSX 10.4.
1083 // Darwin version numbers are skewed from OS X versions.
1102 // Ignore the version from the triple. This is only handled because the
1103 // the clang driver combines OS X and IOS support into a common Darwin
1104 // toolchain that wants to know the OS X version number even when targeting
1114 void Triple::getiOSVersion(unsigned &Major
, unsigned &Minor
,
1115 unsigned &Micro
) const {
1117 default: llvm_unreachable("unexpected OS for Darwin triple");
1120 // Ignore the version from the triple. This is only handled because the
1121 // the clang driver combines OS X and IOS support into a common Darwin
1122 // toolchain that wants to know the iOS version number even when targeting
1130 getOSVersion(Major
, Minor
, Micro
);
1131 // Default to 5.0 (or 7.0 for arm64).
1133 Major
= (getArch() == aarch64
) ? 7 : 5;
1136 llvm_unreachable("conflicting triple info");
1140 void Triple::getWatchOSVersion(unsigned &Major
, unsigned &Minor
,
1141 unsigned &Micro
) const {
1143 default: llvm_unreachable("unexpected OS for Darwin triple");
1146 // Ignore the version from the triple. This is only handled because the
1147 // the clang driver combines OS X and IOS support into a common Darwin
1148 // toolchain that wants to know the iOS version number even when targeting
1155 getOSVersion(Major
, Minor
, Micro
);
1160 llvm_unreachable("conflicting triple info");
1164 void Triple::setTriple(const Twine
&Str
) {
1165 *this = Triple(Str
);
1168 void Triple::setArch(ArchType Kind
) {
1169 setArchName(getArchTypeName(Kind
));
1172 void Triple::setVendor(VendorType Kind
) {
1173 setVendorName(getVendorTypeName(Kind
));
1176 void Triple::setOS(OSType Kind
) {
1177 setOSName(getOSTypeName(Kind
));
1180 void Triple::setEnvironment(EnvironmentType Kind
) {
1181 if (ObjectFormat
== getDefaultFormat(*this))
1182 return setEnvironmentName(getEnvironmentTypeName(Kind
));
1184 setEnvironmentName((getEnvironmentTypeName(Kind
) + Twine("-") +
1185 getObjectFormatTypeName(ObjectFormat
)).str());
1188 void Triple::setObjectFormat(ObjectFormatType Kind
) {
1189 if (Environment
== UnknownEnvironment
)
1190 return setEnvironmentName(getObjectFormatTypeName(Kind
));
1192 setEnvironmentName((getEnvironmentTypeName(Environment
) + Twine("-") +
1193 getObjectFormatTypeName(Kind
)).str());
1196 void Triple::setArchName(StringRef Str
) {
1197 // Work around a miscompilation bug for Twines in gcc 4.0.3.
1198 SmallString
<64> Triple
;
1201 Triple
+= getVendorName();
1203 Triple
+= getOSAndEnvironmentName();
1207 void Triple::setVendorName(StringRef Str
) {
1208 setTriple(getArchName() + "-" + Str
+ "-" + getOSAndEnvironmentName());
1211 void Triple::setOSName(StringRef Str
) {
1212 if (hasEnvironment())
1213 setTriple(getArchName() + "-" + getVendorName() + "-" + Str
+
1214 "-" + getEnvironmentName());
1216 setTriple(getArchName() + "-" + getVendorName() + "-" + Str
);
1219 void Triple::setEnvironmentName(StringRef Str
) {
1220 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
1224 void Triple::setOSAndEnvironmentName(StringRef Str
) {
1225 setTriple(getArchName() + "-" + getVendorName() + "-" + Str
);
1228 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch
) {
1230 case llvm::Triple::UnknownArch
:
1233 case llvm::Triple::avr
:
1234 case llvm::Triple::msp430
:
1237 case llvm::Triple::aarch64_32
:
1238 case llvm::Triple::arc
:
1239 case llvm::Triple::arm
:
1240 case llvm::Triple::armeb
:
1241 case llvm::Triple::hexagon
:
1242 case llvm::Triple::le32
:
1243 case llvm::Triple::mips
:
1244 case llvm::Triple::mipsel
:
1245 case llvm::Triple::nvptx
:
1246 case llvm::Triple::ppc
:
1247 case llvm::Triple::r600
:
1248 case llvm::Triple::riscv32
:
1249 case llvm::Triple::sparc
:
1250 case llvm::Triple::sparcel
:
1251 case llvm::Triple::tce
:
1252 case llvm::Triple::tcele
:
1253 case llvm::Triple::thumb
:
1254 case llvm::Triple::thumbeb
:
1255 case llvm::Triple::x86
:
1256 case llvm::Triple::xcore
:
1257 case llvm::Triple::amdil
:
1258 case llvm::Triple::hsail
:
1259 case llvm::Triple::spir
:
1260 case llvm::Triple::kalimba
:
1261 case llvm::Triple::lanai
:
1262 case llvm::Triple::shave
:
1263 case llvm::Triple::wasm32
:
1264 case llvm::Triple::renderscript32
:
1267 case llvm::Triple::aarch64
:
1268 case llvm::Triple::aarch64_be
:
1269 case llvm::Triple::amdgcn
:
1270 case llvm::Triple::bpfel
:
1271 case llvm::Triple::bpfeb
:
1272 case llvm::Triple::le64
:
1273 case llvm::Triple::mips64
:
1274 case llvm::Triple::mips64el
:
1275 case llvm::Triple::nvptx64
:
1276 case llvm::Triple::ppc64
:
1277 case llvm::Triple::ppc64le
:
1278 case llvm::Triple::riscv64
:
1279 case llvm::Triple::sparcv9
:
1280 case llvm::Triple::systemz
:
1281 case llvm::Triple::x86_64
:
1282 case llvm::Triple::amdil64
:
1283 case llvm::Triple::hsail64
:
1284 case llvm::Triple::spir64
:
1285 case llvm::Triple::wasm64
:
1286 case llvm::Triple::renderscript64
:
1289 llvm_unreachable("Invalid architecture value");
1292 bool Triple::isArch64Bit() const {
1293 return getArchPointerBitWidth(getArch()) == 64;
1296 bool Triple::isArch32Bit() const {
1297 return getArchPointerBitWidth(getArch()) == 32;
1300 bool Triple::isArch16Bit() const {
1301 return getArchPointerBitWidth(getArch()) == 16;
1304 Triple
Triple::get32BitArchVariant() const {
1306 switch (getArch()) {
1307 case Triple::UnknownArch
:
1308 case Triple::amdgcn
:
1312 case Triple::msp430
:
1313 case Triple::systemz
:
1314 case Triple::ppc64le
:
1315 T
.setArch(UnknownArch
);
1318 case Triple::aarch64_32
:
1325 case Triple::hexagon
:
1326 case Triple::kalimba
:
1329 case Triple::mipsel
:
1333 case Triple::riscv32
:
1335 case Triple::sparcel
:
1339 case Triple::thumbeb
:
1344 case Triple::wasm32
:
1345 case Triple::renderscript32
:
1349 case Triple::aarch64
: T
.setArch(Triple::arm
); break;
1350 case Triple::aarch64_be
: T
.setArch(Triple::armeb
); break;
1351 case Triple::le64
: T
.setArch(Triple::le32
); break;
1352 case Triple::mips64
: T
.setArch(Triple::mips
); break;
1353 case Triple::mips64el
: T
.setArch(Triple::mipsel
); break;
1354 case Triple::nvptx64
: T
.setArch(Triple::nvptx
); break;
1355 case Triple::ppc64
: T
.setArch(Triple::ppc
); break;
1356 case Triple::sparcv9
: T
.setArch(Triple::sparc
); break;
1357 case Triple::riscv64
: T
.setArch(Triple::riscv32
); break;
1358 case Triple::x86_64
: T
.setArch(Triple::x86
); break;
1359 case Triple::amdil64
: T
.setArch(Triple::amdil
); break;
1360 case Triple::hsail64
: T
.setArch(Triple::hsail
); break;
1361 case Triple::spir64
: T
.setArch(Triple::spir
); break;
1362 case Triple::wasm64
: T
.setArch(Triple::wasm32
); break;
1363 case Triple::renderscript64
: T
.setArch(Triple::renderscript32
); break;
1368 Triple
Triple::get64BitArchVariant() const {
1370 switch (getArch()) {
1371 case Triple::UnknownArch
:
1374 case Triple::hexagon
:
1375 case Triple::kalimba
:
1377 case Triple::msp430
:
1382 case Triple::sparcel
:
1384 T
.setArch(UnknownArch
);
1387 case Triple::aarch64
:
1388 case Triple::aarch64_be
:
1392 case Triple::amdil64
:
1393 case Triple::amdgcn
:
1394 case Triple::hsail64
:
1395 case Triple::spir64
:
1396 case Triple::mips64
:
1397 case Triple::mips64el
:
1398 case Triple::nvptx64
:
1400 case Triple::ppc64le
:
1401 case Triple::riscv64
:
1402 case Triple::sparcv9
:
1403 case Triple::systemz
:
1404 case Triple::x86_64
:
1405 case Triple::wasm64
:
1406 case Triple::renderscript64
:
1410 case Triple::aarch64_32
: T
.setArch(Triple::aarch64
); break;
1411 case Triple::arm
: T
.setArch(Triple::aarch64
); break;
1412 case Triple::armeb
: T
.setArch(Triple::aarch64_be
); break;
1413 case Triple::le32
: T
.setArch(Triple::le64
); break;
1414 case Triple::mips
: T
.setArch(Triple::mips64
); break;
1415 case Triple::mipsel
: T
.setArch(Triple::mips64el
); break;
1416 case Triple::nvptx
: T
.setArch(Triple::nvptx64
); break;
1417 case Triple::ppc
: T
.setArch(Triple::ppc64
); break;
1418 case Triple::sparc
: T
.setArch(Triple::sparcv9
); break;
1419 case Triple::riscv32
: T
.setArch(Triple::riscv64
); break;
1420 case Triple::x86
: T
.setArch(Triple::x86_64
); break;
1421 case Triple::amdil
: T
.setArch(Triple::amdil64
); break;
1422 case Triple::hsail
: T
.setArch(Triple::hsail64
); break;
1423 case Triple::spir
: T
.setArch(Triple::spir64
); break;
1424 case Triple::thumb
: T
.setArch(Triple::aarch64
); break;
1425 case Triple::thumbeb
: T
.setArch(Triple::aarch64_be
); break;
1426 case Triple::wasm32
: T
.setArch(Triple::wasm64
); break;
1427 case Triple::renderscript32
: T
.setArch(Triple::renderscript64
); break;
1432 Triple
Triple::getBigEndianArchVariant() const {
1434 // Already big endian.
1435 if (!isLittleEndian())
1437 switch (getArch()) {
1438 case Triple::UnknownArch
:
1439 case Triple::amdgcn
:
1440 case Triple::amdil64
:
1443 case Triple::hexagon
:
1444 case Triple::hsail64
:
1446 case Triple::kalimba
:
1449 case Triple::msp430
:
1450 case Triple::nvptx64
:
1453 case Triple::riscv32
:
1454 case Triple::riscv64
:
1456 case Triple::spir64
:
1458 case Triple::wasm32
:
1459 case Triple::wasm64
:
1461 case Triple::x86_64
:
1463 case Triple::renderscript32
:
1464 case Triple::renderscript64
:
1466 // ARM is intentionally unsupported here, changing the architecture would
1467 // drop any arch suffixes.
1470 T
.setArch(UnknownArch
);
1473 case Triple::tcele
: T
.setArch(Triple::tce
); break;
1474 case Triple::aarch64
: T
.setArch(Triple::aarch64_be
); break;
1475 case Triple::bpfel
: T
.setArch(Triple::bpfeb
); break;
1476 case Triple::mips64el
:T
.setArch(Triple::mips64
); break;
1477 case Triple::mipsel
: T
.setArch(Triple::mips
); break;
1478 case Triple::ppc64le
: T
.setArch(Triple::ppc64
); break;
1479 case Triple::sparcel
: T
.setArch(Triple::sparc
); break;
1481 llvm_unreachable("getBigEndianArchVariant: unknown triple.");
1486 Triple
Triple::getLittleEndianArchVariant() const {
1488 if (isLittleEndian())
1491 switch (getArch()) {
1492 case Triple::UnknownArch
:
1495 case Triple::sparcv9
:
1496 case Triple::systemz
:
1498 // ARM is intentionally unsupported here, changing the architecture would
1499 // drop any arch suffixes.
1501 case Triple::thumbeb
:
1502 T
.setArch(UnknownArch
);
1505 case Triple::tce
: T
.setArch(Triple::tcele
); break;
1506 case Triple::aarch64_be
: T
.setArch(Triple::aarch64
); break;
1507 case Triple::bpfeb
: T
.setArch(Triple::bpfel
); break;
1508 case Triple::mips64
: T
.setArch(Triple::mips64el
); break;
1509 case Triple::mips
: T
.setArch(Triple::mipsel
); break;
1510 case Triple::ppc64
: T
.setArch(Triple::ppc64le
); break;
1511 case Triple::sparc
: T
.setArch(Triple::sparcel
); break;
1513 llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
1518 bool Triple::isLittleEndian() const {
1519 switch (getArch()) {
1520 case Triple::aarch64
:
1521 case Triple::aarch64_32
:
1522 case Triple::amdgcn
:
1523 case Triple::amdil64
:
1528 case Triple::hexagon
:
1529 case Triple::hsail64
:
1531 case Triple::kalimba
:
1534 case Triple::mips64el
:
1535 case Triple::mipsel
:
1536 case Triple::msp430
:
1537 case Triple::nvptx64
:
1539 case Triple::ppc64le
:
1541 case Triple::riscv32
:
1542 case Triple::riscv64
:
1544 case Triple::sparcel
:
1545 case Triple::spir64
:
1548 case Triple::wasm32
:
1549 case Triple::wasm64
:
1551 case Triple::x86_64
:
1554 case Triple::renderscript32
:
1555 case Triple::renderscript64
:
1562 bool Triple::isCompatibleWith(const Triple
&Other
) const {
1563 // ARM and Thumb triples are compatible, if subarch, vendor and OS match.
1564 if ((getArch() == Triple::thumb
&& Other
.getArch() == Triple::arm
) ||
1565 (getArch() == Triple::arm
&& Other
.getArch() == Triple::thumb
) ||
1566 (getArch() == Triple::thumbeb
&& Other
.getArch() == Triple::armeb
) ||
1567 (getArch() == Triple::armeb
&& Other
.getArch() == Triple::thumbeb
)) {
1568 if (getVendor() == Triple::Apple
)
1569 return getSubArch() == Other
.getSubArch() &&
1570 getVendor() == Other
.getVendor() && getOS() == Other
.getOS();
1572 return getSubArch() == Other
.getSubArch() &&
1573 getVendor() == Other
.getVendor() && getOS() == Other
.getOS() &&
1574 getEnvironment() == Other
.getEnvironment() &&
1575 getObjectFormat() == Other
.getObjectFormat();
1578 // If vendor is apple, ignore the version number.
1579 if (getVendor() == Triple::Apple
)
1580 return getArch() == Other
.getArch() && getSubArch() == Other
.getSubArch() &&
1581 getVendor() == Other
.getVendor() && getOS() == Other
.getOS();
1583 return *this == Other
;
1586 std::string
Triple::merge(const Triple
&Other
) const {
1587 // If vendor is apple, pick the triple with the larger version number.
1588 if (getVendor() == Triple::Apple
)
1589 if (Other
.isOSVersionLT(*this))
1595 StringRef
Triple::getARMCPUForArch(StringRef MArch
) const {
1597 MArch
= getArchName();
1598 MArch
= ARM::getCanonicalArchName(MArch
);
1600 // Some defaults are forced.
1602 case llvm::Triple::FreeBSD
:
1603 case llvm::Triple::NetBSD
:
1604 if (!MArch
.empty() && MArch
== "v6")
1605 return "arm1176jzf-s";
1607 case llvm::Triple::Win32
:
1608 // FIXME: this is invalid for WindowsCE
1610 case llvm::Triple::MacOSX
:
1611 case llvm::Triple::IOS
:
1612 case llvm::Triple::WatchOS
:
1613 case llvm::Triple::TvOS
:
1624 StringRef CPU
= ARM::getDefaultCPU(MArch
);
1625 if (!CPU
.empty() && !CPU
.equals("invalid"))
1628 // If no specific architecture version is requested, return the minimum CPU
1629 // required by the OS and environment.
1631 case llvm::Triple::NetBSD
:
1632 switch (getEnvironment()) {
1633 case llvm::Triple::GNUEABIHF
:
1634 case llvm::Triple::GNUEABI
:
1635 case llvm::Triple::EABIHF
:
1636 case llvm::Triple::EABI
:
1637 return "arm926ej-s";
1641 case llvm::Triple::NaCl
:
1642 case llvm::Triple::OpenBSD
:
1645 switch (getEnvironment()) {
1646 case llvm::Triple::EABIHF
:
1647 case llvm::Triple::GNUEABIHF
:
1648 case llvm::Triple::MuslEABIHF
:
1649 return "arm1176jzf-s";
1655 llvm_unreachable("invalid arch name");