LLVM 24.0.0git
Triple.cpp
Go to the documentation of this file.
1//===--- Triple.cpp - Target triple helper class --------------------------===//
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
10#include "llvm/ADT/DenseMap.h"
21#include <cassert>
22#include <cstring>
23using namespace llvm;
24
25bool Triple::operator==(const Triple &Other) const {
26 return Arch == Other.Arch && SubArch == Other.SubArch &&
27 Vendor == Other.Vendor && OS == Other.OS &&
28 Environment == Other.Environment && ObjectFormat == Other.ObjectFormat;
29}
30
31bool Triple::operator<(const Triple &Other) const {
32 return std::tie(Arch, SubArch, Vendor, OS, Environment, ObjectFormat, Data) <
33 std::tie(Other.Arch, Other.SubArch, Other.Vendor, Other.OS,
34 Other.Environment, Other.ObjectFormat, Other.Data);
35}
36
38 switch (Kind) {
39 case UnknownArch:
40 return "unknown";
41
42 case aarch64:
43 return "aarch64";
44 case aarch64_32:
45 return "aarch64_32";
46 case aarch64_be:
47 return "aarch64_be";
48 case amdgpu:
49 return "amdgpu";
50 case amdil64:
51 return "amdil64";
52 case amdil:
53 return "amdil";
54 case arc:
55 return "arc";
56 case arm:
57 return "arm";
58 case armeb:
59 return "armeb";
60 case avr:
61 return "avr";
62 case bpfeb:
63 return "bpfeb";
64 case bpfel:
65 return "bpfel";
66 case csky:
67 return "csky";
68 case dxil:
69 return "dxil";
70 case hexagon:
71 return "hexagon";
72 case hsail64:
73 return "hsail64";
74 case hsail:
75 return "hsail";
76 case kalimba:
77 return "kalimba";
78 case lanai:
79 return "lanai";
80 case loongarch32:
81 return "loongarch32";
82 case loongarch64:
83 return "loongarch64";
84 case m68k:
85 return "m68k";
86 case mips64:
87 return "mips64";
88 case mips64el:
89 return "mips64el";
90 case mips:
91 return "mips";
92 case mipsel:
93 return "mipsel";
94 case msp430:
95 return "msp430";
96 case nvptx64:
97 return "nvptx64";
98 case nvptx:
99 return "nvptx";
100 case ppc64:
101 return "powerpc64";
102 case ppc64le:
103 return "powerpc64le";
104 case ppc:
105 return "powerpc";
106 case ppcle:
107 return "powerpcle";
108 case r600:
109 return "r600";
110 case renderscript32:
111 return "renderscript32";
112 case renderscript64:
113 return "renderscript64";
114 case riscv32:
115 return "riscv32";
116 case riscv64:
117 return "riscv64";
118 case riscv32be:
119 return "riscv32be";
120 case riscv64be:
121 return "riscv64be";
122 case shave:
123 return "shave";
124 case sparc:
125 return "sparc";
126 case sparcel:
127 return "sparcel";
128 case sparcv9:
129 return "sparcv9";
130 case spir64:
131 return "spir64";
132 case spir:
133 return "spir";
134 case spirv:
135 return "spirv";
136 case spirv32:
137 return "spirv32";
138 case spirv64:
139 return "spirv64";
140 case systemz:
141 return "s390x";
142 case tce:
143 return "tce";
144 case tcele:
145 return "tcele";
146 case tcele64:
147 return "tcele64";
148 case thumb:
149 return "thumb";
150 case thumbeb:
151 return "thumbeb";
152 case ve:
153 return "ve";
154 case wasm32:
155 return "wasm32";
156 case wasm64:
157 return "wasm64";
158 case x86:
159 return "i386";
160 case x86_64:
161 return "x86_64";
162 case xcore:
163 return "xcore";
164 case xtensa:
165 return "xtensa";
166 }
167
168 llvm_unreachable("Invalid ArchType!");
169}
170
172 switch (Kind) {
173 case Triple::mips:
174 if (SubArch == MipsSubArch_r6)
175 return "mipsisa32r6";
176 break;
177 case Triple::mipsel:
178 if (SubArch == MipsSubArch_r6)
179 return "mipsisa32r6el";
180 break;
181 case Triple::mips64:
182 if (SubArch == MipsSubArch_r6)
183 return "mipsisa64r6";
184 break;
185 case Triple::mips64el:
186 if (SubArch == MipsSubArch_r6)
187 return "mipsisa64r6el";
188 break;
189 case Triple::aarch64:
190 if (SubArch == AArch64SubArch_arm64ec)
191 return "arm64ec";
192 if (SubArch == AArch64SubArch_arm64e)
193 return "arm64e";
194 if (SubArch == AArch64SubArch_arm64e_x1)
195 return "arm64e.x1";
196 if (SubArch == AArch64SubArch_lfi)
197 return "aarch64_lfi";
198 break;
199 case Triple::x86_64:
200 if (SubArch == X86_64SubArch_lfi)
201 return "x86_64_lfi";
202 break;
203 case Triple::spirv:
204 switch (SubArch) {
206 return "spirv1.0";
208 return "spirv1.1";
210 return "spirv1.2";
212 return "spirv1.3";
214 return "spirv1.4";
216 return "spirv1.5";
218 return "spirv1.6";
219 default:
220 break;
221 }
222 break;
223 case Triple::dxil:
224 switch (SubArch) {
227 return "dxilv1.0";
229 return "dxilv1.1";
231 return "dxilv1.2";
233 return "dxilv1.3";
235 return "dxilv1.4";
237 return "dxilv1.5";
239 return "dxilv1.6";
241 return "dxilv1.7";
243 return "dxilv1.8";
245 return "dxilv1.9";
247 return "dxilv1.10";
248 default:
249 break;
250 }
251 break;
252 case Triple::amdgpu:
253 return AMDGPU::getSubArchName(SubArch);
254 default:
255 break;
256 }
257 return getArchTypeName(Kind);
258}
259
261 switch (Kind) {
262 default:
263 return StringRef();
264
265 case aarch64:
266 case aarch64_be:
267 case aarch64_32:
268 return "aarch64";
269
270 case arc:
271 return "arc";
272
273 case arm:
274 case armeb:
275 case thumb:
276 case thumbeb:
277 return "arm";
278
279 case avr:
280 return "avr";
281
282 case ppc64:
283 case ppc64le:
284 case ppc:
285 case ppcle:
286 return "ppc";
287
288 case m68k:
289 return "m68k";
290
291 case mips:
292 case mipsel:
293 case mips64:
294 case mips64el:
295 return "mips";
296
297 case hexagon:
298 return "hexagon";
299
300 // Intrinsics use amdgcn prefix.
301 case amdgpu:
302 return "amdgcn";
303 case r600:
304 return "r600";
305
306 case bpfel:
307 case bpfeb:
308 return "bpf";
309
310 case sparcv9:
311 case sparcel:
312 case sparc:
313 return "sparc";
314
315 case systemz:
316 return "s390";
317
318 case x86:
319 case x86_64:
320 return "x86";
321
322 case xcore:
323 return "xcore";
324
325 // NVPTX intrinsics are namespaced under nvvm.
326 case nvptx:
327 return "nvvm";
328 case nvptx64:
329 return "nvvm";
330
331 case amdil:
332 case amdil64:
333 return "amdil";
334
335 case hsail:
336 case hsail64:
337 return "hsail";
338
339 case spir:
340 case spir64:
341 return "spir";
342
343 case spirv:
344 case spirv32:
345 case spirv64:
346 return "spv";
347
348 case kalimba:
349 return "kalimba";
350 case lanai:
351 return "lanai";
352 case shave:
353 return "shave";
354 case wasm32:
355 case wasm64:
356 return "wasm";
357
358 case riscv32:
359 case riscv64:
360 case riscv32be:
361 case riscv64be:
362 return "riscv";
363
364 case ve:
365 return "ve";
366 case csky:
367 return "csky";
368
369 case loongarch32:
370 case loongarch64:
371 return "loongarch";
372
373 case dxil:
374 return "dx";
375
376 case xtensa:
377 return "xtensa";
378 }
379}
380
382 switch (Kind) {
383 case UnknownVendor:
384 return "unknown";
385#define TRIPLE_VENDOR(Enum, Name) \
386 case Enum: \
387 return Name;
388#include "llvm/TargetParser/TripleName.def"
389 }
390
391 llvm_unreachable("Invalid VendorType!");
392}
393
395 switch (Kind) {
396 case UnknownOS:
397 return "unknown";
398#define TRIPLE_OS(Enum, Name, CMakeName) \
399 case Enum: \
400 return Name;
401#include "llvm/TargetParser/TripleName.def"
402 }
403
404 llvm_unreachable("Invalid OSType");
405}
406
408 switch (Kind) {
410 return "unknown";
411#define TRIPLE_ENV(Enum, Name, CMakeOverride) \
412 case Enum: \
413 return Name;
414#include "llvm/TargetParser/TripleName.def"
415 }
416
417 llvm_unreachable("Invalid EnvironmentType!");
418}
419
421 switch (Kind) {
423 return "";
424 case COFF:
425 return "coff";
426 case ELF:
427 return "elf";
428 case GOFF:
429 return "goff";
430 case MachO:
431 return "macho";
432 case Wasm:
433 return "wasm";
434 case XCOFF:
435 return "xcoff";
436 case DXContainer:
437 return "dxcontainer";
438 case SPIRV:
439 return "spirv";
440 }
441 llvm_unreachable("unknown object format type");
442}
443
445 if (ArchName == "bpf") {
447 return Triple::bpfel;
448 else
449 return Triple::bpfeb;
450 } else if (ArchName == "bpf_be" || ArchName == "bpfeb") {
451 return Triple::bpfeb;
452 } else if (ArchName == "bpf_le" || ArchName == "bpfel") {
453 return Triple::bpfel;
454 } else {
455 return Triple::UnknownArch;
456 }
457}
458
460 Triple::ArchType BPFArch(parseBPFArch(Name));
462 .Case("aarch64", aarch64)
463 .Case("aarch64_be", aarch64_be)
464 .Case("aarch64_32", aarch64_32)
465 .Case("arc", arc)
466 .Case("arm64", aarch64) // "arm64" is an alias for "aarch64"
467 .Case("arm64_32", aarch64_32)
468 .Case("arm", arm)
469 .Case("armeb", armeb)
470 .Case("avr", avr)
471 .StartsWith("bpf", BPFArch)
472 .Case("m68k", m68k)
473 .Case("mips", mips)
474 .Case("mipsel", mipsel)
475 .Case("mips64", mips64)
476 .Case("mips64el", mips64el)
477 .Case("msp430", msp430)
478 .Case("ppc64", ppc64)
479 .Case("ppc32", ppc)
480 .Case("ppc", ppc)
481 .Case("ppc32le", ppcle)
482 .Case("ppcle", ppcle)
483 .Case("ppc64le", ppc64le)
484 .Case("amdgpu", amdgpu)
485 .Case("amdgcn", amdgpu) // Legacy name
486 .Case("r600", r600)
487 .Case("riscv32", riscv32)
488 .Case("riscv64", riscv64)
489 .Case("riscv32be", riscv32be)
490 .Case("riscv64be", riscv64be)
491 .Case("hexagon", hexagon)
492 .Case("sparc", sparc)
493 .Case("sparcel", sparcel)
494 .Case("sparcv9", sparcv9)
495 .Case("s390x", systemz)
496 .Case("systemz", systemz)
497 .Case("tce", tce)
498 .Case("tcele", tcele)
499 .Case("tcele64", tcele64)
500 .Case("thumb", thumb)
501 .Case("thumbeb", thumbeb)
502 .Case("x86", x86)
503 .Case("i386", x86)
504 .Case("x86-64", x86_64)
505 .Case("xcore", xcore)
506 .Case("nvptx", nvptx)
507 .Case("nvptx64", nvptx64)
508 .Case("amdil", amdil)
509 .Case("amdil64", amdil64)
510 .Case("hsail", hsail)
511 .Case("hsail64", hsail64)
512 .Case("spir", spir)
513 .Case("spir64", spir64)
514 .Case("spirv", spirv)
515 .Case("spirv32", spirv32)
516 .Case("spirv64", spirv64)
517 .Case("kalimba", kalimba)
518 .Case("lanai", lanai)
519 .Case("shave", shave)
520 .Case("wasm32", wasm32)
521 .Case("wasm64", wasm64)
522 .Case("renderscript32", renderscript32)
523 .Case("renderscript64", renderscript64)
524 .Case("ve", ve)
525 .Case("csky", csky)
526 .Case("loongarch32", loongarch32)
527 .Case("loongarch64", loongarch64)
528 .Case("dxil", dxil)
529 .Case("xtensa", xtensa)
531}
532
534 ARM::ISAKind ISA = ARM::parseArchISA(ArchName);
535 ARM::EndianKind ENDIAN = ARM::parseArchEndian(ArchName);
536
538 switch (ENDIAN) {
540 switch (ISA) {
542 arch = Triple::arm;
543 break;
545 arch = Triple::thumb;
546 break;
548 arch = Triple::aarch64;
549 break;
551 break;
552 }
553 break;
554 }
556 switch (ISA) {
558 arch = Triple::armeb;
559 break;
561 arch = Triple::thumbeb;
562 break;
564 arch = Triple::aarch64_be;
565 break;
567 break;
568 }
569 break;
570 }
572 break;
573 }
574 }
575
576 ArchName = ARM::getCanonicalArchName(ArchName);
577 if (ArchName.empty())
578 return Triple::UnknownArch;
579
580 // Thumb only exists in v4+
581 if (ISA == ARM::ISAKind::THUMB &&
582 (ArchName.starts_with("v2") || ArchName.starts_with("v3")))
583 return Triple::UnknownArch;
584
585 // Thumb only for v6m
587 unsigned Version = ARM::parseArchVersion(ArchName);
588 if (Profile == ARM::ProfileKind::M && Version == 6) {
589 if (ENDIAN == ARM::EndianKind::BIG)
590 return Triple::thumbeb;
591 else
592 return Triple::thumb;
593 }
594
595 return arch;
596}
597
599 auto AT =
601 .Cases({"i386", "i486", "i586", "i686"}, Triple::x86)
602 // FIXME: Do we need to support these?
603 .Cases({"i786", "i886", "i986"}, Triple::x86)
604 .Cases({"amd64", "x86_64", "x86_64h", "x86_64_lfi"}, Triple::x86_64)
605 .Cases({"powerpc", "powerpcspe", "ppc", "ppc32"}, Triple::ppc)
606 .Cases({"powerpcle", "ppcle", "ppc32le"}, Triple::ppcle)
607 .Cases({"powerpc64", "ppu", "ppc64"}, Triple::ppc64)
608 .Cases({"powerpc64le", "ppc64le"}, Triple::ppc64le)
609 .Case("xscale", Triple::arm)
610 .Case("xscaleeb", Triple::armeb)
611 .Case("aarch64", Triple::aarch64)
612 .Case("aarch64_be", Triple::aarch64_be)
613 .Case("aarch64_32", Triple::aarch64_32)
614 .Case("aarch64_lfi", Triple::aarch64)
615 .Case("arc", Triple::arc)
616 .Case("arm64", Triple::aarch64)
617 .Case("arm64_32", Triple::aarch64_32)
618 .Case("arm64e", Triple::aarch64)
619 .Case("arm64e.x1", Triple::aarch64)
620 .Case("arm64ec", Triple::aarch64)
621 .Case("arm", Triple::arm)
622 .Case("armeb", Triple::armeb)
623 .Case("thumb", Triple::thumb)
624 .Case("thumbeb", Triple::thumbeb)
625 .Case("avr", Triple::avr)
626 .Case("m68k", Triple::m68k)
627 .Case("msp430", Triple::msp430)
628 .Cases({"mips", "mipseb", "mipsallegrex", "mipsisa32r6", "mipsr6"},
630 .Cases({"mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el"},
632 .Cases({"mips64", "mips64eb", "mipsn32", "mipsisa64r6", "mips64r6",
633 "mipsn32r6"},
635 .Cases({"mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",
636 "mipsn32r6el"},
638 .StartsWith("amdgpu", Triple::amdgpu)
639 .Case("amdgcn", Triple::amdgpu)
640 .Case("r600", Triple::r600)
641 .Case("riscv32", Triple::riscv32)
642 .Case("riscv64", Triple::riscv64)
643 .Case("riscv32be", Triple::riscv32be)
644 .Case("riscv64be", Triple::riscv64be)
645 .Case("hexagon", Triple::hexagon)
646 .Cases({"s390x", "systemz"}, Triple::systemz)
647 .Case("sparc", Triple::sparc)
648 .Case("sparcel", Triple::sparcel)
649 .Cases({"sparcv9", "sparc64"}, Triple::sparcv9)
650 .Case("tce", Triple::tce)
651 .Case("tcele", Triple::tcele)
652 .Case("tcele64", Triple::tcele64)
653 .Case("xcore", Triple::xcore)
654 .Case("nvptx", Triple::nvptx)
655 .Case("nvptx64", Triple::nvptx64)
656 .Case("amdil", Triple::amdil)
657 .Case("amdil64", Triple::amdil64)
658 .Case("hsail", Triple::hsail)
659 .Case("hsail64", Triple::hsail64)
660 .Case("spir", Triple::spir)
661 .Case("spir64", Triple::spir64)
662 .Cases({"spirv", "spirv1.5", "spirv1.6"}, Triple::spirv)
663 .Cases({"spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",
664 "spirv32v1.3", "spirv32v1.4", "spirv32v1.5", "spirv32v1.6"},
666 .Cases({"spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",
667 "spirv64v1.3", "spirv64v1.4", "spirv64v1.5", "spirv64v1.6"},
669 .StartsWith("kalimba", Triple::kalimba)
670 .Case("lanai", Triple::lanai)
671 .Case("renderscript32", Triple::renderscript32)
672 .Case("renderscript64", Triple::renderscript64)
673 .Case("shave", Triple::shave)
674 .Case("ve", Triple::ve)
675 .Case("wasm32", Triple::wasm32)
676 .Case("wasm64", Triple::wasm64)
677 .Case("csky", Triple::csky)
678 .Case("loongarch32", Triple::loongarch32)
679 .Case("loongarch64", Triple::loongarch64)
680 .Cases({"dxil", "dxilv1.0", "dxilv1.1", "dxilv1.2", "dxilv1.3",
681 "dxilv1.4", "dxilv1.5", "dxilv1.6", "dxilv1.7", "dxilv1.8",
682 "dxilv1.9", "dxilv1.10"},
684 .Case("xtensa", Triple::xtensa)
686
687 // Some architectures require special parsing logic just to compute the
688 // ArchType result.
689 if (AT == Triple::UnknownArch) {
690 if (ArchName.starts_with("arm") || ArchName.starts_with("thumb") ||
691 ArchName.starts_with("aarch64"))
692 return parseARMArch(ArchName);
693 if (ArchName.starts_with("bpf"))
694 return parseBPFArch(ArchName);
695 }
696
697 return AT;
698}
699
701 return StringSwitch<Triple::VendorType>(VendorName)
702#define TRIPLE_VENDOR(Enum, Name) .Case(Name, Triple::Enum)
703#define TRIPLE_VENDOR_ALIAS(Enum, AliasName) .Case(AliasName, Triple::Enum)
704#include "llvm/TargetParser/TripleName.def"
706}
707
709 return StringSwitch<Triple::OSType>(OSName)
710#define TRIPLE_OS(Enum, Name, CMakeName) .StartsWith(Name, Triple::Enum)
711#define TRIPLE_OS_ALIAS(Enum, AliasName) .StartsWith(AliasName, Triple::Enum)
712#include "llvm/TargetParser/TripleName.def"
714}
715
717 return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
718#define TRIPLE_ENV(Enum, Name, CMakeOverride) .StartsWith(Name, Triple::Enum)
719#include "llvm/TargetParser/TripleName.def"
721}
722
724 return StringSwitch<Triple::ObjectFormatType>(EnvironmentName)
725 // "xcoff" must come before "coff" because of the order-dependendent
726 // pattern matching.
727 .EndsWith("xcoff", Triple::XCOFF)
728 .EndsWith("coff", Triple::COFF)
729 .EndsWith("elf", Triple::ELF)
730 .EndsWith("goff", Triple::GOFF)
731 .EndsWith("macho", Triple::MachO)
732 .EndsWith("wasm", Triple::Wasm)
733 .EndsWith("spirv", Triple::SPIRV)
735}
736
738 if (SubArchName.starts_with("mips") &&
739 (SubArchName.ends_with("r6el") || SubArchName.ends_with("r6")))
741
742 if (SubArchName == "powerpcspe")
744
745 if (SubArchName == "arm64e")
747 if (SubArchName == "arm64e.x1")
749
750 if (SubArchName == "arm64ec")
752
753 if (SubArchName == "aarch64_lfi")
755
756 if (SubArchName == "x86_64_lfi")
758
759 if (SubArchName.starts_with("spirv"))
760 return StringSwitch<Triple::SubArchType>(SubArchName)
769
770 if (SubArchName.starts_with("dxil"))
771 return StringSwitch<Triple::SubArchType>(SubArchName)
784
785 if (SubArchName.consume_front("amdgpu")) {
786 return StringSwitch<Triple::SubArchType>(SubArchName)
855 }
856
857 StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
858
859 // For now, this is the small part. Early return.
860 if (ARMSubArch.empty())
861 return StringSwitch<Triple::SubArchType>(SubArchName)
866
867 // ARM sub arch.
868 switch (ARM::parseArch(ARMSubArch)) {
869 case ARM::ArchKind::ARMV4:
870 return Triple::NoSubArch;
871 case ARM::ArchKind::ARMV4T:
873 case ARM::ArchKind::ARMV5T:
875 case ARM::ArchKind::ARMV5TE:
876 case ARM::ArchKind::IWMMXT:
877 case ARM::ArchKind::IWMMXT2:
878 case ARM::ArchKind::XSCALE:
879 case ARM::ArchKind::ARMV5TEJ:
881 case ARM::ArchKind::ARMV6:
883 case ARM::ArchKind::ARMV6K:
884 case ARM::ArchKind::ARMV6KZ:
886 case ARM::ArchKind::ARMV6T2:
888 case ARM::ArchKind::ARMV6M:
890 case ARM::ArchKind::ARMV7A:
891 case ARM::ArchKind::ARMV7R:
893 case ARM::ArchKind::ARMV7VE:
895 case ARM::ArchKind::ARMV7K:
897 case ARM::ArchKind::ARMV7M:
899 case ARM::ArchKind::ARMV7S:
901 case ARM::ArchKind::ARMV7EM:
903 case ARM::ArchKind::ARMV8A:
905 case ARM::ArchKind::ARMV8_1A:
907 case ARM::ArchKind::ARMV8_2A:
909 case ARM::ArchKind::ARMV8_3A:
911 case ARM::ArchKind::ARMV8_4A:
913 case ARM::ArchKind::ARMV8_5A:
915 case ARM::ArchKind::ARMV8_6A:
917 case ARM::ArchKind::ARMV8_7A:
919 case ARM::ArchKind::ARMV8_8A:
921 case ARM::ArchKind::ARMV8_9A:
923 case ARM::ArchKind::ARMV9A:
925 case ARM::ArchKind::ARMV9_1A:
927 case ARM::ArchKind::ARMV9_2A:
929 case ARM::ArchKind::ARMV9_3A:
931 case ARM::ArchKind::ARMV9_4A:
933 case ARM::ArchKind::ARMV9_5A:
935 case ARM::ArchKind::ARMV9_6A:
937 case ARM::ArchKind::ARMV9_7A:
939 case ARM::ArchKind::ARMV9_8A:
941 case ARM::ArchKind::ARMV8R:
943 case ARM::ArchKind::ARMV8MBaseline:
945 case ARM::ArchKind::ARMV8MMainline:
947 case ARM::ArchKind::ARMV8_1MMainline:
949 default:
950 return Triple::NoSubArch;
951 }
952}
953
955 switch (T.getArch()) {
957 case Triple::aarch64:
959 case Triple::arm:
960 case Triple::thumb:
961 case Triple::x86:
962 case Triple::x86_64:
963 switch (T.getOS()) {
964 case Triple::Win32:
965 case Triple::UEFI:
966 return Triple::COFF;
967 default:
968 return T.isOSDarwin() ? Triple::MachO : Triple::ELF;
969 }
971 case Triple::amdgpu:
972 case Triple::amdil64:
973 case Triple::amdil:
974 case Triple::arc:
975 case Triple::armeb:
976 case Triple::avr:
977 case Triple::bpfeb:
978 case Triple::bpfel:
979 case Triple::csky:
980 case Triple::hexagon:
981 case Triple::hsail64:
982 case Triple::hsail:
983 case Triple::kalimba:
984 case Triple::lanai:
987 case Triple::m68k:
988 case Triple::mips64:
989 case Triple::mips64el:
990 case Triple::mips:
991 case Triple::msp430:
992 case Triple::nvptx64:
993 case Triple::nvptx:
994 case Triple::ppc64le:
995 case Triple::ppcle:
996 case Triple::r600:
999 case Triple::riscv32:
1000 case Triple::riscv64:
1001 case Triple::riscv32be:
1002 case Triple::riscv64be:
1003 case Triple::shave:
1004 case Triple::sparc:
1005 case Triple::sparcel:
1006 case Triple::sparcv9:
1007 case Triple::spir64:
1008 case Triple::spir:
1009 case Triple::tce:
1010 case Triple::tcele:
1011 case Triple::tcele64:
1012 case Triple::thumbeb:
1013 case Triple::ve:
1014 case Triple::xcore:
1015 case Triple::xtensa:
1016 return Triple::ELF;
1017
1018 case Triple::mipsel:
1019 if (T.isOSWindows())
1020 return Triple::COFF;
1021 return Triple::ELF;
1022
1023 case Triple::ppc64:
1024 case Triple::ppc:
1025 if (T.isOSAIX())
1026 return Triple::XCOFF;
1027 if (T.isOSDarwin())
1028 return Triple::MachO;
1029 return Triple::ELF;
1030
1031 case Triple::systemz:
1032 if (T.isOSzOS())
1033 return Triple::GOFF;
1034 return Triple::ELF;
1035
1036 case Triple::wasm32:
1037 case Triple::wasm64:
1038 return Triple::Wasm;
1039
1040 case Triple::spirv:
1041 case Triple::spirv32:
1042 case Triple::spirv64:
1043 return Triple::SPIRV;
1044
1045 case Triple::dxil:
1046 return Triple::DXContainer;
1047 }
1048 llvm_unreachable("unknown architecture");
1049}
1050
1051/// Construct a triple from the string representation provided.
1052///
1053/// This stores the string representation and parses the various pieces into
1054/// enum members.
1055Triple::Triple(std::string &&Str) : Data(std::move(Str)) {
1056 // Do minimal parsing by hand here.
1057 SmallVector<StringRef, 4> Components;
1058 StringRef(Data).split(Components, '-', /*MaxSplit*/ 3);
1059 if (Components.size() > 0) {
1060 Arch = parseArch(Components[0]);
1061 SubArch = parseSubArch(Components[0]);
1062 if (Components.size() > 1) {
1063 Vendor = parseVendor(Components[1]);
1064 if (Components.size() > 2) {
1065 OS = parseOS(Components[2]);
1066 if (Components.size() > 3) {
1067 Environment = parseEnvironment(Components[3]);
1068 ObjectFormat = parseFormat(Components[3]);
1069 }
1070 }
1071 } else {
1072 Environment =
1074 .StartsWith("mipsn32", Triple::GNUABIN32)
1075 .StartsWith("mips64", Triple::GNUABI64)
1076 .StartsWith("mipsisa64", Triple::GNUABI64)
1077 .StartsWith("mipsisa32", Triple::GNU)
1078 .Cases({"mips", "mipsel", "mipsr6", "mipsr6el"}, Triple::GNU)
1080 }
1081 }
1082 if (ObjectFormat == UnknownObjectFormat)
1083 ObjectFormat = getDefaultFormat(*this);
1084}
1085
1086Triple::Triple(const Twine &Str) : Triple(Str.str()) {}
1087
1088/// Construct a triple from string representations of the architecture,
1089/// vendor, and OS.
1090///
1091/// This joins each argument into a canonical string representation and parses
1092/// them into enum members. It leaves the environment unknown and omits it from
1093/// the string representation.
1094Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
1095 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
1096 Arch(parseArch(ArchStr.str())), SubArch(parseSubArch(ArchStr.str())),
1097 Vendor(parseVendor(VendorStr.str())), OS(parseOS(OSStr.str())),
1098 Environment(), ObjectFormat(Triple::UnknownObjectFormat) {
1099 ObjectFormat = getDefaultFormat(*this);
1100}
1101
1102/// Construct a triple from string representations of the architecture,
1103/// vendor, OS, and environment.
1104///
1105/// This joins each argument into a canonical string representation and parses
1106/// them into enum members.
1107Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
1108 const Twine &EnvironmentStr)
1109 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
1110 EnvironmentStr)
1111 .str()),
1112 Arch(parseArch(ArchStr.str())), SubArch(parseSubArch(ArchStr.str())),
1113 Vendor(parseVendor(VendorStr.str())), OS(parseOS(OSStr.str())),
1114 Environment(parseEnvironment(EnvironmentStr.str())),
1115 ObjectFormat(parseFormat(EnvironmentStr.str())) {
1116 if (ObjectFormat == Triple::UnknownObjectFormat)
1117 ObjectFormat = getDefaultFormat(*this);
1118}
1119
1121 : Data((getArchName(A, SA) + Twine('-') + getVendorTypeName(V) +
1122 Twine('-') + getOSTypeName(OS))
1123 .str()),
1124 Arch(A), SubArch(SA), Vendor(V), OS(OS),
1125 ObjectFormat(getDefaultFormat(*this)) {}
1126
1129 : Data((getArchName(A, SA) + Twine('-') + getVendorTypeName(V) +
1130 Twine('-') + getOSTypeName(OS) + Twine('-') +
1132 .str()),
1133 Arch(A), SubArch(SA), Vendor(V), OS(OS), Environment(E),
1134 ObjectFormat(getDefaultFormat(*this)) {}
1135
1138 : Data((getArchName(A, SA) + Twine('-') + getVendorTypeName(V) +
1139 Twine('-') + getOSTypeName(OS) + Twine('-') +
1140 getEnvironmentTypeName(E) + Twine('-') +
1142 .str()),
1143 Arch(A), SubArch(SA), Vendor(V), OS(OS), Environment(E),
1144 ObjectFormat(OF) {}
1145
1147
1149 VersionTuple Ver =
1150 parseVersionFromName(ShaderModelStr.drop_front(strlen("shadermodel")));
1151 // Default DXIL minor version when Shader Model version is anything other
1152 // than 6.[0...10] or 6.x (which translates to latest current SM version)
1153 const unsigned SMMajor = 6;
1154 if (!Ver.empty()) {
1155 if (Ver.getMajor() == SMMajor) {
1156 if (std::optional<unsigned> SMMinor = Ver.getMinor()) {
1157 switch (*SMMinor) {
1158 case 0:
1160 case 1:
1162 case 2:
1164 case 3:
1166 case 4:
1168 case 5:
1170 case 6:
1172 case 7:
1174 case 8:
1176 case 9:
1178 case 10:
1180 default:
1181 report_fatal_error("Unsupported Shader Model version", false);
1182 }
1183 }
1184 }
1185 } else {
1186 // Special case: DXIL minor version is set to LatestCurrentDXILMinor for
1187 // shadermodel6.x is
1188 if (ShaderModelStr == "shadermodel6.x") {
1190 }
1191 }
1192 // DXIL version corresponding to Shader Model version other than 6.Minor
1193 // is 1.0
1195}
1196
1198 bool IsMinGW32 = false;
1199 bool IsCygwin = false;
1200
1201 // Parse into components.
1202 SmallVector<StringRef, 4> Components;
1203 Str.split(Components, '-');
1204
1205 // If the first component corresponds to a known architecture, preferentially
1206 // use it for the architecture. If the second component corresponds to a
1207 // known vendor, preferentially use it for the vendor, etc. This avoids silly
1208 // component movement when a component parses as (eg) both a valid arch and a
1209 // valid os.
1210 ArchType Arch = UnknownArch;
1211 if (Components.size() > 0)
1212 Arch = parseArch(Components[0]);
1213 VendorType Vendor = UnknownVendor;
1214 if (Components.size() > 1)
1215 Vendor = parseVendor(Components[1]);
1216 OSType OS = UnknownOS;
1217 if (Components.size() > 2) {
1218 OS = parseOS(Components[2]);
1219 IsCygwin = Components[2].starts_with("cygwin") ||
1220 Components[2].starts_with("msys");
1221 IsMinGW32 = Components[2].starts_with("mingw");
1222 }
1223 EnvironmentType Environment = UnknownEnvironment;
1224 if (Components.size() > 3)
1225 Environment = parseEnvironment(Components[3]);
1227 if (Components.size() > 4)
1228 ObjectFormat = parseFormat(Components[4]);
1229
1230 // Note which components are already in their final position. These will not
1231 // be moved.
1232 bool Found[4];
1233 Found[0] = Arch != UnknownArch;
1234 Found[1] = Vendor != UnknownVendor;
1235 Found[2] = OS != UnknownOS;
1236 Found[3] = Environment != UnknownEnvironment;
1237
1238 // If they are not there already, permute the components into their canonical
1239 // positions by seeing if they parse as a valid architecture, and if so moving
1240 // the component to the architecture position etc.
1241 for (unsigned Pos = 0; Pos != std::size(Found); ++Pos) {
1242 if (Found[Pos])
1243 continue; // Already in the canonical position.
1244
1245 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
1246 // Do not reparse any components that already matched.
1247 if (Idx < std::size(Found) && Found[Idx])
1248 continue;
1249
1250 // Does this component parse as valid for the target position?
1251 bool Valid = false;
1252 StringRef Comp = Components[Idx];
1253 switch (Pos) {
1254 default:
1255 llvm_unreachable("unexpected component type!");
1256 case 0:
1257 Arch = parseArch(Comp);
1258 Valid = Arch != UnknownArch;
1259 break;
1260 case 1:
1261 Vendor = parseVendor(Comp);
1262 Valid = Vendor != UnknownVendor;
1263 break;
1264 case 2:
1265 OS = parseOS(Comp);
1266 IsCygwin = Comp.starts_with("cygwin") || Comp.starts_with("msys");
1267 IsMinGW32 = Comp.starts_with("mingw");
1268 Valid = OS != UnknownOS || IsCygwin || IsMinGW32;
1269 break;
1270 case 3:
1271 Environment = parseEnvironment(Comp);
1272 Valid = Environment != UnknownEnvironment;
1273 if (!Valid) {
1274 ObjectFormat = parseFormat(Comp);
1275 Valid = ObjectFormat != UnknownObjectFormat;
1276 }
1277 break;
1278 }
1279 if (!Valid)
1280 continue; // Nope, try the next component.
1281
1282 // Move the component to the target position, pushing any non-fixed
1283 // components that are in the way to the right. This tends to give
1284 // good results in the common cases of a forgotten vendor component
1285 // or a wrongly positioned environment.
1286 if (Pos < Idx) {
1287 // Insert left, pushing the existing components to the right. For
1288 // example, a-b-i386 -> i386-a-b when moving i386 to the front.
1289 StringRef CurrentComponent(""); // The empty component.
1290 // Replace the component we are moving with an empty component.
1291 std::swap(CurrentComponent, Components[Idx]);
1292 // Insert the component being moved at Pos, displacing any existing
1293 // components to the right.
1294 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
1295 // Skip over any fixed components.
1296 while (i < std::size(Found) && Found[i])
1297 ++i;
1298 // Place the component at the new position, getting the component
1299 // that was at this position - it will be moved right.
1300 std::swap(CurrentComponent, Components[i]);
1301 }
1302 } else if (Pos > Idx) {
1303 // Push right by inserting empty components until the component at Idx
1304 // reaches the target position Pos. For example, pc-a -> -pc-a when
1305 // moving pc to the second position.
1306 do {
1307 // Insert one empty component at Idx.
1308 StringRef CurrentComponent(""); // The empty component.
1309 for (unsigned i = Idx; i < Components.size();) {
1310 // Place the component at the new position, getting the component
1311 // that was at this position - it will be moved right.
1312 std::swap(CurrentComponent, Components[i]);
1313 // If it was placed on top of an empty component then we are done.
1314 if (CurrentComponent.empty())
1315 break;
1316 // Advance to the next component, skipping any fixed components.
1317 while (++i < std::size(Found) && Found[i])
1318 ;
1319 }
1320 // The last component was pushed off the end - append it.
1321 if (!CurrentComponent.empty())
1322 Components.push_back(CurrentComponent);
1323
1324 // Advance Idx to the component's new position.
1325 while (++Idx < std::size(Found) && Found[Idx])
1326 ;
1327 } while (Idx < Pos); // Add more until the final position is reached.
1328 }
1329 assert(Pos < Components.size() && Components[Pos] == Comp &&
1330 "Component moved wrong!");
1331 Found[Pos] = true;
1332 break;
1333 }
1334 }
1335
1336 // If "none" is in the middle component in a three-component triple, treat it
1337 // as the OS (Components[2]) instead of the vendor (Components[1]).
1338 if (Found[0] && !Found[1] && !Found[2] && Found[3] &&
1339 Components[1] == "none" && Components[2].empty())
1340 std::swap(Components[1], Components[2]);
1341
1342 // Replace empty components with "unknown" value.
1343 for (StringRef &C : Components)
1344 if (C.empty())
1345 C = "unknown";
1346
1347 // Special case logic goes here. At this point Arch, Vendor and OS have the
1348 // correct values for the computed components.
1349 std::string NormalizedEnvironment;
1350 if (Environment == Triple::Android &&
1351 Components[3].starts_with("androideabi")) {
1352 StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));
1353 if (AndroidVersion.empty()) {
1354 Components[3] = "android";
1355 } else {
1356 NormalizedEnvironment = Twine("android", AndroidVersion).str();
1357 Components[3] = NormalizedEnvironment;
1358 }
1359 }
1360
1361 // SUSE uses "gnueabi" to mean "gnueabihf"
1362 if (Vendor == Triple::SUSE && Environment == llvm::Triple::GNUEABI)
1363 Components[3] = "gnueabihf";
1364
1365 if (OS == Triple::Win32) {
1366 Components.resize(4);
1367 Components[2] = "windows";
1368 if (Environment == UnknownEnvironment) {
1369 if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)
1370 Components[3] = "msvc";
1371 else
1372 Components[3] = getObjectFormatTypeName(ObjectFormat);
1373 }
1374 } else if (IsMinGW32) {
1375 Components.resize(4);
1376 Components[2] = "windows";
1377 Components[3] = "gnu";
1378 } else if (IsCygwin) {
1379 Components.resize(4);
1380 Components[2] = "windows";
1381 Components[3] = "cygnus";
1382 }
1383 if (IsMinGW32 || IsCygwin ||
1384 (OS == Triple::Win32 && Environment != UnknownEnvironment)) {
1385 if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {
1386 Components.resize(5);
1387 Components[4] = getObjectFormatTypeName(ObjectFormat);
1388 }
1389 }
1390
1391 // Normalize DXIL triple if it does not include DXIL version number.
1392 // Determine DXIL version number using the minor version number of Shader
1393 // Model version specified in target triple, if any. Prior to decoupling DXIL
1394 // version numbering from that of Shader Model DXIL version 1.Y corresponds to
1395 // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull
1396 if (Components[0] == "dxil") {
1397 if (Components.size() > 4) {
1398 Components.resize(4);
1399 }
1400 // Add DXIL version only if shadermodel is specified in the triple
1401 if (OS == Triple::ShaderModel) {
1402 Components[0] = getDXILArchNameFromShaderModel(Components[2]);
1403 }
1404 }
1405
1406 // Currently the firmware OS is an Apple specific concept.
1407 if ((Components.size() > 2) && (Components[2] == "firmware") &&
1408 (Components[1] != "apple"))
1410 "the firmware target os is only supported for the apple vendor");
1411
1412 // Canonicalize the components if necessary.
1413 switch (Form) {
1414 case CanonicalForm::ANY:
1415 break;
1419 Components.resize(static_cast<unsigned>(Form), "unknown");
1420 break;
1421 }
1422 }
1423
1424 // Stick the corrected components back together to form the normalized string.
1425 return join(Components, "-");
1426}
1427
1429 return StringRef(Data).split('-').first; // Isolate first component
1430}
1431
1433 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1434 return Tmp.split('-').first; // Isolate second component
1435}
1436
1438 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1439 Tmp = Tmp.split('-').second; // Strip second component
1440 return Tmp.split('-').first; // Isolate third component
1441}
1442
1444 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1445 Tmp = Tmp.split('-').second; // Strip second component
1446 return Tmp.split('-').second; // Strip third component
1447}
1448
1450 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1451 return Tmp.split('-').second; // Strip second component
1452}
1453
1455 VersionTuple Version;
1456 Version.tryParse(Name);
1457 return Version.withoutBuild();
1458}
1459
1463
1465 StringRef EnvironmentName = getEnvironmentName();
1466
1467 // none is a valid environment type - it basically amounts to a freestanding
1468 // environment.
1469 if (EnvironmentName == "none")
1470 return "";
1471
1472 StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
1473 EnvironmentName.consume_front(EnvironmentTypeName);
1474
1475 if (EnvironmentName.contains("-")) {
1476 // -obj is the suffix
1478 StringRef ObjectFormatTypeName =
1480 const std::string tmp = (Twine("-") + ObjectFormatTypeName).str();
1481 EnvironmentName.consume_back(tmp);
1482 }
1483 }
1484 return EnvironmentName;
1485}
1486
1488 StringRef OSName = getOSName();
1489 // Assume that the OS portion of the triple starts with the canonical name.
1490 StringRef OSTypeName = getOSTypeName(getOS());
1491 if (OSName.starts_with(OSTypeName))
1492 OSName = OSName.substr(OSTypeName.size());
1493 else if (getOS() == MacOSX)
1494 OSName.consume_front("macos");
1495 else if (OSName.starts_with("visionos"))
1496 OSName.consume_front("visionos");
1497
1498 return parseVersionFromName(OSName);
1499}
1500
1503
1504 switch (getOS()) {
1505 default:
1506 llvm_unreachable("unexpected OS for Darwin triple");
1507 case Darwin:
1508 // Default to darwin8, i.e., MacOSX 10.4.
1509 if (Version.getMajor() == 0)
1510 Version = VersionTuple(8);
1511 // Darwin version numbers are skewed from OS X versions.
1512 if (Version.getMajor() < 4) {
1513 return false;
1514 }
1515 if (Version.getMajor() <= 19) {
1516 Version = VersionTuple(10, Version.getMajor() - 4);
1517 } else if (Version.getMajor() < 25) {
1518 // darwin20-24 corresponds to macOS 11-15.
1519 Version = VersionTuple(11 + Version.getMajor() - 20);
1520 } else if ((Version.getMajor() == 25) || (Version.getMajor() == 26)) {
1521 // darwin25-26 corresponds to macOS 26-27.
1522 Version = VersionTuple(Version.getMajor() + 1);
1523 } else {
1524 // Starting with darwin27, it naturally corresponds to the same macOS
1525 // version.
1526 }
1527 break;
1528 case MacOSX:
1529 // Default to 10.4.
1530 if (Version.getMajor() == 0) {
1531 Version = VersionTuple(10, 4);
1532 } else if (Version.getMajor() < 10) {
1533 return false;
1534 }
1535 break;
1536 case IOS:
1537 case TvOS:
1538 case WatchOS:
1539 // Ignore the version from the triple. This is only handled because the
1540 // the clang driver combines OS X and IOS support into a common Darwin
1541 // toolchain that wants to know the OS X version number even when targeting
1542 // IOS.
1543 Version = VersionTuple(10, 4);
1544 break;
1545 case XROS:
1546 llvm_unreachable("OSX version isn't relevant for xrOS");
1547 case DriverKit:
1548 llvm_unreachable("OSX version isn't relevant for DriverKit");
1549 case Firmware:
1550 llvm_unreachable("OSX version isn't relevant for Firmware");
1551 }
1552 return true;
1553}
1554
1556 switch (getOS()) {
1557 default:
1558 llvm_unreachable("unexpected OS for Darwin triple");
1559 case Darwin:
1560 case MacOSX:
1561 // Ignore the version from the triple. This is only handled because the
1562 // the clang driver combines OS X and IOS support into a common Darwin
1563 // toolchain that wants to know the iOS version number even when targeting
1564 // OS X.
1565 return VersionTuple(5);
1566 case IOS:
1567 case TvOS: {
1569 // Default to 5.0 (or 7.0 for arm64).
1570 if (Version.getMajor() == 0)
1571 return (getArch() == aarch64) ? VersionTuple(7) : VersionTuple(5);
1572 if (Version.getMajor() == 19)
1573 // tvOS 19 corresponds to ios26.
1574 return VersionTuple(26);
1577 }
1578 case XROS: {
1580 // xrOS 1 is aligned with iOS 17.
1581 if (Version.getMajor() < 3)
1582 return Version.withMajorReplaced(Version.getMajor() + 16);
1583 // visionOS 3 corresponds to ios 26+.
1584 if (Version.getMajor() == 3)
1585 return VersionTuple(26);
1588 }
1589 case WatchOS: {
1591 // watchOS 12 corresponds to ios 26.
1592 if (Version.getMajor() == 12)
1593 return VersionTuple(26);
1597 }
1598 case BridgeOS:
1599 llvm_unreachable("conflicting triple info");
1600 case DriverKit:
1601 llvm_unreachable("DriverKit doesn't have an iOS version");
1602 case Firmware:
1603 llvm_unreachable("iOS version isn't relevant for Firmware");
1604 }
1605}
1606
1608 switch (getOS()) {
1609 default:
1610 llvm_unreachable("unexpected OS for Darwin triple");
1611 case Darwin:
1612 case MacOSX:
1613 // Ignore the version from the triple. This is only handled because the
1614 // the clang driver combines OS X and IOS support into a common Darwin
1615 // toolchain that wants to know the iOS version number even when targeting
1616 // OS X.
1617 return VersionTuple(2);
1618 case WatchOS: {
1620 if (Version.getMajor() == 0)
1621 return VersionTuple(2);
1622 return Version;
1623 }
1624 case IOS:
1625 llvm_unreachable("conflicting triple info");
1626 case XROS:
1627 llvm_unreachable("watchOS version isn't relevant for xrOS");
1628 case DriverKit:
1629 llvm_unreachable("DriverKit doesn't have a WatchOS version");
1630 case Firmware:
1631 llvm_unreachable("watchOS version isn't relevant for Firmware");
1632 }
1633}
1634
1636 switch (getOS()) {
1637 default:
1638 llvm_unreachable("unexpected OS for Darwin triple");
1639 case DriverKit:
1641 if (Version.getMajor() == 0)
1642 return Version.withMajorReplaced(19);
1643 return Version;
1644 }
1645}
1646
1648 if (getArch() != spirv || getOS() != Vulkan)
1649 llvm_unreachable("invalid Vulkan SPIR-V triple");
1650
1651 VersionTuple VulkanVersion = getOSVersion();
1652 SubArchType SpirvVersion = getSubArch();
1653
1655 // Vulkan 1.2 -> SPIR-V 1.5.
1657 // Vulkan 1.3 -> SPIR-V 1.6.
1659
1660 // If Vulkan version is unset, default to 1.2.
1661 if (VulkanVersion == VersionTuple(0))
1662 VulkanVersion = VersionTuple(1, 2);
1663
1664 if (ValidVersionMap.contains(VulkanVersion) &&
1665 (ValidVersionMap.lookup(VulkanVersion) == SpirvVersion ||
1666 SpirvVersion == NoSubArch))
1667 return VulkanVersion;
1668
1669 return VersionTuple(0);
1670}
1671
1673 if (getArch() != dxil || getOS() != ShaderModel)
1674 llvm_unreachable("invalid DXIL triple");
1675 StringRef Arch = getArchName();
1676 if (getSubArch() == NoSubArch)
1678 Arch.consume_front("dxilv");
1679 VersionTuple DXILVersion = parseVersionFromName(Arch);
1680 // FIXME: validate DXIL version against Shader Model version.
1681 // Tracked by https://github.com/llvm/llvm-project/issues/91388
1682 return DXILVersion;
1683}
1684
1685void Triple::setTriple(const Twine &Str) { *this = Triple(Str); }
1686
1688 setArchName(getArchName(Kind, SubArch));
1689}
1690
1694
1696
1698 if (ObjectFormat == getDefaultFormat(*this))
1700
1702 getObjectFormatTypeName(ObjectFormat))
1703 .str());
1704}
1705
1707 if (Environment == UnknownEnvironment)
1709
1710 setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +
1712 .str());
1713}
1714
1716 setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
1717}
1718
1720 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
1721}
1722
1724 if (hasEnvironment())
1725 setTriple(getArchName() + "-" + getVendorName() + "-" + Str + "-" +
1727 else
1728 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1729}
1730
1732 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + "-" +
1733 Str);
1734}
1735
1737 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1738}
1739
1741 switch (Arch) {
1743 return 0;
1744
1745 case llvm::Triple::avr:
1747 return 16;
1748
1751 case llvm::Triple::arc:
1752 case llvm::Triple::arm:
1754 case llvm::Triple::csky:
1755 case llvm::Triple::dxil:
1761 case llvm::Triple::m68k:
1762 case llvm::Triple::mips:
1765 case llvm::Triple::ppc:
1767 case llvm::Triple::r600:
1774 case llvm::Triple::spir:
1776 case llvm::Triple::tce:
1781 case llvm::Triple::x86:
1784 return 32;
1785
1808 case llvm::Triple::ve:
1811 return 64;
1812 }
1813 llvm_unreachable("Invalid architecture value");
1814}
1815
1817 switch (getArch()) {
1818 default:
1819 break;
1820 case Triple::ppc:
1821 case Triple::ppcle:
1822 if (isOSLinux())
1823 return 40;
1824 break;
1825 case Triple::ppc64:
1826 case Triple::ppc64le:
1827 if (isOSLinux())
1828 return 48;
1829 break;
1830 }
1831 return 32;
1832}
1833
1835 return getArchPointerBitWidth(getArch()) == 64;
1836}
1837
1839 return getArchPointerBitWidth(getArch()) == 32;
1840}
1841
1843 return getArchPointerBitWidth(getArch()) == 16;
1844}
1845
1847 Triple T(*this);
1848 switch (getArch()) {
1850 case Triple::amdgpu:
1851 case Triple::avr:
1852 case Triple::bpfeb:
1853 case Triple::bpfel:
1854 case Triple::msp430:
1855 case Triple::systemz:
1856 case Triple::ve:
1857 T.setArch(UnknownArch);
1858 break;
1859
1860 case Triple::aarch64_32:
1861 case Triple::amdil:
1862 case Triple::arc:
1863 case Triple::arm:
1864 case Triple::armeb:
1865 case Triple::csky:
1866 case Triple::dxil:
1867 case Triple::hexagon:
1868 case Triple::hsail:
1869 case Triple::kalimba:
1870 case Triple::lanai:
1872 case Triple::m68k:
1873 case Triple::mips:
1874 case Triple::mipsel:
1875 case Triple::nvptx:
1876 case Triple::ppc:
1877 case Triple::ppcle:
1878 case Triple::r600:
1880 case Triple::riscv32:
1881 case Triple::riscv32be:
1882 case Triple::shave:
1883 case Triple::sparc:
1884 case Triple::sparcel:
1885 case Triple::spir:
1886 case Triple::spirv32:
1887 case Triple::tce:
1888 case Triple::tcele:
1889 case Triple::thumb:
1890 case Triple::thumbeb:
1891 case Triple::wasm32:
1892 case Triple::x86:
1893 case Triple::xcore:
1894 case Triple::xtensa:
1895 // Already 32-bit.
1896 break;
1897
1898 case Triple::aarch64:
1899 T.setArch(Triple::arm);
1900 break;
1901 case Triple::aarch64_be:
1902 T.setArch(Triple::armeb);
1903 break;
1904 case Triple::amdil64:
1905 T.setArch(Triple::amdil);
1906 break;
1907 case Triple::hsail64:
1908 T.setArch(Triple::hsail);
1909 break;
1911 T.setArch(Triple::loongarch32);
1912 break;
1913 case Triple::mips64:
1914 T.setArch(Triple::mips, getSubArch());
1915 break;
1916 case Triple::mips64el:
1917 T.setArch(Triple::mipsel, getSubArch());
1918 break;
1919 case Triple::nvptx64:
1920 T.setArch(Triple::nvptx);
1921 break;
1922 case Triple::ppc64:
1923 T.setArch(Triple::ppc);
1924 break;
1925 case Triple::ppc64le:
1926 T.setArch(Triple::ppcle);
1927 break;
1929 T.setArch(Triple::renderscript32);
1930 break;
1931 case Triple::riscv64:
1932 T.setArch(Triple::riscv32);
1933 break;
1934 case Triple::riscv64be:
1935 T.setArch(Triple::riscv32be);
1936 break;
1937 case Triple::sparcv9:
1938 T.setArch(Triple::sparc);
1939 break;
1940 case Triple::spir64:
1941 T.setArch(Triple::spir);
1942 break;
1943 case Triple::spirv:
1944 case Triple::spirv64:
1945 T.setArch(Triple::spirv32, getSubArch());
1946 break;
1947 case Triple::tcele64:
1948 T.setArch(Triple::tcele);
1949 break;
1950 case Triple::wasm64:
1951 T.setArch(Triple::wasm32);
1952 break;
1953 case Triple::x86_64:
1954 T.setArch(Triple::x86);
1955 break;
1956 }
1957 return T;
1958}
1959
1961 Triple T(*this);
1962 switch (getArch()) {
1964 case Triple::arc:
1965 case Triple::avr:
1966 case Triple::csky:
1967 case Triple::dxil:
1968 case Triple::hexagon:
1969 case Triple::kalimba:
1970 case Triple::lanai:
1971 case Triple::m68k:
1972 case Triple::msp430:
1973 case Triple::r600:
1974 case Triple::shave:
1975 case Triple::sparcel:
1976 case Triple::tce:
1977 case Triple::xcore:
1978 case Triple::xtensa:
1979 T.setArch(UnknownArch);
1980 break;
1981
1982 case Triple::aarch64:
1983 case Triple::aarch64_be:
1984 case Triple::amdgpu:
1985 case Triple::amdil64:
1986 case Triple::bpfeb:
1987 case Triple::bpfel:
1988 case Triple::hsail64:
1990 case Triple::mips64:
1991 case Triple::mips64el:
1992 case Triple::nvptx64:
1993 case Triple::ppc64:
1994 case Triple::ppc64le:
1996 case Triple::riscv64:
1997 case Triple::riscv64be:
1998 case Triple::sparcv9:
1999 case Triple::spir64:
2000 case Triple::spirv64:
2001 case Triple::systemz:
2002 case Triple::tcele64:
2003 case Triple::ve:
2004 case Triple::wasm64:
2005 case Triple::x86_64:
2006 // Already 64-bit.
2007 break;
2008
2009 case Triple::aarch64_32:
2010 T.setArch(Triple::aarch64);
2011 break;
2012 case Triple::amdil:
2013 T.setArch(Triple::amdil64);
2014 break;
2015 case Triple::arm:
2016 T.setArch(Triple::aarch64);
2017 break;
2018 case Triple::armeb:
2019 T.setArch(Triple::aarch64_be);
2020 break;
2021 case Triple::hsail:
2022 T.setArch(Triple::hsail64);
2023 break;
2025 T.setArch(Triple::loongarch64);
2026 break;
2027 case Triple::mips:
2028 T.setArch(Triple::mips64, getSubArch());
2029 break;
2030 case Triple::mipsel:
2031 T.setArch(Triple::mips64el, getSubArch());
2032 break;
2033 case Triple::nvptx:
2034 T.setArch(Triple::nvptx64);
2035 break;
2036 case Triple::ppc:
2037 T.setArch(Triple::ppc64);
2038 break;
2039 case Triple::ppcle:
2040 T.setArch(Triple::ppc64le);
2041 break;
2043 T.setArch(Triple::renderscript64);
2044 break;
2045 case Triple::riscv32:
2046 T.setArch(Triple::riscv64);
2047 break;
2048 case Triple::riscv32be:
2049 T.setArch(Triple::riscv64be);
2050 break;
2051 case Triple::sparc:
2052 T.setArch(Triple::sparcv9);
2053 break;
2054 case Triple::spir:
2055 T.setArch(Triple::spir64);
2056 break;
2057 case Triple::spirv:
2058 case Triple::spirv32:
2059 T.setArch(Triple::spirv64, getSubArch());
2060 break;
2061 case Triple::tcele:
2062 T.setArch(Triple::tcele64);
2063 break;
2064 case Triple::thumb:
2065 T.setArch(Triple::aarch64);
2066 break;
2067 case Triple::thumbeb:
2068 T.setArch(Triple::aarch64_be);
2069 break;
2070 case Triple::wasm32:
2071 T.setArch(Triple::wasm64);
2072 break;
2073 case Triple::x86:
2074 T.setArch(Triple::x86_64);
2075 break;
2076 }
2077 return T;
2078}
2079
2081 Triple T(*this);
2082 // Already big endian.
2083 if (!isLittleEndian())
2084 return T;
2085 switch (getArch()) {
2087 case Triple::amdgpu:
2088 case Triple::amdil64:
2089 case Triple::amdil:
2090 case Triple::avr:
2091 case Triple::dxil:
2092 case Triple::hexagon:
2093 case Triple::hsail64:
2094 case Triple::hsail:
2095 case Triple::kalimba:
2098 case Triple::msp430:
2099 case Triple::nvptx64:
2100 case Triple::nvptx:
2101 case Triple::r600:
2104 case Triple::shave:
2105 case Triple::spir64:
2106 case Triple::spir:
2107 case Triple::spirv:
2108 case Triple::spirv32:
2109 case Triple::spirv64:
2110 case Triple::tcele64:
2111 case Triple::wasm32:
2112 case Triple::wasm64:
2113 case Triple::x86:
2114 case Triple::x86_64:
2115 case Triple::xcore:
2116 case Triple::ve:
2117 case Triple::csky:
2118 case Triple::xtensa:
2119
2120 // ARM is intentionally unsupported here, changing the architecture would
2121 // drop any arch suffixes.
2122 case Triple::arm:
2123 case Triple::thumb:
2124 T.setArch(UnknownArch);
2125 break;
2126
2127 case Triple::aarch64:
2128 T.setArch(Triple::aarch64_be);
2129 break;
2130 case Triple::bpfel:
2131 T.setArch(Triple::bpfeb);
2132 break;
2133 case Triple::mips64el:
2134 T.setArch(Triple::mips64, getSubArch());
2135 break;
2136 case Triple::mipsel:
2137 T.setArch(Triple::mips, getSubArch());
2138 break;
2139 case Triple::ppcle:
2140 T.setArch(Triple::ppc);
2141 break;
2142 case Triple::ppc64le:
2143 T.setArch(Triple::ppc64);
2144 break;
2145 case Triple::riscv32:
2146 T.setArch(Triple::riscv32be);
2147 break;
2148 case Triple::riscv64:
2149 T.setArch(Triple::riscv64be);
2150 break;
2151 case Triple::sparcel:
2152 T.setArch(Triple::sparc);
2153 break;
2154 case Triple::tcele:
2155 T.setArch(Triple::tce);
2156 break;
2157 default:
2158 llvm_unreachable("getBigEndianArchVariant: unknown triple.");
2159 }
2160 return T;
2161}
2162
2164 Triple T(*this);
2165 if (isLittleEndian())
2166 return T;
2167
2168 switch (getArch()) {
2170 case Triple::lanai:
2171 case Triple::sparcv9:
2172 case Triple::systemz:
2173 case Triple::m68k:
2174
2175 // ARM is intentionally unsupported here, changing the architecture would
2176 // drop any arch suffixes.
2177 case Triple::armeb:
2178 case Triple::thumbeb:
2179 T.setArch(UnknownArch);
2180 break;
2181
2182 case Triple::aarch64_be:
2183 T.setArch(Triple::aarch64);
2184 break;
2185 case Triple::bpfeb:
2186 T.setArch(Triple::bpfel);
2187 break;
2188 case Triple::mips64:
2189 T.setArch(Triple::mips64el, getSubArch());
2190 break;
2191 case Triple::mips:
2192 T.setArch(Triple::mipsel, getSubArch());
2193 break;
2194 case Triple::ppc:
2195 T.setArch(Triple::ppcle);
2196 break;
2197 case Triple::ppc64:
2198 T.setArch(Triple::ppc64le);
2199 break;
2200 case Triple::riscv32be:
2201 T.setArch(Triple::riscv32);
2202 break;
2203 case Triple::riscv64be:
2204 T.setArch(Triple::riscv64);
2205 break;
2206 case Triple::sparc:
2207 T.setArch(Triple::sparcel);
2208 break;
2209 case Triple::tce:
2210 T.setArch(Triple::tcele);
2211 break;
2212 default:
2213 llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
2214 }
2215 return T;
2216}
2217
2219 switch (getArch()) {
2220 case Triple::aarch64:
2221 case Triple::aarch64_32:
2222 case Triple::amdgpu:
2223 case Triple::amdil64:
2224 case Triple::amdil:
2225 case Triple::arm:
2226 case Triple::avr:
2227 case Triple::bpfel:
2228 case Triple::csky:
2229 case Triple::dxil:
2230 case Triple::hexagon:
2231 case Triple::hsail64:
2232 case Triple::hsail:
2233 case Triple::kalimba:
2236 case Triple::mips64el:
2237 case Triple::mipsel:
2238 case Triple::msp430:
2239 case Triple::nvptx64:
2240 case Triple::nvptx:
2241 case Triple::ppcle:
2242 case Triple::ppc64le:
2243 case Triple::r600:
2246 case Triple::riscv32:
2247 case Triple::riscv64:
2248 case Triple::shave:
2249 case Triple::sparcel:
2250 case Triple::spir64:
2251 case Triple::spir:
2252 case Triple::spirv:
2253 case Triple::spirv32:
2254 case Triple::spirv64:
2255 case Triple::tcele:
2256 case Triple::tcele64:
2257 case Triple::thumb:
2258 case Triple::ve:
2259 case Triple::wasm32:
2260 case Triple::wasm64:
2261 case Triple::x86:
2262 case Triple::x86_64:
2263 case Triple::xcore:
2264 case Triple::xtensa:
2265 return true;
2266 default:
2267 return false;
2268 }
2269}
2270
2272 if (getArch() == Triple::xcore)
2273 return 1;
2274 if (isArch16Bit())
2275 return 2;
2276 if (isOSWindowsOrUEFI() || isPS())
2277 return 2;
2278 if (isOSAIX() && isArch32Bit())
2279 return 2;
2280 return 4;
2281}
2282
2284 // On MinGW, C code is usually built with a "w64" vendor, while Rust
2285 // often uses a "pc" vendor.
2286 bool IgnoreVendor = isWindowsGNUEnvironment();
2287
2288 // ARM and Thumb triples are compatible, if subarch, vendor and OS match.
2289 if ((getArch() == Triple::thumb && Other.getArch() == Triple::arm) ||
2290 (getArch() == Triple::arm && Other.getArch() == Triple::thumb) ||
2291 (getArch() == Triple::thumbeb && Other.getArch() == Triple::armeb) ||
2292 (getArch() == Triple::armeb && Other.getArch() == Triple::thumbeb)) {
2293 if (getVendor() == Triple::Apple)
2294 return getSubArch() == Other.getSubArch() &&
2295 getVendor() == Other.getVendor() && getOS() == Other.getOS();
2296 else
2297 return getSubArch() == Other.getSubArch() &&
2298 (getVendor() == Other.getVendor() || IgnoreVendor) &&
2299 getOS() == Other.getOS() &&
2300 getEnvironment() == Other.getEnvironment() &&
2301 getObjectFormat() == Other.getObjectFormat();
2302 }
2303
2304 if (getArch() == Triple::amdgpu && Other.getArch() == Triple::amdgpu) {
2305 if (getOS() != Other.getOS() || getVendor() != Other.getVendor() ||
2306 getEnvironment() != Other.getEnvironment() ||
2307 getObjectFormat() != Other.getObjectFormat())
2308 return false;
2309 return AMDGPU::isSubArchCompatible(*this, Other);
2310 }
2311
2312 // If vendor is apple, ignore the version number (the environment field)
2313 // and the object format.
2314 if (getVendor() == Triple::Apple)
2315 return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
2316 (getVendor() == Other.getVendor() || IgnoreVendor) &&
2317 getOS() == Other.getOS();
2318
2319 return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
2320 (getVendor() == Other.getVendor() || IgnoreVendor) &&
2321 getOS() == Other.getOS() &&
2322 getEnvironment() == Other.getEnvironment() &&
2323 getObjectFormat() == Other.getObjectFormat();
2324}
2325
2326std::string Triple::merge(const Triple &Other) const {
2327 // If vendor is apple, pick the triple with the larger version number.
2328 if (getVendor() == Triple::Apple && Other.isOSVersionLT(*this))
2329 return str();
2330
2331 if (isAMDGCN() && Other.isAMDGCN() && getOS() == Other.getOS() &&
2332 getVendor() == Other.getVendor())
2333 return AMDGPU::mergeSubArch(*this, Other);
2334
2335 return Other.str();
2336}
2337
2338bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor,
2339 unsigned Micro) const {
2340 assert(isMacOSX() && "Not an OS X triple!");
2341
2342 // If this is OS X, expect a sane version number.
2343 if (getOS() == Triple::MacOSX)
2344 return isOSVersionLT(Major, Minor, Micro);
2345
2346 // Otherwise, compare to the "Darwin" number.
2347 if (Major == 10)
2348 return isOSVersionLT(Minor + 4, Micro, 0);
2349 assert(Major >= 11 && "Unexpected major version");
2350 if (Major < 25)
2351 return isOSVersionLT(Major - 11 + 20, Minor, Micro);
2352 return isOSVersionLT(Major + 1, Minor, Micro);
2353}
2354
2357 return VersionTuple();
2358 switch (getOS()) {
2359 case Triple::MacOSX:
2360 // ARM64 slice is supported starting from macOS 11.0+.
2361 return VersionTuple(11, 0, 0);
2362 case Triple::IOS:
2363 // ARM64 slice is supported starting from Mac Catalyst 14 (macOS 11).
2364 // ARM64 simulators are supported for iOS 14+.
2366 return VersionTuple(14, 0, 0);
2367 // ARM64e slice is supported starting from iOS 14.
2368 if (isArm64e())
2369 return VersionTuple(14, 0, 0);
2370 break;
2371 case Triple::TvOS:
2372 // ARM64 simulators are supported for tvOS 14+.
2374 return VersionTuple(14, 0, 0);
2375 break;
2376 case Triple::WatchOS:
2377 // ARM64 simulators are supported for watchOS 7+.
2379 return VersionTuple(7, 0, 0);
2380 // ARM64/ARM64e slices are supported starting from watchOS 26.
2381 // ARM64_32 is older though.
2383 return VersionTuple(26, 0, 0);
2384 case Triple::DriverKit:
2385 return VersionTuple(20, 0, 0);
2386 default:
2387 break;
2388 }
2389 return VersionTuple();
2390}
2391
2393 const VersionTuple &Version,
2394 bool IsInValidRange) {
2395 const unsigned MacOSRangeBump = 10;
2396 const unsigned IOSRangeBump = 7;
2397 const unsigned XROSRangeBump = 23;
2398 const unsigned WatchOSRangeBump = 14;
2399 switch (OSKind) {
2400 case MacOSX: {
2401 // macOS 10.16 is canonicalized to macOS 11.
2402 if (Version == VersionTuple(10, 16))
2403 return VersionTuple(11, 0);
2404 // macOS 16 is canonicalized to macOS 26.
2405 if (Version == VersionTuple(16, 0))
2406 return VersionTuple(26, 0);
2407 if (!IsInValidRange)
2408 return Version.withMajorReplaced(Version.getMajor() + MacOSRangeBump);
2409 break;
2410 }
2411 case IOS:
2412 case TvOS: {
2413 // Both iOS & tvOS 19.0 canonicalize to 26.
2414 if (Version == VersionTuple(19, 0))
2415 return VersionTuple(26, 0);
2416 if (!IsInValidRange)
2417 return Version.withMajorReplaced(Version.getMajor() + IOSRangeBump);
2418 break;
2419 }
2420 case XROS: {
2421 // visionOS3 is canonicalized to 26.
2422 if (Version == VersionTuple(3, 0))
2423 return VersionTuple(26, 0);
2424 if (!IsInValidRange)
2425 return Version.withMajorReplaced(Version.getMajor() + XROSRangeBump);
2426 break;
2427 }
2428 case WatchOS: {
2429 // watchOS 12 is canonicalized to 26.
2430 if (Version == VersionTuple(12, 0))
2431 return VersionTuple(26, 0);
2432 if (!IsInValidRange)
2433 return Version.withMajorReplaced(Version.getMajor() + WatchOSRangeBump);
2434 break;
2435 }
2436 case DriverKit: {
2437 // DriverKit26 is canonicalized to 27.
2438 if (Version.getMajor() == 26U)
2439 return Version.withMajorReplaced(27);
2440 break;
2441 }
2442 default:
2443 return Version;
2444 }
2445
2446 return Version;
2447}
2448
2450 /// This constant is used to capture gaps in versioning.
2451 const VersionTuple CommonVersion(26);
2452 auto IsValid = [&](const VersionTuple &StartingVersion) {
2453 return !((Version > StartingVersion) && (Version < CommonVersion));
2454 };
2455 switch (OSKind) {
2456 case WatchOS: {
2457 const VersionTuple StartingWatchOS(12);
2458 return IsValid(StartingWatchOS);
2459 }
2460 case IOS:
2461 case TvOS: {
2462 const VersionTuple StartingIOS(19);
2463 return IsValid(StartingIOS);
2464 }
2465 case MacOSX: {
2466 const VersionTuple StartingMacOS(16);
2467 return IsValid(StartingMacOS);
2468 }
2469 case XROS: {
2470 const VersionTuple StartingXROS(3);
2471 return IsValid(StartingXROS);
2472 }
2473 default:
2474 return true;
2475 }
2476
2477 llvm_unreachable("unexpected or invalid os version");
2478}
2479
2481 if (isOSBinFormatCOFF()) {
2482 if (getArch() == Triple::x86 &&
2486 }
2487
2488 if (isOSBinFormatXCOFF())
2490 if (isOSBinFormatGOFF())
2492
2493 if (isARM() || isThumb()) {
2494 if (isOSBinFormatELF()) {
2497 }
2498
2501 }
2502
2503 if (isAArch64() || isX86() || isPPC() || isMIPS() || isSPARC() || isBPF() ||
2504 isRISCV() || isLoongArch())
2506
2507 switch (getArch()) {
2508 case Triple::arc:
2509 case Triple::csky:
2510 case Triple::hexagon:
2511 case Triple::lanai:
2512 case Triple::m68k:
2513 case Triple::msp430:
2514 case Triple::systemz:
2515 case Triple::xcore:
2516 case Triple::xtensa:
2518 case Triple::ve:
2520 default:
2521 break;
2522 }
2523
2524 // Explicitly none targets.
2525 if (isWasm() || isAMDGPU() || isNVPTX() || isSPIROrSPIRV())
2527
2528 // Default to none.
2530}
2531
2533 StringRef ABIName) {
2534 Triple::EnvironmentType Env = T.getEnvironment();
2535 bool IsHard =
2536 Env == Triple::GNUEABIHF || Env == Triple::GNUEABIHFT64 ||
2537 Env == Triple::MuslEABIHF || Env == Triple::EABIHF ||
2538 (T.isOSBinFormatMachO() && T.getSubArch() == Triple::ARMSubArch_v7em) ||
2539 T.isOSWindows() ||
2541 return IsHard ? FloatABI::Hard : FloatABI::Soft;
2542}
2543
2545 if (isARM() || isThumb())
2546 return getARMDefaultFloatABI(*this, ABIName);
2547
2548 // MIPS defaults to hard float, except on FreeBSD which uses soft float.
2549 if (isMIPS())
2551
2552 if (isCSKY() || isAVR() || getArch() == msp430)
2553 return FloatABI::Soft;
2554
2555 // Most targets use hard float unless soft float is explicitly requested.
2556 return FloatABI::Hard;
2557}
2558
2560
2562 switch (getArch()) {
2563 case loongarch32:
2564 case loongarch64:
2565 case riscv32:
2566 case riscv64:
2567 case riscv32be:
2568 case riscv64be:
2569 case sparcv9:
2570 case systemz:
2571 case ve:
2572 case wasm32:
2573 case wasm64:
2575 case sparc:
2576 case sparcel:
2577 // GCC uses IEEE double for bare-metal, NetBSD, and RTEMS SPARC V8 targets.
2578 if (getOS() == UnknownOS || getOS() == NetBSD || getOS() == RTEMS)
2581 case ppc:
2582 case ppcle:
2583 case ppc64:
2584 case ppc64le:
2585 // PowerPC uses IBM double-double, except with SPE, musl and a handful of
2586 // OSes that use plain IEEE double. NetBSD only switches to IEEE double on
2587 // 32-bit PowerPC.
2588 if (isOSAIX() || isOSFreeBSD() || isOSOpenBSD() ||
2589 getSubArch() == PPCSubArch_spe || isMusl() ||
2590 (isOSNetBSD() && isPPC32()))
2593 case x86:
2594 case x86_64:
2595 // Android and OHOS use IEEE double on 32-bit and IEEE quad on 64-bit.
2596 if (isAndroid() || isOHOSFamily())
2599 // Windows-MSVC and UEFI use IEEE double. MinGW and Cygwin keep x87.
2603 case aarch64:
2604 case aarch64_be:
2605 case aarch64_32:
2606 // AArch64 uses IEEE quad, except on Windows and Darwin.
2607 if (isOSWindows() || isOSDarwin())
2610 case mips64:
2611 case mips64el:
2613 case avr:
2614 case tce:
2615 case tcele:
2616 // AVR and 32-bit OpenASIP use IEEE single precision.
2618 case tcele64:
2619 // 64-bit OpenASIP uses IEEE double, unlike its 32-bit variants.
2621 default:
2623 }
2624}
2625
2627 if (isOSDarwin())
2628 return DebuggerKind::LLDB;
2629 if (isPS())
2630 return DebuggerKind::SCE;
2631 if (isOSAIX())
2632 return DebuggerKind::DBX;
2633 return DebuggerKind::GDB;
2634}
2635
2636// HLSL triple environment orders are relied on in the front end
2637static_assert(Triple::Vertex - Triple::Pixel == 1,
2638 "incorrect HLSL stage order");
2639static_assert(Triple::Geometry - Triple::Pixel == 2,
2640 "incorrect HLSL stage order");
2641static_assert(Triple::Hull - Triple::Pixel == 3, "incorrect HLSL stage order");
2642static_assert(Triple::Domain - Triple::Pixel == 4,
2643 "incorrect HLSL stage order");
2644static_assert(Triple::Compute - Triple::Pixel == 5,
2645 "incorrect HLSL stage order");
2646static_assert(Triple::Library - Triple::Pixel == 6,
2647 "incorrect HLSL stage order");
2648static_assert(Triple::RayGeneration - Triple::Pixel == 7,
2649 "incorrect HLSL stage order");
2650static_assert(Triple::Intersection - Triple::Pixel == 8,
2651 "incorrect HLSL stage order");
2652static_assert(Triple::AnyHit - Triple::Pixel == 9,
2653 "incorrect HLSL stage order");
2654static_assert(Triple::ClosestHit - Triple::Pixel == 10,
2655 "incorrect HLSL stage order");
2656static_assert(Triple::Miss - Triple::Pixel == 11, "incorrect HLSL stage order");
2657static_assert(Triple::Callable - Triple::Pixel == 12,
2658 "incorrect HLSL stage order");
2659static_assert(Triple::Mesh - Triple::Pixel == 13, "incorrect HLSL stage order");
2660static_assert(Triple::Amplification - Triple::Pixel == 14,
2661 "incorrect HLSL stage order");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file defines the DenseMap class.
Load MIR Sample Profile
#define T
This file contains some functions that are useful when dealing with strings.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
DEMANGLE_NAMESPACE_BEGIN bool starts_with(std::string_view self, char C) noexcept
static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName)
Definition Triple.cpp:716
static FloatABI::ABIType getARMDefaultFloatABI(const Triple &T, StringRef ABIName)
Definition Triple.cpp:2532
static VersionTuple parseVersionFromName(StringRef Name)
Definition Triple.cpp:1454
static Triple::ObjectFormatType getDefaultFormat(const Triple &T)
Definition Triple.cpp:954
static Triple::ArchType parseARMArch(StringRef ArchName)
Definition Triple.cpp:533
static Triple::OSType parseOS(StringRef OSName)
Definition Triple.cpp:708
static StringRef getDXILArchNameFromShaderModel(StringRef ShaderModelStr)
Definition Triple.cpp:1148
static Triple::ArchType parseBPFArch(StringRef ArchName)
Definition Triple.cpp:444
static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName)
Definition Triple.cpp:723
static Triple::VendorType parseVendor(StringRef VendorName)
Definition Triple.cpp:700
Defines the llvm::VersionTuple class, which represents a version in the form major[....
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:757
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:793
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:736
bool consume_back(StringRef Suffix)
Returns true if this StringRef has the given suffix and removes that suffix.
Definition StringRef.h:691
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition StringRef.h:635
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:446
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
Definition StringRef.h:270
bool consume_front(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition StringRef.h:661
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
StringSwitch & StartsWith(StringLiteral S, T Value)
StringSwitch & EndsWith(StringLiteral S, T Value)
StringSwitch & Cases(std::initializer_list< StringLiteral > CaseStrings, T Value)
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
LLVM_ABI bool isMacOSXVersionLT(unsigned Major, unsigned Minor=0, unsigned Micro=0) const
Comparison function for checking OS X version compatibility, which handles supporting skewed version ...
Definition Triple.cpp:2338
LLVM_ABI VersionTuple getOSVersion() const
Parse the version number from the OS name component of the triple, if present.
Definition Triple.cpp:1487
bool isPPC() const
Tests whether the target is PowerPC (32- or 64-bit LE or BE).
Definition Triple.h:1142
LLVM_ABI StringRef getVendorName() const
Get the vendor (second) component of the triple.
Definition Triple.cpp:1432
LLVM_ABI VersionTuple getWatchOSVersion() const
Parse the version number as with getOSVersion.
Definition Triple.cpp:1607
LLVM_ABI void setArchName(StringRef Str)
Set the architecture (first) component of the triple by name.
Definition Triple.cpp:1715
LLVM_ABI DebuggerKind getDefaultDebuggerTuning() const
Returns the default debugger tuning for this target triple, i.e.
Definition Triple.cpp:2626
LLVM_ABI void setObjectFormat(ObjectFormatType Kind)
Set the object file format.
Definition Triple.cpp:1706
LLVM_ABI llvm::Triple get32BitArchVariant() const
Form a triple with a 32-bit variant of the current architecture.
Definition Triple.cpp:1846
bool isOSCygMing() const
Tests for either Cygwin or MinGW OS.
Definition Triple.h:821
bool isWatchABI() const
Definition Triple.h:700
Triple()=default
Default constructor is the same as an empty string and leaves all triple fields unknown.
@ RayGeneration
Definition Triple.h:406
@ UnknownEnvironment
Definition Triple.h:358
@ Amplification
Definition Triple.h:413
bool isThumb() const
Tests whether the target is Thumb (little and big endian).
Definition Triple.h:1002
bool isX86_64() const
Tests whether the target is x86 (64-bit).
Definition Triple.h:1207
static LLVM_ABI VersionTuple getCanonicalVersionForOS(OSType OSKind, const VersionTuple &Version, bool IsInValidRange)
Returns a canonicalized OS version number for the specified OS.
Definition Triple.cpp:2392
CanonicalForm
Canonical form.
Definition Triple.h:491
LLVM_ABI bool operator<(const Triple &Other) const
Definition Triple.cpp:31
unsigned getArchPointerBitWidth() const
Returns the pointer width of this architecture.
Definition Triple.h:619
LLVM_ABI llvm::Triple getLittleEndianArchVariant() const
Form a triple with a little endian variant of the current architecture.
Definition Triple.cpp:2163
bool isBPF() const
Tests whether the target is eBPF.
Definition Triple.h:1244
static LLVM_ABI StringRef getVendorTypeName(VendorType Kind)
Get the canonical name for the Kind vendor.
Definition Triple.cpp:381
ObjectFormatType getObjectFormat() const
Get the object format for this triple.
Definition Triple.h:540
SubArchType getSubArch() const
get the parsed subarchitecture type for this triple.
Definition Triple.h:519
bool isX86() const
Tests whether the target is x86 (32- or 64-bit).
Definition Triple.h:1199
bool isArm64e() const
Tests whether the target is the Apple "arm64e" AArch64 subarch.
Definition Triple.h:1221
bool isOSBinFormatGOFF() const
Tests whether the OS uses the GOFF binary format.
Definition Triple.h:874
bool isWindowsGNUEnvironment() const
Definition Triple.h:816
LLVM_ABI void setVendorName(StringRef Str)
Set the vendor (second) component of the triple by name.
Definition Triple.cpp:1719
bool isOSNetBSD() const
Definition Triple.h:746
LLVM_ABI void setOSAndEnvironmentName(StringRef Str)
Set the operating system and optional environment components with a single string.
Definition Triple.cpp:1736
bool isAndroid() const
Tests whether the target is Android.
Definition Triple.h:912
LLVM_ABI llvm::Triple get64BitArchVariant() const
Form a triple with a 64-bit variant of the current architecture.
Definition Triple.cpp:1960
LLVM_ABI FloatABI::ABIType getDefaultFloatABI(StringRef ABIName="") const
Returns the default floating-point ABI for this target triple, i.e.
Definition Triple.cpp:2544
LLVM_ABI bool isLittleEndian() const
Tests whether the target triple is little endian.
Definition Triple.cpp:2218
LLVM_ABI void setEnvironment(EnvironmentType Kind)
Set the environment (fourth) component of the triple to a known type.
Definition Triple.cpp:1697
LLVM_ABI StringRef getOSName() const
Get the operating system (third) component of the triple.
Definition Triple.cpp:1437
bool isAVR() const
Definition Triple.h:1117
bool isSPIROrSPIRV() const
Definition Triple.h:986
LLVM_ABI ExceptionHandling getDefaultExceptionHandling() const
Definition Triple.cpp:2480
@ loongarch32
Definition Triple.h:65
@ renderscript64
Definition Triple.h:116
@ UnknownArch
Definition Triple.h:51
@ loongarch64
Definition Triple.h:66
@ renderscript32
Definition Triple.h:115
LLVM_ABI ThreadModel getDefaultThreadModel() const
Returns the default threading model for this target triple, i.e.
Definition Triple.cpp:2559
LLVM_ABI void setTriple(const Twine &Str)
Set all components to the new triple Str.
Definition Triple.cpp:1685
OSType getOS() const
Get the parsed operating system type of this triple.
Definition Triple.h:525
LLVM_ABI VersionTuple getEnvironmentVersion() const
Parse the version number from the OS name component of the triple, if present.
Definition Triple.cpp:1460
static LLVM_ABI std::string normalize(StringRef Str, CanonicalForm Form=CanonicalForm::ANY)
Turn an arbitrary machine specification into the canonical triple form (or something sensible that th...
Definition Triple.cpp:1197
static LLVM_ABI ArchType getArchTypeForLLVMName(StringRef Str)
The canonical type for the given LLVM architecture name (e.g., "x86").
Definition Triple.cpp:459
bool isPPC32() const
Tests whether the target is 32-bit PowerPC (little and big endian).
Definition Triple.h:1148
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:516
LLVM_ABI bool operator==(const Triple &Other) const
Definition Triple.cpp:25
LLVM_ABI unsigned getTrampolineSize() const
Returns the trampoline size in bytes for this configuration.
Definition Triple.cpp:1816
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:871
bool isCSKY() const
Definition Triple.h:1218
LLVM_ABI StringRef getEnvironmentName() const
Get the optional environment (fourth) component of the triple, or "" if empty.
Definition Triple.cpp:1443
bool isSimulatorEnvironment() const
Definition Triple.h:732
LLVM_ABI VersionTuple getDXILVersion() const
Parse the DXIL version number from the OSVersion and DXIL version (SubArch).
Definition Triple.cpp:1672
const std::string & str() const
Definition Triple.h:581
bool isOHOSFamily() const
Tests whether the target is OHOS LiteOS default enviroment is also OHOS, but omited on triple.
Definition Triple.h:945
EnvironmentType getEnvironment() const
Get the parsed environment type of this triple.
Definition Triple.h:531
bool isOSOpenBSD() const
Definition Triple.h:748
LLVM_ABI VersionTuple getVulkanVersion() const
Parse the Vulkan version number from the OSVersion and SPIR-V version (SubArch).
Definition Triple.cpp:1647
LLVM_ABI VersionTuple getDriverKitVersion() const
Parse the version number as with getOSVersion.
Definition Triple.cpp:1635
static LLVM_ABI ArchType parseArch(StringRef Str)
Parse anything recognized as an architecture for the first field of the triple.
Definition Triple.cpp:598
bool isUEFI() const
Tests whether the OS is UEFI.
Definition Triple.h:776
bool isOSWindows() const
Tests whether the OS is Windows.
Definition Triple.h:779
bool isMusl() const
Tests whether the environment is musl-libc.
Definition Triple.h:930
LLVM_ABI LongDoubleFormat getDefaultLongDoubleFormat() const
Returns the default floating-point format for the "long double" type.
Definition Triple.cpp:2561
bool isOSWindowsOrUEFI() const
Tests whether the OS is Windows or UEFI.
Definition Triple.h:785
static LLVM_ABI StringRef getArchTypeName(ArchType Kind)
Get the canonical name for the Kind architecture.
Definition Triple.cpp:37
bool isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
Definition Triple.h:883
static LLVM_ABI StringRef getOSTypeName(OSType Kind)
Get the canonical name for the Kind operating system.
Definition Triple.cpp:394
@ UnknownObjectFormat
Definition Triple.h:423
bool isARM() const
Tests whether the target is ARM (little and big endian).
Definition Triple.h:1007
LLVM_ABI std::string merge(const Triple &Other) const
Merge target triples.
Definition Triple.cpp:2326
bool isOSLinux() const
Tests whether the OS is Linux.
Definition Triple.h:832
static LLVM_ABI SubArchType parseSubArch(StringRef Str)
Parse the subarchitecture encoded in the first (architecture) field of the triple (e....
Definition Triple.cpp:737
bool isRISCV() const
Tests whether the target is RISC-V (32- and 64-bit).
Definition Triple.h:1182
bool isAMDGCN() const
Tests whether the target is AMDGCN.
Definition Triple.h:997
bool isAMDGPU() const
Definition Triple.h:999
@ UnknownVendor
Definition Triple.h:284
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition Triple.h:992
bool isOSAIX() const
Tests whether the OS is AIX.
Definition Triple.h:857
LLVM_ABI VersionTuple getMinimumSupportedOSVersion() const
Some platforms have different minimum supported OS versions that varies by the architecture specified...
Definition Triple.cpp:2355
LLVM_ABI bool isArch64Bit() const
Test whether the architecture is 64-bit.
Definition Triple.cpp:1834
LLVM_ABI StringRef getOSAndEnvironmentName() const
Get the operating system and optional environment components as a single string (separated by a '-' i...
Definition Triple.cpp:1449
@ ARMSubArch_v6t2
Definition Triple.h:155
@ AMDGPUSubArch600
Definition Triple.h:200
@ MipsSubArch_r6
Definition Triple.h:171
@ X86_64SubArch_lfi
Definition Triple.h:165
@ DXILSubArch_v1_2
Definition Triple.h:187
@ ARMSubArch_v7
Definition Triple.h:146
@ ARMSubArch_v8m_mainline
Definition Triple.h:144
@ AMDGPUSubArch1153
Definition Triple.h:261
@ ARMSubArch_v9_6a
Definition Triple.h:125
@ AMDGPUSubArch1012
Definition Triple.h:241
@ ARMSubArch_v8r
Definition Triple.h:142
@ AMDGPUSubArch1150
Definition Triple.h:258
@ ARMSubArch_v9_1a
Definition Triple.h:130
@ AMDGPUSubArch1250S
Definition Triple.h:274
@ DXILSubArch_v1_1
Definition Triple.h:186
@ AMDGPUSubArch703
Definition Triple.h:208
@ AMDGPUSubArch1201
Definition Triple.h:271
@ LatestDXILSubArch
Definition Triple.h:196
@ SPIRVSubArch_v10
Definition Triple.h:176
@ AMDGPUSubArch9
Definition Triple.h:221
@ SPIRVSubArch_v13
Definition Triple.h:179
@ AMDGPUSubArch1172
Definition Triple.h:267
@ AMDGPUSubArch1035
Definition Triple.h:250
@ DXILSubArch_v1_10
Definition Triple.h:195
@ ARMSubArch_v7k
Definition Triple.h:150
@ AMDGPUSubArch9_4
Definition Triple.h:234
@ AMDGPUSubArch6
Definition Triple.h:199
@ AMDGPUSubArch1033
Definition Triple.h:248
@ AMDGPUSubArch1103
Definition Triple.h:257
@ ARMSubArch_v8_7a
Definition Triple.h:134
@ AMDGPUSubArch1034
Definition Triple.h:249
@ AMDGPUSubArch1154
Definition Triple.h:262
@ ARMSubArch_v8
Definition Triple.h:141
@ SPIRVSubArch_v16
Definition Triple.h:182
@ ARMSubArch_v8_1a
Definition Triple.h:140
@ ARMSubArch_v9_2a
Definition Triple.h:129
@ AMDGPUSubArch1200
Definition Triple.h:270
@ AMDGPUSubArch10_3
Definition Triple.h:244
@ DXILSubArch_v1_3
Definition Triple.h:188
@ ARMSubArch_v9_8a
Definition Triple.h:123
@ SPIRVSubArch_v15
Definition Triple.h:181
@ ARMSubArch_v7m
Definition Triple.h:148
@ AMDGPUSubArch1102
Definition Triple.h:256
@ ARMSubArch_v9_7a
Definition Triple.h:124
@ AMDGPUSubArch1013
Definition Triple.h:242
@ AMDGPUSubArch902
Definition Triple.h:223
@ ARMSubArch_v6k
Definition Triple.h:154
@ AMDGPUSubArch1010
Definition Triple.h:239
@ AMDGPUSubArch90A
Definition Triple.h:232
@ ARMSubArch_v5
Definition Triple.h:156
@ AMDGPUSubArch1170
Definition Triple.h:265
@ AArch64SubArch_arm64e
Definition Triple.h:160
@ AMDGPUSubArch810
Definition Triple.h:219
@ ARMSubArch_v6
Definition Triple.h:152
@ AMDGPUSubArch11
Definition Triple.h:253
@ AMDGPUSubArch1151
Definition Triple.h:259
@ ARMSubArch_v9_5a
Definition Triple.h:126
@ AMDGPUSubArch602
Definition Triple.h:202
@ ARMSubArch_v7ve
Definition Triple.h:151
@ ARMSubArch_v8m_baseline
Definition Triple.h:143
@ ARMSubArch_v8_8a
Definition Triple.h:133
@ AArch64SubArch_arm64e_x1
Definition Triple.h:161
@ AMDGPUSubArch942
Definition Triple.h:235
@ AMDGPUSubArch7
Definition Triple.h:204
@ AMDGPUSubArch702
Definition Triple.h:207
@ AMDGPUSubArch950
Definition Triple.h:236
@ ARMSubArch_v8_2a
Definition Triple.h:139
@ ARMSubArch_v7s
Definition Triple.h:149
@ AMDGPUSubArch1251
Definition Triple.h:276
@ AMDGPUSubArch805
Definition Triple.h:216
@ DXILSubArch_v1_0
Definition Triple.h:185
@ DXILSubArch_v1_7
Definition Triple.h:192
@ AMDGPUSubArch12_5
Definition Triple.h:273
@ KalimbaSubArch_v3
Definition Triple.h:167
@ DXILSubArch_v1_5
Definition Triple.h:190
@ AMDGPUSubArch1250
Definition Triple.h:275
@ AMDGPUSubArch1030
Definition Triple.h:245
@ ARMSubArch_v8_4a
Definition Triple.h:137
@ AMDGPUSubArch803
Definition Triple.h:215
@ AMDGPUSubArch601
Definition Triple.h:201
@ ARMSubArch_v8_9a
Definition Triple.h:132
@ AMDGPUSubArch10_1
Definition Triple.h:238
@ AMDGPUSubArch904
Definition Triple.h:224
@ AMDGPUSubArch11_7
Definition Triple.h:264
@ AMDGPUSubArch705
Definition Triple.h:210
@ AMDGPUSubArch802
Definition Triple.h:214
@ AMDGPUSubArch8
Definition Triple.h:212
@ ARMSubArch_v7em
Definition Triple.h:147
@ SPIRVSubArch_v12
Definition Triple.h:178
@ AMDGPUSubArch90C
Definition Triple.h:227
@ SPIRVSubArch_v14
Definition Triple.h:180
@ AMDGPUSubArch1100
Definition Triple.h:254
@ KalimbaSubArch_v4
Definition Triple.h:168
@ AMDGPUSubArch909
Definition Triple.h:226
@ ARMSubArch_v8_1m_mainline
Definition Triple.h:145
@ AMDGPUSubArch1036
Definition Triple.h:251
@ ARMSubArch_v8_3a
Definition Triple.h:138
@ AArch64SubArch_arm64ec
Definition Triple.h:162
@ ARMSubArch_v8_6a
Definition Triple.h:135
@ ARMSubArch_v5te
Definition Triple.h:157
@ KalimbaSubArch_v5
Definition Triple.h:169
@ AMDGPUSubArch701
Definition Triple.h:206
@ ARMSubArch_v4t
Definition Triple.h:158
@ AMDGPUSubArch1171
Definition Triple.h:266
@ DXILSubArch_v1_6
Definition Triple.h:191
@ AMDGPUSubArch1011
Definition Triple.h:240
@ AMDGPUSubArch906
Definition Triple.h:225
@ AMDGPUSubArch900
Definition Triple.h:222
@ AMDGPUSubArch1152
Definition Triple.h:260
@ DXILSubArch_v1_8
Definition Triple.h:193
@ AMDGPUSubArch801
Definition Triple.h:213
@ ARMSubArch_v9_4a
Definition Triple.h:127
@ ARMSubArch_v8_5a
Definition Triple.h:136
@ AArch64SubArch_lfi
Definition Triple.h:163
@ ARMSubArch_v6m
Definition Triple.h:153
@ ARMSubArch_v9_3a
Definition Triple.h:128
@ DXILSubArch_v1_9
Definition Triple.h:194
@ AMDGPUSubArch704
Definition Triple.h:209
@ AMDGPUSubArch1031
Definition Triple.h:246
@ AMDGPUSubArch1101
Definition Triple.h:255
@ ARMSubArch_v9
Definition Triple.h:131
@ AMDGPUSubArch13
Definition Triple.h:278
@ AMDGPUSubArch12
Definition Triple.h:269
@ DXILSubArch_v1_4
Definition Triple.h:189
@ AMDGPUSubArch700
Definition Triple.h:205
@ SPIRVSubArch_v11
Definition Triple.h:177
@ PPCSubArch_spe
Definition Triple.h:173
@ AMDGPUSubArch1032
Definition Triple.h:247
@ AMDGPUSubArch1310
Definition Triple.h:279
@ AMDGPUSubArch908
Definition Triple.h:231
LLVM_ABI bool getMacOSXVersion(VersionTuple &Version) const
Parse the version number as with getOSVersion and then translate generic "darwin" versions to the cor...
Definition Triple.cpp:1501
static LLVM_ABI bool isValidVersionForOS(OSType OSKind, const VersionTuple &Version)
Returns whether an OS version is invalid and would not map to an Apple OS.
Definition Triple.cpp:2449
bool isMacOSX() const
Is this a Mac OS X triple.
Definition Triple.h:683
bool isOSFreeBSD() const
Definition Triple.h:750
LLVM_ABI void setEnvironmentName(StringRef Str)
Set the optional environment (fourth) component of the triple by name.
Definition Triple.cpp:1731
LLVM_ABI void setOS(OSType Kind)
Set the operating system (third) component of the triple to a known type.
Definition Triple.cpp:1695
LLVM_ABI void setOSName(StringRef Str)
Set the operating system (third) component of the triple by name.
Definition Triple.cpp:1723
VendorType getVendor() const
Get the parsed vendor type of this triple.
Definition Triple.h:522
bool isSPARC() const
Tests whether the target is SPARC.
Definition Triple.h:1193
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:725
static LLVM_ABI StringRef getEnvironmentTypeName(EnvironmentType Kind)
Get the canonical name for the Kind environment.
Definition Triple.cpp:407
bool isOSVersionLT(unsigned Major, unsigned Minor=0, unsigned Micro=0) const
Helper function for doing comparisons against version numbers included in the target triple.
Definition Triple.h:647
bool empty() const
Whether the triple is empty / default constructed.
Definition Triple.h:586
bool isMIPS() const
Tests whether the target is MIPS (little and big endian, 32- or 64-bit).
Definition Triple.h:1139
bool isPS() const
Tests whether the target is the PS4 or PS5 platform.
Definition Triple.h:909
bool isWasm() const
Tests whether the target is wasm (32- and 64-bit).
Definition Triple.h:1213
LLVM_ABI StringRef getArchName() const
Get the architecture (first) component of the triple.
Definition Triple.cpp:1428
bool isMacCatalystEnvironment() const
Definition Triple.h:736
bool isAArch64() const
Tests whether the target is AArch64 (little and big endian).
Definition Triple.h:1100
static LLVM_ABI StringRef getObjectFormatTypeName(ObjectFormatType ObjectFormat)
Get the name for the Object format.
Definition Triple.cpp:420
LLVM_ABI bool isArch16Bit() const
Test whether the architecture is 16-bit.
Definition Triple.cpp:1842
LLVM_ABI llvm::Triple getBigEndianArchVariant() const
Form a triple with a big endian variant of the current architecture.
Definition Triple.cpp:2080
LLVM_ABI VersionTuple getiOSVersion() const
Parse the version number as with getOSVersion.
Definition Triple.cpp:1555
LLVM_ABI StringRef getEnvironmentVersionString() const
Get the version component of the environment component as a single string (the version after the envi...
Definition Triple.cpp:1464
LLVM_ABI bool isArch32Bit() const
Test whether the architecture is 32-bit.
Definition Triple.cpp:1838
LLVM_ABI bool isCompatibleWith(const Triple &Other) const
Test whether target triples are compatible.
Definition Triple.cpp:2283
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:868
bool isWindowsMSVCEnvironment() const
Checks if the environment could be MSVC.
Definition Triple.h:793
bool hasEnvironment() const
Does this triple have the optional environment (fourth) component?
Definition Triple.h:528
LLVM_ABI unsigned getDefaultWCharSize() const
Returns the default wchar_t size (in bytes) for this target triple.
Definition Triple.cpp:2271
static LLVM_ABI StringRef getArchTypePrefix(ArchType Kind)
Get the "prefix" canonical name for the Kind architecture.
Definition Triple.cpp:260
LLVM_ABI void setArch(ArchType Kind, SubArchType SubArch=NoSubArch)
Set the architecture (first) component of the triple to a known type.
Definition Triple.cpp:1687
LLVM_ABI void setVendor(VendorType Kind)
Set the vendor (second) component of the triple to a known type.
Definition Triple.cpp:1691
bool isLoongArch() const
Tests whether the target is LoongArch (32- and 64-bit).
Definition Triple.h:1126
bool isWindowsItaniumEnvironment() const
Definition Triple.h:808
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
Definition Twine.cpp:17
Represents a version number in the form major[.minor[.subminor[.build]]].
unsigned getMajor() const
Retrieve the major version number.
LLVM_ABI bool tryParse(StringRef string)
Try to parse the given string as a version number.
bool empty() const
Determine whether this version information is empty (e.g., all version components are zero).
std::optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI std::string mergeSubArch(const Triple &A, const Triple &B)
Returns the effective triple appropriate to use when linking B into A by merging the subarches in cas...
LLVM_ABI bool isSubArchCompatible(const Triple &A, const Triple &B)
Return true if subarch A is compatible with subarch B, i.e.
LLVM_ABI StringRef getSubArchName(Triple::SubArchType SubArch)
Returns the triple subarch name for an AMDGPU subarch, e.g.
LLVM_ABI StringRef getCanonicalArchName(StringRef Arch)
MArch is expected to be of the form (arm|thumb)?(eb)?(v.
LLVM_ABI ISAKind parseArchISA(StringRef Arch)
LLVM_ABI LLVM_READONLY ARMABI computeTargetABI(const Triple &TT, StringRef ABIName="")
LLVM_ABI ArchKind parseArch(StringRef Arch)
LLVM_ABI ProfileKind parseArchProfile(StringRef Arch)
LLVM_ABI unsigned parseArchVersion(StringRef Arch)
LLVM_ABI EndianKind parseArchEndian(StringRef Arch)
constexpr bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
LongDoubleFormat
The floating-point format used for the target's "long double" type.
Definition CodeGen.h:117
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
@ Other
Any other memory.
Definition ModRef.h:68
std::string join(IteratorT Begin, IteratorT End, StringRef Separator)
Joins the strings in the range [Begin, End), adding Separator between the elements.
ThreadModel
The threading model to assume for lowering, e.g. of atomics.
Definition CodeGen.h:191
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
ExceptionHandling
Definition CodeGen.h:54
@ SjLj
setjmp/longjmp based exceptions
Definition CodeGen.h:58
@ ZOS
z/OS MVS Exception Handling.
Definition CodeGen.h:64
@ None
No exception support.
Definition CodeGen.h:56
@ AIX
AIX Exception Handling.
Definition CodeGen.h:63
@ DwarfCFI
DWARF-like instruction based exceptions.
Definition CodeGen.h:57
@ WinEH
Windows Exception Handling.
Definition CodeGen.h:60
DebuggerKind
Identify a debugger for "tuning" the debug info.
Definition CodeGen.h:231
@ SCE
Tune debug info for SCE targets (e.g. PS4).
Definition CodeGen.h:235
@ DBX
Tune debug info for dbx.
Definition CodeGen.h:236
@ GDB
Tune debug info for gdb.
Definition CodeGen.h:233
@ LLDB
Tune debug info for lldb.
Definition CodeGen.h:234
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:879
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:881