1 //===--- Triple.cpp - Target triple helper class --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/Triple.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/StringSwitch.h"
14 #include "llvm/Support/ErrorHandling.h"
15 #include "llvm/Support/TargetParser.h"
16 #include "llvm/Support/Host.h"
20 StringRef Triple::getArchTypeName(ArchType Kind) {
22 case UnknownArch: return "unknown";
24 case aarch64: return "aarch64";
25 case aarch64_be: return "aarch64_be";
26 case arm: return "arm";
27 case armeb: return "armeb";
28 case avr: return "avr";
29 case bpfel: return "bpfel";
30 case bpfeb: return "bpfeb";
31 case hexagon: return "hexagon";
32 case mips: return "mips";
33 case mipsel: return "mipsel";
34 case mips64: return "mips64";
35 case mips64el: return "mips64el";
36 case msp430: return "msp430";
37 case nios2: return "nios2";
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) {
84 case aarch64_be: return "aarch64";
89 case thumbeb: return "arm";
91 case avr: return "avr";
95 case ppc: return "ppc";
100 case mips64el: return "mips";
102 case nios2: return "nios2";
104 case hexagon: return "hexagon";
106 case amdgcn: return "amdgcn";
107 case r600: return "r600";
110 case bpfeb: return "bpf";
114 case sparc: return "sparc";
116 case systemz: return "s390";
119 case x86_64: return "x86";
121 case xcore: return "xcore";
123 // NVPTX intrinsics are namespaced under nvvm.
124 case nvptx: return "nvvm";
125 case nvptx64: return "nvvm";
127 case le32: return "le32";
128 case le64: return "le64";
131 case amdil64: return "amdil";
134 case hsail64: return "hsail";
137 case spir64: return "spir";
138 case kalimba: return "kalimba";
139 case lanai: return "lanai";
140 case shave: return "shave";
142 case wasm64: return "wasm";
145 case riscv64: return "riscv";
149 StringRef Triple::getVendorTypeName(VendorType Kind) {
151 case UnknownVendor: return "unknown";
153 case Apple: return "apple";
154 case PC: return "pc";
155 case SCEI: return "scei";
156 case BGP: return "bgp";
157 case BGQ: return "bgq";
158 case Freescale: return "fsl";
159 case IBM: return "ibm";
160 case ImaginationTechnologies: return "img";
161 case MipsTechnologies: return "mti";
162 case NVIDIA: return "nvidia";
163 case CSR: return "csr";
164 case Myriad: return "myriad";
165 case AMD: return "amd";
166 case Mesa: return "mesa";
167 case SUSE: return "suse";
170 llvm_unreachable("Invalid VendorType!");
173 StringRef Triple::getOSTypeName(OSType Kind) {
175 case UnknownOS: return "unknown";
177 case CloudABI: return "cloudabi";
178 case Darwin: return "darwin";
179 case DragonFly: return "dragonfly";
180 case FreeBSD: return "freebsd";
181 case Fuchsia: return "fuchsia";
182 case IOS: return "ios";
183 case KFreeBSD: return "kfreebsd";
184 case Linux: return "linux";
185 case Lv2: return "lv2";
186 case MacOSX: return "macosx";
187 case NetBSD: return "netbsd";
188 case OpenBSD: return "openbsd";
189 case Solaris: return "solaris";
190 case Win32: return "windows";
191 case Haiku: return "haiku";
192 case Minix: return "minix";
193 case RTEMS: return "rtems";
194 case NaCl: return "nacl";
195 case CNK: return "cnk";
196 case Bitrig: return "bitrig";
197 case AIX: return "aix";
198 case CUDA: return "cuda";
199 case NVCL: return "nvcl";
200 case AMDHSA: return "amdhsa";
201 case PS4: return "ps4";
202 case ELFIAMCU: return "elfiamcu";
203 case TvOS: return "tvos";
204 case WatchOS: return "watchos";
205 case Mesa3D: return "mesa3d";
206 case Contiki: return "contiki";
209 llvm_unreachable("Invalid OSType");
212 StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
214 case UnknownEnvironment: return "unknown";
215 case GNU: return "gnu";
216 case GNUABI64: return "gnuabi64";
217 case GNUEABIHF: return "gnueabihf";
218 case GNUEABI: return "gnueabi";
219 case GNUX32: return "gnux32";
220 case CODE16: return "code16";
221 case EABI: return "eabi";
222 case EABIHF: return "eabihf";
223 case Android: return "android";
224 case Musl: return "musl";
225 case MuslEABI: return "musleabi";
226 case MuslEABIHF: return "musleabihf";
227 case MSVC: return "msvc";
228 case Itanium: return "itanium";
229 case Cygnus: return "cygnus";
230 case AMDOpenCL: return "amdopencl";
231 case CoreCLR: return "coreclr";
232 case OpenCL: return "opencl";
235 llvm_unreachable("Invalid EnvironmentType!");
238 static Triple::ArchType parseBPFArch(StringRef ArchName) {
239 if (ArchName.equals("bpf")) {
240 if (sys::IsLittleEndianHost)
241 return Triple::bpfel;
243 return Triple::bpfeb;
244 } else if (ArchName.equals("bpf_be") || ArchName.equals("bpfeb")) {
245 return Triple::bpfeb;
246 } else if (ArchName.equals("bpf_le") || ArchName.equals("bpfel")) {
247 return Triple::bpfel;
249 return Triple::UnknownArch;
253 Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
254 Triple::ArchType BPFArch(parseBPFArch(Name));
255 return StringSwitch<Triple::ArchType>(Name)
256 .Case("aarch64", aarch64)
257 .Case("aarch64_be", aarch64_be)
258 .Case("arm64", aarch64) // "arm64" is an alias for "aarch64"
260 .Case("armeb", armeb)
262 .StartsWith("bpf", BPFArch)
264 .Case("mipsel", mipsel)
265 .Case("mips64", mips64)
266 .Case("mips64el", mips64el)
267 .Case("msp430", msp430)
268 .Case("nios2", nios2)
269 .Case("ppc64", ppc64)
272 .Case("ppc64le", ppc64le)
274 .Case("amdgcn", amdgcn)
275 .Case("riscv32", riscv32)
276 .Case("riscv64", riscv64)
277 .Case("hexagon", hexagon)
278 .Case("sparc", sparc)
279 .Case("sparcel", sparcel)
280 .Case("sparcv9", sparcv9)
281 .Case("systemz", systemz)
283 .Case("tcele", tcele)
284 .Case("thumb", thumb)
285 .Case("thumbeb", thumbeb)
287 .Case("x86-64", x86_64)
288 .Case("xcore", xcore)
289 .Case("nvptx", nvptx)
290 .Case("nvptx64", nvptx64)
293 .Case("amdil", amdil)
294 .Case("amdil64", amdil64)
295 .Case("hsail", hsail)
296 .Case("hsail64", hsail64)
298 .Case("spir64", spir64)
299 .Case("kalimba", kalimba)
300 .Case("lanai", lanai)
301 .Case("shave", shave)
302 .Case("wasm32", wasm32)
303 .Case("wasm64", wasm64)
304 .Case("renderscript32", renderscript32)
305 .Case("renderscript64", renderscript64)
306 .Default(UnknownArch);
309 static Triple::ArchType parseARMArch(StringRef ArchName) {
310 unsigned ISA = ARM::parseArchISA(ArchName);
311 unsigned ENDIAN = ARM::parseArchEndian(ArchName);
313 Triple::ArchType arch = Triple::UnknownArch;
315 case ARM::EK_LITTLE: {
321 arch = Triple::thumb;
323 case ARM::IK_AARCH64:
324 arch = Triple::aarch64;
332 arch = Triple::armeb;
335 arch = Triple::thumbeb;
337 case ARM::IK_AARCH64:
338 arch = Triple::aarch64_be;
345 ArchName = ARM::getCanonicalArchName(ArchName);
346 if (ArchName.empty())
347 return Triple::UnknownArch;
349 // Thumb only exists in v4+
350 if (ISA == ARM::IK_THUMB &&
351 (ArchName.startswith("v2") || ArchName.startswith("v3")))
352 return Triple::UnknownArch;
354 // Thumb only for v6m
355 unsigned Profile = ARM::parseArchProfile(ArchName);
356 unsigned Version = ARM::parseArchVersion(ArchName);
357 if (Profile == ARM::PK_M && Version == 6) {
358 if (ENDIAN == ARM::EK_BIG)
359 return Triple::thumbeb;
361 return Triple::thumb;
367 static Triple::ArchType parseArch(StringRef ArchName) {
368 auto AT = StringSwitch<Triple::ArchType>(ArchName)
369 .Cases("i386", "i486", "i586", "i686", Triple::x86)
370 // FIXME: Do we need to support these?
371 .Cases("i786", "i886", "i986", Triple::x86)
372 .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64)
373 .Cases("powerpc", "ppc32", Triple::ppc)
374 .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64)
375 .Cases("powerpc64le", "ppc64le", Triple::ppc64le)
376 .Case("xscale", Triple::arm)
377 .Case("xscaleeb", Triple::armeb)
378 .Case("aarch64", Triple::aarch64)
379 .Case("aarch64_be", Triple::aarch64_be)
380 .Case("arm64", Triple::aarch64)
381 .Case("arm", Triple::arm)
382 .Case("armeb", Triple::armeb)
383 .Case("thumb", Triple::thumb)
384 .Case("thumbeb", Triple::thumbeb)
385 .Case("avr", Triple::avr)
386 .Case("msp430", Triple::msp430)
387 .Cases("mips", "mipseb", "mipsallegrex", Triple::mips)
388 .Cases("mipsel", "mipsallegrexel", Triple::mipsel)
389 .Cases("mips64", "mips64eb", Triple::mips64)
390 .Case("mips64el", Triple::mips64el)
391 .Case("nios2", Triple::nios2)
392 .Case("r600", Triple::r600)
393 .Case("amdgcn", Triple::amdgcn)
394 .Case("riscv32", Triple::riscv32)
395 .Case("riscv64", Triple::riscv64)
396 .Case("hexagon", Triple::hexagon)
397 .Cases("s390x", "systemz", Triple::systemz)
398 .Case("sparc", Triple::sparc)
399 .Case("sparcel", Triple::sparcel)
400 .Cases("sparcv9", "sparc64", Triple::sparcv9)
401 .Case("tce", Triple::tce)
402 .Case("tcele", Triple::tcele)
403 .Case("xcore", Triple::xcore)
404 .Case("nvptx", Triple::nvptx)
405 .Case("nvptx64", Triple::nvptx64)
406 .Case("le32", Triple::le32)
407 .Case("le64", Triple::le64)
408 .Case("amdil", Triple::amdil)
409 .Case("amdil64", Triple::amdil64)
410 .Case("hsail", Triple::hsail)
411 .Case("hsail64", Triple::hsail64)
412 .Case("spir", Triple::spir)
413 .Case("spir64", Triple::spir64)
414 .StartsWith("kalimba", Triple::kalimba)
415 .Case("lanai", Triple::lanai)
416 .Case("shave", Triple::shave)
417 .Case("wasm32", Triple::wasm32)
418 .Case("wasm64", Triple::wasm64)
419 .Case("renderscript32", Triple::renderscript32)
420 .Case("renderscript64", Triple::renderscript64)
421 .Default(Triple::UnknownArch);
423 // Some architectures require special parsing logic just to compute the
425 if (AT == Triple::UnknownArch) {
426 if (ArchName.startswith("arm") || ArchName.startswith("thumb") ||
427 ArchName.startswith("aarch64"))
428 return parseARMArch(ArchName);
429 if (ArchName.startswith("bpf"))
430 return parseBPFArch(ArchName);
436 static Triple::VendorType parseVendor(StringRef VendorName) {
437 return StringSwitch<Triple::VendorType>(VendorName)
438 .Case("apple", Triple::Apple)
439 .Case("pc", Triple::PC)
440 .Case("scei", Triple::SCEI)
441 .Case("bgp", Triple::BGP)
442 .Case("bgq", Triple::BGQ)
443 .Case("fsl", Triple::Freescale)
444 .Case("ibm", Triple::IBM)
445 .Case("img", Triple::ImaginationTechnologies)
446 .Case("mti", Triple::MipsTechnologies)
447 .Case("nvidia", Triple::NVIDIA)
448 .Case("csr", Triple::CSR)
449 .Case("myriad", Triple::Myriad)
450 .Case("amd", Triple::AMD)
451 .Case("mesa", Triple::Mesa)
452 .Case("suse", Triple::SUSE)
453 .Default(Triple::UnknownVendor);
456 static Triple::OSType parseOS(StringRef OSName) {
457 return StringSwitch<Triple::OSType>(OSName)
458 .StartsWith("cloudabi", Triple::CloudABI)
459 .StartsWith("darwin", Triple::Darwin)
460 .StartsWith("dragonfly", Triple::DragonFly)
461 .StartsWith("freebsd", Triple::FreeBSD)
462 .StartsWith("fuchsia", Triple::Fuchsia)
463 .StartsWith("ios", Triple::IOS)
464 .StartsWith("kfreebsd", Triple::KFreeBSD)
465 .StartsWith("linux", Triple::Linux)
466 .StartsWith("lv2", Triple::Lv2)
467 .StartsWith("macos", Triple::MacOSX)
468 .StartsWith("netbsd", Triple::NetBSD)
469 .StartsWith("openbsd", Triple::OpenBSD)
470 .StartsWith("solaris", Triple::Solaris)
471 .StartsWith("win32", Triple::Win32)
472 .StartsWith("windows", Triple::Win32)
473 .StartsWith("haiku", Triple::Haiku)
474 .StartsWith("minix", Triple::Minix)
475 .StartsWith("rtems", Triple::RTEMS)
476 .StartsWith("nacl", Triple::NaCl)
477 .StartsWith("cnk", Triple::CNK)
478 .StartsWith("bitrig", Triple::Bitrig)
479 .StartsWith("aix", Triple::AIX)
480 .StartsWith("cuda", Triple::CUDA)
481 .StartsWith("nvcl", Triple::NVCL)
482 .StartsWith("amdhsa", Triple::AMDHSA)
483 .StartsWith("ps4", Triple::PS4)
484 .StartsWith("elfiamcu", Triple::ELFIAMCU)
485 .StartsWith("tvos", Triple::TvOS)
486 .StartsWith("watchos", Triple::WatchOS)
487 .StartsWith("mesa3d", Triple::Mesa3D)
488 .StartsWith("contiki", Triple::Contiki)
489 .Default(Triple::UnknownOS);
492 static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
493 return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
494 .StartsWith("eabihf", Triple::EABIHF)
495 .StartsWith("eabi", Triple::EABI)
496 .StartsWith("gnuabi64", Triple::GNUABI64)
497 .StartsWith("gnueabihf", Triple::GNUEABIHF)
498 .StartsWith("gnueabi", Triple::GNUEABI)
499 .StartsWith("gnux32", Triple::GNUX32)
500 .StartsWith("code16", Triple::CODE16)
501 .StartsWith("gnu", Triple::GNU)
502 .StartsWith("android", Triple::Android)
503 .StartsWith("musleabihf", Triple::MuslEABIHF)
504 .StartsWith("musleabi", Triple::MuslEABI)
505 .StartsWith("musl", Triple::Musl)
506 .StartsWith("msvc", Triple::MSVC)
507 .StartsWith("itanium", Triple::Itanium)
508 .StartsWith("cygnus", Triple::Cygnus)
509 .StartsWith("amdopencl", Triple::AMDOpenCL)
510 .StartsWith("coreclr", Triple::CoreCLR)
511 .StartsWith("opencl", Triple::OpenCL)
512 .Default(Triple::UnknownEnvironment);
515 static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {
516 return StringSwitch<Triple::ObjectFormatType>(EnvironmentName)
517 .EndsWith("coff", Triple::COFF)
518 .EndsWith("elf", Triple::ELF)
519 .EndsWith("macho", Triple::MachO)
520 .EndsWith("wasm", Triple::Wasm)
521 .Default(Triple::UnknownObjectFormat);
524 static Triple::SubArchType parseSubArch(StringRef SubArchName) {
525 StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
527 // For now, this is the small part. Early return.
528 if (ARMSubArch.empty())
529 return StringSwitch<Triple::SubArchType>(SubArchName)
530 .EndsWith("kalimba3", Triple::KalimbaSubArch_v3)
531 .EndsWith("kalimba4", Triple::KalimbaSubArch_v4)
532 .EndsWith("kalimba5", Triple::KalimbaSubArch_v5)
533 .Default(Triple::NoSubArch);
536 switch(ARM::parseArch(ARMSubArch)) {
538 return Triple::NoSubArch;
540 return Triple::ARMSubArch_v4t;
542 return Triple::ARMSubArch_v5;
543 case ARM::AK_ARMV5TE:
545 case ARM::AK_IWMMXT2:
547 case ARM::AK_ARMV5TEJ:
548 return Triple::ARMSubArch_v5te;
550 return Triple::ARMSubArch_v6;
552 case ARM::AK_ARMV6KZ:
553 return Triple::ARMSubArch_v6k;
554 case ARM::AK_ARMV6T2:
555 return Triple::ARMSubArch_v6t2;
557 return Triple::ARMSubArch_v6m;
560 return Triple::ARMSubArch_v7;
561 case ARM::AK_ARMV7VE:
562 return Triple::ARMSubArch_v7ve;
564 return Triple::ARMSubArch_v7k;
566 return Triple::ARMSubArch_v7m;
568 return Triple::ARMSubArch_v7s;
569 case ARM::AK_ARMV7EM:
570 return Triple::ARMSubArch_v7em;
572 return Triple::ARMSubArch_v8;
573 case ARM::AK_ARMV8_1A:
574 return Triple::ARMSubArch_v8_1a;
575 case ARM::AK_ARMV8_2A:
576 return Triple::ARMSubArch_v8_2a;
578 return Triple::ARMSubArch_v8r;
579 case ARM::AK_ARMV8MBaseline:
580 return Triple::ARMSubArch_v8m_baseline;
581 case ARM::AK_ARMV8MMainline:
582 return Triple::ARMSubArch_v8m_mainline;
584 return Triple::NoSubArch;
588 static StringRef getObjectFormatTypeName(Triple::ObjectFormatType Kind) {
590 case Triple::UnknownObjectFormat: return "";
591 case Triple::COFF: return "coff";
592 case Triple::ELF: return "elf";
593 case Triple::MachO: return "macho";
594 case Triple::Wasm: return "wasm";
596 llvm_unreachable("unknown object format type");
599 static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
600 switch (T.getArch()) {
601 case Triple::UnknownArch:
602 case Triple::aarch64:
608 return Triple::MachO;
609 else if (T.isOSWindows())
613 case Triple::aarch64_be:
616 case Triple::amdil64:
621 case Triple::hexagon:
624 case Triple::hsail64:
625 case Triple::kalimba:
630 case Triple::mips64el:
635 case Triple::nvptx64:
636 case Triple::ppc64le:
638 case Triple::renderscript32:
639 case Triple::renderscript64:
640 case Triple::riscv32:
641 case Triple::riscv64:
644 case Triple::sparcel:
645 case Triple::sparcv9:
648 case Triple::systemz:
651 case Triple::thumbeb:
660 return Triple::MachO;
663 llvm_unreachable("unknown architecture");
666 /// \brief Construct a triple from the string representation provided.
668 /// This stores the string representation and parses the various pieces into
670 Triple::Triple(const Twine &Str)
671 : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch),
672 Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment),
673 ObjectFormat(UnknownObjectFormat) {
674 // Do minimal parsing by hand here.
675 SmallVector<StringRef, 4> Components;
676 StringRef(Data).split(Components, '-', /*MaxSplit*/ 3);
677 if (Components.size() > 0) {
678 Arch = parseArch(Components[0]);
679 SubArch = parseSubArch(Components[0]);
680 if (Components.size() > 1) {
681 Vendor = parseVendor(Components[1]);
682 if (Components.size() > 2) {
683 OS = parseOS(Components[2]);
684 if (Components.size() > 3) {
685 Environment = parseEnvironment(Components[3]);
686 ObjectFormat = parseFormat(Components[3]);
691 if (ObjectFormat == UnknownObjectFormat)
692 ObjectFormat = getDefaultFormat(*this);
695 /// \brief Construct a triple from string representations of the architecture,
698 /// This joins each argument into a canonical string representation and parses
699 /// them into enum members. It leaves the environment unknown and omits it from
700 /// the string representation.
701 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
702 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
703 Arch(parseArch(ArchStr.str())),
704 SubArch(parseSubArch(ArchStr.str())),
705 Vendor(parseVendor(VendorStr.str())),
706 OS(parseOS(OSStr.str())),
707 Environment(), ObjectFormat(Triple::UnknownObjectFormat) {
708 ObjectFormat = getDefaultFormat(*this);
711 /// \brief Construct a triple from string representations of the architecture,
712 /// vendor, OS, and environment.
714 /// This joins each argument into a canonical string representation and parses
715 /// them into enum members.
716 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
717 const Twine &EnvironmentStr)
718 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
719 EnvironmentStr).str()),
720 Arch(parseArch(ArchStr.str())),
721 SubArch(parseSubArch(ArchStr.str())),
722 Vendor(parseVendor(VendorStr.str())),
723 OS(parseOS(OSStr.str())),
724 Environment(parseEnvironment(EnvironmentStr.str())),
725 ObjectFormat(parseFormat(EnvironmentStr.str())) {
726 if (ObjectFormat == Triple::UnknownObjectFormat)
727 ObjectFormat = getDefaultFormat(*this);
730 std::string Triple::normalize(StringRef Str) {
731 bool IsMinGW32 = false;
732 bool IsCygwin = false;
734 // Parse into components.
735 SmallVector<StringRef, 4> Components;
736 Str.split(Components, '-');
738 // If the first component corresponds to a known architecture, preferentially
739 // use it for the architecture. If the second component corresponds to a
740 // known vendor, preferentially use it for the vendor, etc. This avoids silly
741 // component movement when a component parses as (eg) both a valid arch and a
743 ArchType Arch = UnknownArch;
744 if (Components.size() > 0)
745 Arch = parseArch(Components[0]);
746 VendorType Vendor = UnknownVendor;
747 if (Components.size() > 1)
748 Vendor = parseVendor(Components[1]);
749 OSType OS = UnknownOS;
750 if (Components.size() > 2) {
751 OS = parseOS(Components[2]);
752 IsCygwin = Components[2].startswith("cygwin");
753 IsMinGW32 = Components[2].startswith("mingw");
755 EnvironmentType Environment = UnknownEnvironment;
756 if (Components.size() > 3)
757 Environment = parseEnvironment(Components[3]);
758 ObjectFormatType ObjectFormat = UnknownObjectFormat;
759 if (Components.size() > 4)
760 ObjectFormat = parseFormat(Components[4]);
762 // Note which components are already in their final position. These will not
765 Found[0] = Arch != UnknownArch;
766 Found[1] = Vendor != UnknownVendor;
767 Found[2] = OS != UnknownOS;
768 Found[3] = Environment != UnknownEnvironment;
770 // If they are not there already, permute the components into their canonical
771 // positions by seeing if they parse as a valid architecture, and if so moving
772 // the component to the architecture position etc.
773 for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
775 continue; // Already in the canonical position.
777 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
778 // Do not reparse any components that already matched.
779 if (Idx < array_lengthof(Found) && Found[Idx])
782 // Does this component parse as valid for the target position?
784 StringRef Comp = Components[Idx];
786 default: llvm_unreachable("unexpected component type!");
788 Arch = parseArch(Comp);
789 Valid = Arch != UnknownArch;
792 Vendor = parseVendor(Comp);
793 Valid = Vendor != UnknownVendor;
797 IsCygwin = Comp.startswith("cygwin");
798 IsMinGW32 = Comp.startswith("mingw");
799 Valid = OS != UnknownOS || IsCygwin || IsMinGW32;
802 Environment = parseEnvironment(Comp);
803 Valid = Environment != UnknownEnvironment;
805 ObjectFormat = parseFormat(Comp);
806 Valid = ObjectFormat != UnknownObjectFormat;
811 continue; // Nope, try the next component.
813 // Move the component to the target position, pushing any non-fixed
814 // components that are in the way to the right. This tends to give
815 // good results in the common cases of a forgotten vendor component
816 // or a wrongly positioned environment.
818 // Insert left, pushing the existing components to the right. For
819 // example, a-b-i386 -> i386-a-b when moving i386 to the front.
820 StringRef CurrentComponent(""); // The empty component.
821 // Replace the component we are moving with an empty component.
822 std::swap(CurrentComponent, Components[Idx]);
823 // Insert the component being moved at Pos, displacing any existing
824 // components to the right.
825 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
826 // Skip over any fixed components.
827 while (i < array_lengthof(Found) && Found[i])
829 // Place the component at the new position, getting the component
830 // that was at this position - it will be moved right.
831 std::swap(CurrentComponent, Components[i]);
833 } else if (Pos > Idx) {
834 // Push right by inserting empty components until the component at Idx
835 // reaches the target position Pos. For example, pc-a -> -pc-a when
836 // moving pc to the second position.
838 // Insert one empty component at Idx.
839 StringRef CurrentComponent(""); // The empty component.
840 for (unsigned i = Idx; i < Components.size();) {
841 // Place the component at the new position, getting the component
842 // that was at this position - it will be moved right.
843 std::swap(CurrentComponent, Components[i]);
844 // If it was placed on top of an empty component then we are done.
845 if (CurrentComponent.empty())
847 // Advance to the next component, skipping any fixed components.
848 while (++i < array_lengthof(Found) && Found[i])
851 // The last component was pushed off the end - append it.
852 if (!CurrentComponent.empty())
853 Components.push_back(CurrentComponent);
855 // Advance Idx to the component's new position.
856 while (++Idx < array_lengthof(Found) && Found[Idx])
858 } while (Idx < Pos); // Add more until the final position is reached.
860 assert(Pos < Components.size() && Components[Pos] == Comp &&
861 "Component moved wrong!");
867 // Special case logic goes here. At this point Arch, Vendor and OS have the
868 // correct values for the computed components.
869 std::string NormalizedEnvironment;
870 if (Environment == Triple::Android && Components[3].startswith("androideabi")) {
871 StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));
872 if (AndroidVersion.empty()) {
873 Components[3] = "android";
875 NormalizedEnvironment = Twine("android", AndroidVersion).str();
876 Components[3] = NormalizedEnvironment;
880 if (OS == Triple::Win32) {
881 Components.resize(4);
882 Components[2] = "windows";
883 if (Environment == UnknownEnvironment) {
884 if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)
885 Components[3] = "msvc";
887 Components[3] = getObjectFormatTypeName(ObjectFormat);
889 } else if (IsMinGW32) {
890 Components.resize(4);
891 Components[2] = "windows";
892 Components[3] = "gnu";
893 } else if (IsCygwin) {
894 Components.resize(4);
895 Components[2] = "windows";
896 Components[3] = "cygnus";
898 if (IsMinGW32 || IsCygwin ||
899 (OS == Triple::Win32 && Environment != UnknownEnvironment)) {
900 if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {
901 Components.resize(5);
902 Components[4] = getObjectFormatTypeName(ObjectFormat);
906 // Stick the corrected components back together to form the normalized string.
907 std::string Normalized;
908 for (unsigned i = 0, e = Components.size(); i != e; ++i) {
909 if (i) Normalized += '-';
910 Normalized += Components[i];
915 StringRef Triple::getArchName() const {
916 return StringRef(Data).split('-').first; // Isolate first component
919 StringRef Triple::getVendorName() const {
920 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
921 return Tmp.split('-').first; // Isolate second component
924 StringRef Triple::getOSName() const {
925 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
926 Tmp = Tmp.split('-').second; // Strip second component
927 return Tmp.split('-').first; // Isolate third component
930 StringRef Triple::getEnvironmentName() const {
931 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
932 Tmp = Tmp.split('-').second; // Strip second component
933 return Tmp.split('-').second; // Strip third component
936 StringRef Triple::getOSAndEnvironmentName() const {
937 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
938 return Tmp.split('-').second; // Strip second component
941 static unsigned EatNumber(StringRef &Str) {
942 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
946 // Consume the leading digit.
947 Result = Result*10 + (Str[0] - '0');
951 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
956 static void parseVersionFromName(StringRef Name, unsigned &Major,
957 unsigned &Minor, unsigned &Micro) {
958 // Any unset version defaults to 0.
959 Major = Minor = Micro = 0;
961 // Parse up to three components.
962 unsigned *Components[3] = {&Major, &Minor, &Micro};
963 for (unsigned i = 0; i != 3; ++i) {
964 if (Name.empty() || Name[0] < '0' || Name[0] > '9')
967 // Consume the leading number.
968 *Components[i] = EatNumber(Name);
970 // Consume the separator, if present.
971 if (Name.startswith("."))
972 Name = Name.substr(1);
976 void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor,
977 unsigned &Micro) const {
978 StringRef EnvironmentName = getEnvironmentName();
979 StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
980 if (EnvironmentName.startswith(EnvironmentTypeName))
981 EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size());
983 parseVersionFromName(EnvironmentName, Major, Minor, Micro);
986 void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
987 unsigned &Micro) const {
988 StringRef OSName = getOSName();
989 // Assume that the OS portion of the triple starts with the canonical name.
990 StringRef OSTypeName = getOSTypeName(getOS());
991 if (OSName.startswith(OSTypeName))
992 OSName = OSName.substr(OSTypeName.size());
993 else if (getOS() == MacOSX)
994 OSName.consume_front("macos");
996 parseVersionFromName(OSName, Major, Minor, Micro);
999 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
1000 unsigned &Micro) const {
1001 getOSVersion(Major, Minor, Micro);
1004 default: llvm_unreachable("unexpected OS for Darwin triple");
1006 // Default to darwin8, i.e., MacOSX 10.4.
1009 // Darwin version numbers are skewed from OS X versions.
1028 // Ignore the version from the triple. This is only handled because the
1029 // the clang driver combines OS X and IOS support into a common Darwin
1030 // toolchain that wants to know the OS X version number even when targeting
1040 void Triple::getiOSVersion(unsigned &Major, unsigned &Minor,
1041 unsigned &Micro) const {
1043 default: llvm_unreachable("unexpected OS for Darwin triple");
1046 // Ignore the version from the triple. This is only handled because the
1047 // the clang driver combines OS X and IOS support into a common Darwin
1048 // toolchain that wants to know the iOS version number even when targeting
1056 getOSVersion(Major, Minor, Micro);
1057 // Default to 5.0 (or 7.0 for arm64).
1059 Major = (getArch() == aarch64) ? 7 : 5;
1062 llvm_unreachable("conflicting triple info");
1066 void Triple::getWatchOSVersion(unsigned &Major, unsigned &Minor,
1067 unsigned &Micro) const {
1069 default: llvm_unreachable("unexpected OS for Darwin triple");
1072 // Ignore the version from the triple. This is only handled because the
1073 // the clang driver combines OS X and IOS support into a common Darwin
1074 // toolchain that wants to know the iOS version number even when targeting
1081 getOSVersion(Major, Minor, Micro);
1086 llvm_unreachable("conflicting triple info");
1090 void Triple::setTriple(const Twine &Str) {
1091 *this = Triple(Str);
1094 void Triple::setArch(ArchType Kind) {
1095 setArchName(getArchTypeName(Kind));
1098 void Triple::setVendor(VendorType Kind) {
1099 setVendorName(getVendorTypeName(Kind));
1102 void Triple::setOS(OSType Kind) {
1103 setOSName(getOSTypeName(Kind));
1106 void Triple::setEnvironment(EnvironmentType Kind) {
1107 if (ObjectFormat == getDefaultFormat(*this))
1108 return setEnvironmentName(getEnvironmentTypeName(Kind));
1110 setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") +
1111 getObjectFormatTypeName(ObjectFormat)).str());
1114 void Triple::setObjectFormat(ObjectFormatType Kind) {
1115 if (Environment == UnknownEnvironment)
1116 return setEnvironmentName(getObjectFormatTypeName(Kind));
1118 setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +
1119 getObjectFormatTypeName(Kind)).str());
1122 void Triple::setArchName(StringRef Str) {
1123 // Work around a miscompilation bug for Twines in gcc 4.0.3.
1124 SmallString<64> Triple;
1127 Triple += getVendorName();
1129 Triple += getOSAndEnvironmentName();
1133 void Triple::setVendorName(StringRef Str) {
1134 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
1137 void Triple::setOSName(StringRef Str) {
1138 if (hasEnvironment())
1139 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
1140 "-" + getEnvironmentName());
1142 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1145 void Triple::setEnvironmentName(StringRef Str) {
1146 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
1150 void Triple::setOSAndEnvironmentName(StringRef Str) {
1151 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1154 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
1156 case llvm::Triple::UnknownArch:
1159 case llvm::Triple::avr:
1160 case llvm::Triple::msp430:
1163 case llvm::Triple::arm:
1164 case llvm::Triple::armeb:
1165 case llvm::Triple::hexagon:
1166 case llvm::Triple::le32:
1167 case llvm::Triple::mips:
1168 case llvm::Triple::mipsel:
1169 case llvm::Triple::nios2:
1170 case llvm::Triple::nvptx:
1171 case llvm::Triple::ppc:
1172 case llvm::Triple::r600:
1173 case llvm::Triple::riscv32:
1174 case llvm::Triple::sparc:
1175 case llvm::Triple::sparcel:
1176 case llvm::Triple::tce:
1177 case llvm::Triple::tcele:
1178 case llvm::Triple::thumb:
1179 case llvm::Triple::thumbeb:
1180 case llvm::Triple::x86:
1181 case llvm::Triple::xcore:
1182 case llvm::Triple::amdil:
1183 case llvm::Triple::hsail:
1184 case llvm::Triple::spir:
1185 case llvm::Triple::kalimba:
1186 case llvm::Triple::lanai:
1187 case llvm::Triple::shave:
1188 case llvm::Triple::wasm32:
1189 case llvm::Triple::renderscript32:
1192 case llvm::Triple::aarch64:
1193 case llvm::Triple::aarch64_be:
1194 case llvm::Triple::amdgcn:
1195 case llvm::Triple::bpfel:
1196 case llvm::Triple::bpfeb:
1197 case llvm::Triple::le64:
1198 case llvm::Triple::mips64:
1199 case llvm::Triple::mips64el:
1200 case llvm::Triple::nvptx64:
1201 case llvm::Triple::ppc64:
1202 case llvm::Triple::ppc64le:
1203 case llvm::Triple::riscv64:
1204 case llvm::Triple::sparcv9:
1205 case llvm::Triple::systemz:
1206 case llvm::Triple::x86_64:
1207 case llvm::Triple::amdil64:
1208 case llvm::Triple::hsail64:
1209 case llvm::Triple::spir64:
1210 case llvm::Triple::wasm64:
1211 case llvm::Triple::renderscript64:
1214 llvm_unreachable("Invalid architecture value");
1217 bool Triple::isArch64Bit() const {
1218 return getArchPointerBitWidth(getArch()) == 64;
1221 bool Triple::isArch32Bit() const {
1222 return getArchPointerBitWidth(getArch()) == 32;
1225 bool Triple::isArch16Bit() const {
1226 return getArchPointerBitWidth(getArch()) == 16;
1229 Triple Triple::get32BitArchVariant() const {
1231 switch (getArch()) {
1232 case Triple::UnknownArch:
1233 case Triple::amdgcn:
1237 case Triple::msp430:
1238 case Triple::systemz:
1239 case Triple::ppc64le:
1240 T.setArch(UnknownArch);
1248 case Triple::hexagon:
1249 case Triple::kalimba:
1252 case Triple::mipsel:
1257 case Triple::riscv32:
1259 case Triple::sparcel:
1263 case Triple::thumbeb:
1268 case Triple::wasm32:
1269 case Triple::renderscript32:
1273 case Triple::aarch64: T.setArch(Triple::arm); break;
1274 case Triple::aarch64_be: T.setArch(Triple::armeb); break;
1275 case Triple::le64: T.setArch(Triple::le32); break;
1276 case Triple::mips64: T.setArch(Triple::mips); break;
1277 case Triple::mips64el: T.setArch(Triple::mipsel); break;
1278 case Triple::nvptx64: T.setArch(Triple::nvptx); break;
1279 case Triple::ppc64: T.setArch(Triple::ppc); break;
1280 case Triple::sparcv9: T.setArch(Triple::sparc); break;
1281 case Triple::riscv64: T.setArch(Triple::riscv32); break;
1282 case Triple::x86_64: T.setArch(Triple::x86); break;
1283 case Triple::amdil64: T.setArch(Triple::amdil); break;
1284 case Triple::hsail64: T.setArch(Triple::hsail); break;
1285 case Triple::spir64: T.setArch(Triple::spir); break;
1286 case Triple::wasm64: T.setArch(Triple::wasm32); break;
1287 case Triple::renderscript64: T.setArch(Triple::renderscript32); break;
1292 Triple Triple::get64BitArchVariant() const {
1294 switch (getArch()) {
1295 case Triple::UnknownArch:
1297 case Triple::hexagon:
1298 case Triple::kalimba:
1300 case Triple::msp430:
1306 case Triple::sparcel:
1308 T.setArch(UnknownArch);
1311 case Triple::aarch64:
1312 case Triple::aarch64_be:
1316 case Triple::amdil64:
1317 case Triple::amdgcn:
1318 case Triple::hsail64:
1319 case Triple::spir64:
1320 case Triple::mips64:
1321 case Triple::mips64el:
1322 case Triple::nvptx64:
1324 case Triple::ppc64le:
1325 case Triple::riscv64:
1326 case Triple::sparcv9:
1327 case Triple::systemz:
1328 case Triple::x86_64:
1329 case Triple::wasm64:
1330 case Triple::renderscript64:
1334 case Triple::arm: T.setArch(Triple::aarch64); break;
1335 case Triple::armeb: T.setArch(Triple::aarch64_be); break;
1336 case Triple::le32: T.setArch(Triple::le64); break;
1337 case Triple::mips: T.setArch(Triple::mips64); break;
1338 case Triple::mipsel: T.setArch(Triple::mips64el); break;
1339 case Triple::nvptx: T.setArch(Triple::nvptx64); break;
1340 case Triple::ppc: T.setArch(Triple::ppc64); break;
1341 case Triple::sparc: T.setArch(Triple::sparcv9); break;
1342 case Triple::riscv32: T.setArch(Triple::riscv64); break;
1343 case Triple::x86: T.setArch(Triple::x86_64); break;
1344 case Triple::amdil: T.setArch(Triple::amdil64); break;
1345 case Triple::hsail: T.setArch(Triple::hsail64); break;
1346 case Triple::spir: T.setArch(Triple::spir64); break;
1347 case Triple::thumb: T.setArch(Triple::aarch64); break;
1348 case Triple::thumbeb: T.setArch(Triple::aarch64_be); break;
1349 case Triple::wasm32: T.setArch(Triple::wasm64); break;
1350 case Triple::renderscript32: T.setArch(Triple::renderscript64); break;
1355 Triple Triple::getBigEndianArchVariant() const {
1357 // Already big endian.
1358 if (!isLittleEndian())
1360 switch (getArch()) {
1361 case Triple::UnknownArch:
1362 case Triple::amdgcn:
1363 case Triple::amdil64:
1366 case Triple::hexagon:
1367 case Triple::hsail64:
1369 case Triple::kalimba:
1372 case Triple::msp430:
1374 case Triple::nvptx64:
1377 case Triple::riscv32:
1378 case Triple::riscv64:
1380 case Triple::spir64:
1382 case Triple::wasm32:
1383 case Triple::wasm64:
1385 case Triple::x86_64:
1387 case Triple::renderscript32:
1388 case Triple::renderscript64:
1390 // ARM is intentionally unsupported here, changing the architecture would
1391 // drop any arch suffixes.
1394 T.setArch(UnknownArch);
1397 case Triple::tcele: T.setArch(Triple::tce); break;
1398 case Triple::aarch64: T.setArch(Triple::aarch64_be); break;
1399 case Triple::bpfel: T.setArch(Triple::bpfeb); break;
1400 case Triple::mips64el:T.setArch(Triple::mips64); break;
1401 case Triple::mipsel: T.setArch(Triple::mips); break;
1402 case Triple::ppc64le: T.setArch(Triple::ppc64); break;
1403 case Triple::sparcel: T.setArch(Triple::sparc); break;
1405 llvm_unreachable("getBigEndianArchVariant: unknown triple.");
1410 Triple Triple::getLittleEndianArchVariant() const {
1412 if (isLittleEndian())
1415 switch (getArch()) {
1416 case Triple::UnknownArch:
1419 case Triple::sparcv9:
1420 case Triple::systemz:
1422 // ARM is intentionally unsupported here, changing the architecture would
1423 // drop any arch suffixes.
1425 case Triple::thumbeb:
1426 T.setArch(UnknownArch);
1429 case Triple::tce: T.setArch(Triple::tcele); break;
1430 case Triple::aarch64_be: T.setArch(Triple::aarch64); break;
1431 case Triple::bpfeb: T.setArch(Triple::bpfel); break;
1432 case Triple::mips64: T.setArch(Triple::mips64el); break;
1433 case Triple::mips: T.setArch(Triple::mipsel); break;
1434 case Triple::ppc64: T.setArch(Triple::ppc64le); break;
1435 case Triple::sparc: T.setArch(Triple::sparcel); break;
1437 llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
1442 bool Triple::isLittleEndian() const {
1443 switch (getArch()) {
1444 case Triple::aarch64:
1445 case Triple::amdgcn:
1446 case Triple::amdil64:
1451 case Triple::hexagon:
1452 case Triple::hsail64:
1454 case Triple::kalimba:
1457 case Triple::mips64el:
1458 case Triple::mipsel:
1459 case Triple::msp430:
1461 case Triple::nvptx64:
1463 case Triple::ppc64le:
1465 case Triple::riscv32:
1466 case Triple::riscv64:
1468 case Triple::sparcel:
1469 case Triple::spir64:
1472 case Triple::wasm32:
1473 case Triple::wasm64:
1475 case Triple::x86_64:
1478 case Triple::renderscript32:
1479 case Triple::renderscript64:
1486 bool Triple::isCompatibleWith(const Triple &Other) const {
1487 // If vendor is apple, ignore the version number.
1488 if (getVendor() == Triple::Apple)
1489 return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
1490 getVendor() == Other.getVendor() && getOS() == Other.getOS();
1492 return *this == Other;
1495 std::string Triple::merge(const Triple &Other) const {
1496 // If vendor is apple, pick the triple with the larger version number.
1497 if (getVendor() == Triple::Apple)
1498 if (Other.isOSVersionLT(*this))
1504 StringRef Triple::getARMCPUForArch(StringRef MArch) const {
1506 MArch = getArchName();
1507 MArch = ARM::getCanonicalArchName(MArch);
1509 // Some defaults are forced.
1511 case llvm::Triple::FreeBSD:
1512 case llvm::Triple::NetBSD:
1513 if (!MArch.empty() && MArch == "v6")
1514 return "arm1176jzf-s";
1516 case llvm::Triple::Win32:
1517 // FIXME: this is invalid for WindowsCE
1519 case llvm::Triple::MacOSX:
1520 case llvm::Triple::IOS:
1521 case llvm::Triple::WatchOS:
1522 case llvm::Triple::TvOS:
1533 StringRef CPU = ARM::getDefaultCPU(MArch);
1537 // If no specific architecture version is requested, return the minimum CPU
1538 // required by the OS and environment.
1540 case llvm::Triple::NetBSD:
1541 switch (getEnvironment()) {
1542 case llvm::Triple::GNUEABIHF:
1543 case llvm::Triple::GNUEABI:
1544 case llvm::Triple::EABIHF:
1545 case llvm::Triple::EABI:
1546 return "arm926ej-s";
1550 case llvm::Triple::NaCl:
1551 case llvm::Triple::OpenBSD:
1554 switch (getEnvironment()) {
1555 case llvm::Triple::EABIHF:
1556 case llvm::Triple::GNUEABIHF:
1557 case llvm::Triple::MuslEABIHF:
1558 return "arm1176jzf-s";
1564 llvm_unreachable("invalid arch name");