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 // SUSE uses "gnueabi" to mean "gnueabihf"
881 if (Vendor == Triple::SUSE && Environment == llvm::Triple::GNUEABI)
882 Components[3] = "gnueabihf";
884 if (OS == Triple::Win32) {
885 Components.resize(4);
886 Components[2] = "windows";
887 if (Environment == UnknownEnvironment) {
888 if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)
889 Components[3] = "msvc";
891 Components[3] = getObjectFormatTypeName(ObjectFormat);
893 } else if (IsMinGW32) {
894 Components.resize(4);
895 Components[2] = "windows";
896 Components[3] = "gnu";
897 } else if (IsCygwin) {
898 Components.resize(4);
899 Components[2] = "windows";
900 Components[3] = "cygnus";
902 if (IsMinGW32 || IsCygwin ||
903 (OS == Triple::Win32 && Environment != UnknownEnvironment)) {
904 if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {
905 Components.resize(5);
906 Components[4] = getObjectFormatTypeName(ObjectFormat);
910 // Stick the corrected components back together to form the normalized string.
911 std::string Normalized;
912 for (unsigned i = 0, e = Components.size(); i != e; ++i) {
913 if (i) Normalized += '-';
914 Normalized += Components[i];
919 StringRef Triple::getArchName() const {
920 return StringRef(Data).split('-').first; // Isolate first component
923 StringRef Triple::getVendorName() const {
924 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
925 return Tmp.split('-').first; // Isolate second component
928 StringRef Triple::getOSName() const {
929 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
930 Tmp = Tmp.split('-').second; // Strip second component
931 return Tmp.split('-').first; // Isolate third component
934 StringRef Triple::getEnvironmentName() const {
935 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
936 Tmp = Tmp.split('-').second; // Strip second component
937 return Tmp.split('-').second; // Strip third component
940 StringRef Triple::getOSAndEnvironmentName() const {
941 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
942 return Tmp.split('-').second; // Strip second component
945 static unsigned EatNumber(StringRef &Str) {
946 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
950 // Consume the leading digit.
951 Result = Result*10 + (Str[0] - '0');
955 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
960 static void parseVersionFromName(StringRef Name, unsigned &Major,
961 unsigned &Minor, unsigned &Micro) {
962 // Any unset version defaults to 0.
963 Major = Minor = Micro = 0;
965 // Parse up to three components.
966 unsigned *Components[3] = {&Major, &Minor, &Micro};
967 for (unsigned i = 0; i != 3; ++i) {
968 if (Name.empty() || Name[0] < '0' || Name[0] > '9')
971 // Consume the leading number.
972 *Components[i] = EatNumber(Name);
974 // Consume the separator, if present.
975 if (Name.startswith("."))
976 Name = Name.substr(1);
980 void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor,
981 unsigned &Micro) const {
982 StringRef EnvironmentName = getEnvironmentName();
983 StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
984 if (EnvironmentName.startswith(EnvironmentTypeName))
985 EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size());
987 parseVersionFromName(EnvironmentName, Major, Minor, Micro);
990 void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
991 unsigned &Micro) const {
992 StringRef OSName = getOSName();
993 // Assume that the OS portion of the triple starts with the canonical name.
994 StringRef OSTypeName = getOSTypeName(getOS());
995 if (OSName.startswith(OSTypeName))
996 OSName = OSName.substr(OSTypeName.size());
997 else if (getOS() == MacOSX)
998 OSName.consume_front("macos");
1000 parseVersionFromName(OSName, Major, Minor, Micro);
1003 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
1004 unsigned &Micro) const {
1005 getOSVersion(Major, Minor, Micro);
1008 default: llvm_unreachable("unexpected OS for Darwin triple");
1010 // Default to darwin8, i.e., MacOSX 10.4.
1013 // Darwin version numbers are skewed from OS X versions.
1032 // Ignore the version from the triple. This is only handled because the
1033 // the clang driver combines OS X and IOS support into a common Darwin
1034 // toolchain that wants to know the OS X version number even when targeting
1044 void Triple::getiOSVersion(unsigned &Major, unsigned &Minor,
1045 unsigned &Micro) const {
1047 default: llvm_unreachable("unexpected OS for Darwin triple");
1050 // Ignore the version from the triple. This is only handled because the
1051 // the clang driver combines OS X and IOS support into a common Darwin
1052 // toolchain that wants to know the iOS version number even when targeting
1060 getOSVersion(Major, Minor, Micro);
1061 // Default to 5.0 (or 7.0 for arm64).
1063 Major = (getArch() == aarch64) ? 7 : 5;
1066 llvm_unreachable("conflicting triple info");
1070 void Triple::getWatchOSVersion(unsigned &Major, unsigned &Minor,
1071 unsigned &Micro) const {
1073 default: llvm_unreachable("unexpected OS for Darwin triple");
1076 // Ignore the version from the triple. This is only handled because the
1077 // the clang driver combines OS X and IOS support into a common Darwin
1078 // toolchain that wants to know the iOS version number even when targeting
1085 getOSVersion(Major, Minor, Micro);
1090 llvm_unreachable("conflicting triple info");
1094 void Triple::setTriple(const Twine &Str) {
1095 *this = Triple(Str);
1098 void Triple::setArch(ArchType Kind) {
1099 setArchName(getArchTypeName(Kind));
1102 void Triple::setVendor(VendorType Kind) {
1103 setVendorName(getVendorTypeName(Kind));
1106 void Triple::setOS(OSType Kind) {
1107 setOSName(getOSTypeName(Kind));
1110 void Triple::setEnvironment(EnvironmentType Kind) {
1111 if (ObjectFormat == getDefaultFormat(*this))
1112 return setEnvironmentName(getEnvironmentTypeName(Kind));
1114 setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") +
1115 getObjectFormatTypeName(ObjectFormat)).str());
1118 void Triple::setObjectFormat(ObjectFormatType Kind) {
1119 if (Environment == UnknownEnvironment)
1120 return setEnvironmentName(getObjectFormatTypeName(Kind));
1122 setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +
1123 getObjectFormatTypeName(Kind)).str());
1126 void Triple::setArchName(StringRef Str) {
1127 // Work around a miscompilation bug for Twines in gcc 4.0.3.
1128 SmallString<64> Triple;
1131 Triple += getVendorName();
1133 Triple += getOSAndEnvironmentName();
1137 void Triple::setVendorName(StringRef Str) {
1138 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
1141 void Triple::setOSName(StringRef Str) {
1142 if (hasEnvironment())
1143 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
1144 "-" + getEnvironmentName());
1146 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1149 void Triple::setEnvironmentName(StringRef Str) {
1150 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
1154 void Triple::setOSAndEnvironmentName(StringRef Str) {
1155 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1158 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
1160 case llvm::Triple::UnknownArch:
1163 case llvm::Triple::avr:
1164 case llvm::Triple::msp430:
1167 case llvm::Triple::arm:
1168 case llvm::Triple::armeb:
1169 case llvm::Triple::hexagon:
1170 case llvm::Triple::le32:
1171 case llvm::Triple::mips:
1172 case llvm::Triple::mipsel:
1173 case llvm::Triple::nios2:
1174 case llvm::Triple::nvptx:
1175 case llvm::Triple::ppc:
1176 case llvm::Triple::r600:
1177 case llvm::Triple::riscv32:
1178 case llvm::Triple::sparc:
1179 case llvm::Triple::sparcel:
1180 case llvm::Triple::tce:
1181 case llvm::Triple::tcele:
1182 case llvm::Triple::thumb:
1183 case llvm::Triple::thumbeb:
1184 case llvm::Triple::x86:
1185 case llvm::Triple::xcore:
1186 case llvm::Triple::amdil:
1187 case llvm::Triple::hsail:
1188 case llvm::Triple::spir:
1189 case llvm::Triple::kalimba:
1190 case llvm::Triple::lanai:
1191 case llvm::Triple::shave:
1192 case llvm::Triple::wasm32:
1193 case llvm::Triple::renderscript32:
1196 case llvm::Triple::aarch64:
1197 case llvm::Triple::aarch64_be:
1198 case llvm::Triple::amdgcn:
1199 case llvm::Triple::bpfel:
1200 case llvm::Triple::bpfeb:
1201 case llvm::Triple::le64:
1202 case llvm::Triple::mips64:
1203 case llvm::Triple::mips64el:
1204 case llvm::Triple::nvptx64:
1205 case llvm::Triple::ppc64:
1206 case llvm::Triple::ppc64le:
1207 case llvm::Triple::riscv64:
1208 case llvm::Triple::sparcv9:
1209 case llvm::Triple::systemz:
1210 case llvm::Triple::x86_64:
1211 case llvm::Triple::amdil64:
1212 case llvm::Triple::hsail64:
1213 case llvm::Triple::spir64:
1214 case llvm::Triple::wasm64:
1215 case llvm::Triple::renderscript64:
1218 llvm_unreachable("Invalid architecture value");
1221 bool Triple::isArch64Bit() const {
1222 return getArchPointerBitWidth(getArch()) == 64;
1225 bool Triple::isArch32Bit() const {
1226 return getArchPointerBitWidth(getArch()) == 32;
1229 bool Triple::isArch16Bit() const {
1230 return getArchPointerBitWidth(getArch()) == 16;
1233 Triple Triple::get32BitArchVariant() const {
1235 switch (getArch()) {
1236 case Triple::UnknownArch:
1237 case Triple::amdgcn:
1241 case Triple::msp430:
1242 case Triple::systemz:
1243 case Triple::ppc64le:
1244 T.setArch(UnknownArch);
1252 case Triple::hexagon:
1253 case Triple::kalimba:
1256 case Triple::mipsel:
1261 case Triple::riscv32:
1263 case Triple::sparcel:
1267 case Triple::thumbeb:
1272 case Triple::wasm32:
1273 case Triple::renderscript32:
1277 case Triple::aarch64: T.setArch(Triple::arm); break;
1278 case Triple::aarch64_be: T.setArch(Triple::armeb); break;
1279 case Triple::le64: T.setArch(Triple::le32); break;
1280 case Triple::mips64: T.setArch(Triple::mips); break;
1281 case Triple::mips64el: T.setArch(Triple::mipsel); break;
1282 case Triple::nvptx64: T.setArch(Triple::nvptx); break;
1283 case Triple::ppc64: T.setArch(Triple::ppc); break;
1284 case Triple::sparcv9: T.setArch(Triple::sparc); break;
1285 case Triple::riscv64: T.setArch(Triple::riscv32); break;
1286 case Triple::x86_64: T.setArch(Triple::x86); break;
1287 case Triple::amdil64: T.setArch(Triple::amdil); break;
1288 case Triple::hsail64: T.setArch(Triple::hsail); break;
1289 case Triple::spir64: T.setArch(Triple::spir); break;
1290 case Triple::wasm64: T.setArch(Triple::wasm32); break;
1291 case Triple::renderscript64: T.setArch(Triple::renderscript32); break;
1296 Triple Triple::get64BitArchVariant() const {
1298 switch (getArch()) {
1299 case Triple::UnknownArch:
1301 case Triple::hexagon:
1302 case Triple::kalimba:
1304 case Triple::msp430:
1310 case Triple::sparcel:
1312 T.setArch(UnknownArch);
1315 case Triple::aarch64:
1316 case Triple::aarch64_be:
1320 case Triple::amdil64:
1321 case Triple::amdgcn:
1322 case Triple::hsail64:
1323 case Triple::spir64:
1324 case Triple::mips64:
1325 case Triple::mips64el:
1326 case Triple::nvptx64:
1328 case Triple::ppc64le:
1329 case Triple::riscv64:
1330 case Triple::sparcv9:
1331 case Triple::systemz:
1332 case Triple::x86_64:
1333 case Triple::wasm64:
1334 case Triple::renderscript64:
1338 case Triple::arm: T.setArch(Triple::aarch64); break;
1339 case Triple::armeb: T.setArch(Triple::aarch64_be); break;
1340 case Triple::le32: T.setArch(Triple::le64); break;
1341 case Triple::mips: T.setArch(Triple::mips64); break;
1342 case Triple::mipsel: T.setArch(Triple::mips64el); break;
1343 case Triple::nvptx: T.setArch(Triple::nvptx64); break;
1344 case Triple::ppc: T.setArch(Triple::ppc64); break;
1345 case Triple::sparc: T.setArch(Triple::sparcv9); break;
1346 case Triple::riscv32: T.setArch(Triple::riscv64); break;
1347 case Triple::x86: T.setArch(Triple::x86_64); break;
1348 case Triple::amdil: T.setArch(Triple::amdil64); break;
1349 case Triple::hsail: T.setArch(Triple::hsail64); break;
1350 case Triple::spir: T.setArch(Triple::spir64); break;
1351 case Triple::thumb: T.setArch(Triple::aarch64); break;
1352 case Triple::thumbeb: T.setArch(Triple::aarch64_be); break;
1353 case Triple::wasm32: T.setArch(Triple::wasm64); break;
1354 case Triple::renderscript32: T.setArch(Triple::renderscript64); break;
1359 Triple Triple::getBigEndianArchVariant() const {
1361 // Already big endian.
1362 if (!isLittleEndian())
1364 switch (getArch()) {
1365 case Triple::UnknownArch:
1366 case Triple::amdgcn:
1367 case Triple::amdil64:
1370 case Triple::hexagon:
1371 case Triple::hsail64:
1373 case Triple::kalimba:
1376 case Triple::msp430:
1378 case Triple::nvptx64:
1381 case Triple::riscv32:
1382 case Triple::riscv64:
1384 case Triple::spir64:
1386 case Triple::wasm32:
1387 case Triple::wasm64:
1389 case Triple::x86_64:
1391 case Triple::renderscript32:
1392 case Triple::renderscript64:
1394 // ARM is intentionally unsupported here, changing the architecture would
1395 // drop any arch suffixes.
1398 T.setArch(UnknownArch);
1401 case Triple::tcele: T.setArch(Triple::tce); break;
1402 case Triple::aarch64: T.setArch(Triple::aarch64_be); break;
1403 case Triple::bpfel: T.setArch(Triple::bpfeb); break;
1404 case Triple::mips64el:T.setArch(Triple::mips64); break;
1405 case Triple::mipsel: T.setArch(Triple::mips); break;
1406 case Triple::ppc64le: T.setArch(Triple::ppc64); break;
1407 case Triple::sparcel: T.setArch(Triple::sparc); break;
1409 llvm_unreachable("getBigEndianArchVariant: unknown triple.");
1414 Triple Triple::getLittleEndianArchVariant() const {
1416 if (isLittleEndian())
1419 switch (getArch()) {
1420 case Triple::UnknownArch:
1423 case Triple::sparcv9:
1424 case Triple::systemz:
1426 // ARM is intentionally unsupported here, changing the architecture would
1427 // drop any arch suffixes.
1429 case Triple::thumbeb:
1430 T.setArch(UnknownArch);
1433 case Triple::tce: T.setArch(Triple::tcele); break;
1434 case Triple::aarch64_be: T.setArch(Triple::aarch64); break;
1435 case Triple::bpfeb: T.setArch(Triple::bpfel); break;
1436 case Triple::mips64: T.setArch(Triple::mips64el); break;
1437 case Triple::mips: T.setArch(Triple::mipsel); break;
1438 case Triple::ppc64: T.setArch(Triple::ppc64le); break;
1439 case Triple::sparc: T.setArch(Triple::sparcel); break;
1441 llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
1446 bool Triple::isLittleEndian() const {
1447 switch (getArch()) {
1448 case Triple::aarch64:
1449 case Triple::amdgcn:
1450 case Triple::amdil64:
1455 case Triple::hexagon:
1456 case Triple::hsail64:
1458 case Triple::kalimba:
1461 case Triple::mips64el:
1462 case Triple::mipsel:
1463 case Triple::msp430:
1465 case Triple::nvptx64:
1467 case Triple::ppc64le:
1469 case Triple::riscv32:
1470 case Triple::riscv64:
1472 case Triple::sparcel:
1473 case Triple::spir64:
1476 case Triple::wasm32:
1477 case Triple::wasm64:
1479 case Triple::x86_64:
1482 case Triple::renderscript32:
1483 case Triple::renderscript64:
1490 bool Triple::isCompatibleWith(const Triple &Other) const {
1491 // If vendor is apple, ignore the version number.
1492 if (getVendor() == Triple::Apple)
1493 return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
1494 getVendor() == Other.getVendor() && getOS() == Other.getOS();
1496 return *this == Other;
1499 std::string Triple::merge(const Triple &Other) const {
1500 // If vendor is apple, pick the triple with the larger version number.
1501 if (getVendor() == Triple::Apple)
1502 if (Other.isOSVersionLT(*this))
1508 StringRef Triple::getARMCPUForArch(StringRef MArch) const {
1510 MArch = getArchName();
1511 MArch = ARM::getCanonicalArchName(MArch);
1513 // Some defaults are forced.
1515 case llvm::Triple::FreeBSD:
1516 case llvm::Triple::NetBSD:
1517 if (!MArch.empty() && MArch == "v6")
1518 return "arm1176jzf-s";
1520 case llvm::Triple::Win32:
1521 // FIXME: this is invalid for WindowsCE
1523 case llvm::Triple::MacOSX:
1524 case llvm::Triple::IOS:
1525 case llvm::Triple::WatchOS:
1526 case llvm::Triple::TvOS:
1537 StringRef CPU = ARM::getDefaultCPU(MArch);
1541 // If no specific architecture version is requested, return the minimum CPU
1542 // required by the OS and environment.
1544 case llvm::Triple::NetBSD:
1545 switch (getEnvironment()) {
1546 case llvm::Triple::GNUEABIHF:
1547 case llvm::Triple::GNUEABI:
1548 case llvm::Triple::EABIHF:
1549 case llvm::Triple::EABI:
1550 return "arm926ej-s";
1554 case llvm::Triple::NaCl:
1555 case llvm::Triple::OpenBSD:
1558 switch (getEnvironment()) {
1559 case llvm::Triple::EABIHF:
1560 case llvm::Triple::GNUEABIHF:
1561 case llvm::Triple::MuslEABIHF:
1562 return "arm1176jzf-s";
1568 llvm_unreachable("invalid arch name");