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:
662 return Triple::MachO;
665 llvm_unreachable("unknown architecture");
668 /// \brief Construct a triple from the string representation provided.
670 /// This stores the string representation and parses the various pieces into
672 Triple::Triple(const Twine &Str)
673 : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch),
674 Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment),
675 ObjectFormat(UnknownObjectFormat) {
676 // Do minimal parsing by hand here.
677 SmallVector<StringRef, 4> Components;
678 StringRef(Data).split(Components, '-', /*MaxSplit*/ 3);
679 if (Components.size() > 0) {
680 Arch = parseArch(Components[0]);
681 SubArch = parseSubArch(Components[0]);
682 if (Components.size() > 1) {
683 Vendor = parseVendor(Components[1]);
684 if (Components.size() > 2) {
685 OS = parseOS(Components[2]);
686 if (Components.size() > 3) {
687 Environment = parseEnvironment(Components[3]);
688 ObjectFormat = parseFormat(Components[3]);
693 if (ObjectFormat == UnknownObjectFormat)
694 ObjectFormat = getDefaultFormat(*this);
697 /// \brief Construct a triple from string representations of the architecture,
700 /// This joins each argument into a canonical string representation and parses
701 /// them into enum members. It leaves the environment unknown and omits it from
702 /// the string representation.
703 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
704 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
705 Arch(parseArch(ArchStr.str())),
706 SubArch(parseSubArch(ArchStr.str())),
707 Vendor(parseVendor(VendorStr.str())),
708 OS(parseOS(OSStr.str())),
709 Environment(), ObjectFormat(Triple::UnknownObjectFormat) {
710 ObjectFormat = getDefaultFormat(*this);
713 /// \brief Construct a triple from string representations of the architecture,
714 /// vendor, OS, and environment.
716 /// This joins each argument into a canonical string representation and parses
717 /// them into enum members.
718 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
719 const Twine &EnvironmentStr)
720 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
721 EnvironmentStr).str()),
722 Arch(parseArch(ArchStr.str())),
723 SubArch(parseSubArch(ArchStr.str())),
724 Vendor(parseVendor(VendorStr.str())),
725 OS(parseOS(OSStr.str())),
726 Environment(parseEnvironment(EnvironmentStr.str())),
727 ObjectFormat(parseFormat(EnvironmentStr.str())) {
728 if (ObjectFormat == Triple::UnknownObjectFormat)
729 ObjectFormat = getDefaultFormat(*this);
732 std::string Triple::normalize(StringRef Str) {
733 bool IsMinGW32 = false;
734 bool IsCygwin = false;
736 // Parse into components.
737 SmallVector<StringRef, 4> Components;
738 Str.split(Components, '-');
740 // If the first component corresponds to a known architecture, preferentially
741 // use it for the architecture. If the second component corresponds to a
742 // known vendor, preferentially use it for the vendor, etc. This avoids silly
743 // component movement when a component parses as (eg) both a valid arch and a
745 ArchType Arch = UnknownArch;
746 if (Components.size() > 0)
747 Arch = parseArch(Components[0]);
748 VendorType Vendor = UnknownVendor;
749 if (Components.size() > 1)
750 Vendor = parseVendor(Components[1]);
751 OSType OS = UnknownOS;
752 if (Components.size() > 2) {
753 OS = parseOS(Components[2]);
754 IsCygwin = Components[2].startswith("cygwin");
755 IsMinGW32 = Components[2].startswith("mingw");
757 EnvironmentType Environment = UnknownEnvironment;
758 if (Components.size() > 3)
759 Environment = parseEnvironment(Components[3]);
760 ObjectFormatType ObjectFormat = UnknownObjectFormat;
761 if (Components.size() > 4)
762 ObjectFormat = parseFormat(Components[4]);
764 // Note which components are already in their final position. These will not
767 Found[0] = Arch != UnknownArch;
768 Found[1] = Vendor != UnknownVendor;
769 Found[2] = OS != UnknownOS;
770 Found[3] = Environment != UnknownEnvironment;
772 // If they are not there already, permute the components into their canonical
773 // positions by seeing if they parse as a valid architecture, and if so moving
774 // the component to the architecture position etc.
775 for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
777 continue; // Already in the canonical position.
779 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
780 // Do not reparse any components that already matched.
781 if (Idx < array_lengthof(Found) && Found[Idx])
784 // Does this component parse as valid for the target position?
786 StringRef Comp = Components[Idx];
788 default: llvm_unreachable("unexpected component type!");
790 Arch = parseArch(Comp);
791 Valid = Arch != UnknownArch;
794 Vendor = parseVendor(Comp);
795 Valid = Vendor != UnknownVendor;
799 IsCygwin = Comp.startswith("cygwin");
800 IsMinGW32 = Comp.startswith("mingw");
801 Valid = OS != UnknownOS || IsCygwin || IsMinGW32;
804 Environment = parseEnvironment(Comp);
805 Valid = Environment != UnknownEnvironment;
807 ObjectFormat = parseFormat(Comp);
808 Valid = ObjectFormat != UnknownObjectFormat;
813 continue; // Nope, try the next component.
815 // Move the component to the target position, pushing any non-fixed
816 // components that are in the way to the right. This tends to give
817 // good results in the common cases of a forgotten vendor component
818 // or a wrongly positioned environment.
820 // Insert left, pushing the existing components to the right. For
821 // example, a-b-i386 -> i386-a-b when moving i386 to the front.
822 StringRef CurrentComponent(""); // The empty component.
823 // Replace the component we are moving with an empty component.
824 std::swap(CurrentComponent, Components[Idx]);
825 // Insert the component being moved at Pos, displacing any existing
826 // components to the right.
827 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
828 // Skip over any fixed components.
829 while (i < array_lengthof(Found) && Found[i])
831 // Place the component at the new position, getting the component
832 // that was at this position - it will be moved right.
833 std::swap(CurrentComponent, Components[i]);
835 } else if (Pos > Idx) {
836 // Push right by inserting empty components until the component at Idx
837 // reaches the target position Pos. For example, pc-a -> -pc-a when
838 // moving pc to the second position.
840 // Insert one empty component at Idx.
841 StringRef CurrentComponent(""); // The empty component.
842 for (unsigned i = Idx; i < Components.size();) {
843 // Place the component at the new position, getting the component
844 // that was at this position - it will be moved right.
845 std::swap(CurrentComponent, Components[i]);
846 // If it was placed on top of an empty component then we are done.
847 if (CurrentComponent.empty())
849 // Advance to the next component, skipping any fixed components.
850 while (++i < array_lengthof(Found) && Found[i])
853 // The last component was pushed off the end - append it.
854 if (!CurrentComponent.empty())
855 Components.push_back(CurrentComponent);
857 // Advance Idx to the component's new position.
858 while (++Idx < array_lengthof(Found) && Found[Idx])
860 } while (Idx < Pos); // Add more until the final position is reached.
862 assert(Pos < Components.size() && Components[Pos] == Comp &&
863 "Component moved wrong!");
869 // Special case logic goes here. At this point Arch, Vendor and OS have the
870 // correct values for the computed components.
871 std::string NormalizedEnvironment;
872 if (Environment == Triple::Android && Components[3].startswith("androideabi")) {
873 StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));
874 if (AndroidVersion.empty()) {
875 Components[3] = "android";
877 NormalizedEnvironment = Twine("android", AndroidVersion).str();
878 Components[3] = NormalizedEnvironment;
882 if (OS == Triple::Win32) {
883 Components.resize(4);
884 Components[2] = "windows";
885 if (Environment == UnknownEnvironment) {
886 if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)
887 Components[3] = "msvc";
889 Components[3] = getObjectFormatTypeName(ObjectFormat);
891 } else if (IsMinGW32) {
892 Components.resize(4);
893 Components[2] = "windows";
894 Components[3] = "gnu";
895 } else if (IsCygwin) {
896 Components.resize(4);
897 Components[2] = "windows";
898 Components[3] = "cygnus";
900 if (IsMinGW32 || IsCygwin ||
901 (OS == Triple::Win32 && Environment != UnknownEnvironment)) {
902 if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {
903 Components.resize(5);
904 Components[4] = getObjectFormatTypeName(ObjectFormat);
908 // Stick the corrected components back together to form the normalized string.
909 std::string Normalized;
910 for (unsigned i = 0, e = Components.size(); i != e; ++i) {
911 if (i) Normalized += '-';
912 Normalized += Components[i];
917 StringRef Triple::getArchName() const {
918 return StringRef(Data).split('-').first; // Isolate first component
921 StringRef Triple::getVendorName() const {
922 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
923 return Tmp.split('-').first; // Isolate second component
926 StringRef Triple::getOSName() const {
927 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
928 Tmp = Tmp.split('-').second; // Strip second component
929 return Tmp.split('-').first; // Isolate third component
932 StringRef Triple::getEnvironmentName() const {
933 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
934 Tmp = Tmp.split('-').second; // Strip second component
935 return Tmp.split('-').second; // Strip third component
938 StringRef Triple::getOSAndEnvironmentName() const {
939 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
940 return Tmp.split('-').second; // Strip second component
943 static unsigned EatNumber(StringRef &Str) {
944 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
948 // Consume the leading digit.
949 Result = Result*10 + (Str[0] - '0');
953 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
958 static void parseVersionFromName(StringRef Name, unsigned &Major,
959 unsigned &Minor, unsigned &Micro) {
960 // Any unset version defaults to 0.
961 Major = Minor = Micro = 0;
963 // Parse up to three components.
964 unsigned *Components[3] = {&Major, &Minor, &Micro};
965 for (unsigned i = 0; i != 3; ++i) {
966 if (Name.empty() || Name[0] < '0' || Name[0] > '9')
969 // Consume the leading number.
970 *Components[i] = EatNumber(Name);
972 // Consume the separator, if present.
973 if (Name.startswith("."))
974 Name = Name.substr(1);
978 void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor,
979 unsigned &Micro) const {
980 StringRef EnvironmentName = getEnvironmentName();
981 StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
982 if (EnvironmentName.startswith(EnvironmentTypeName))
983 EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size());
985 parseVersionFromName(EnvironmentName, Major, Minor, Micro);
988 void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
989 unsigned &Micro) const {
990 StringRef OSName = getOSName();
991 // Assume that the OS portion of the triple starts with the canonical name.
992 StringRef OSTypeName = getOSTypeName(getOS());
993 if (OSName.startswith(OSTypeName))
994 OSName = OSName.substr(OSTypeName.size());
995 else if (getOS() == MacOSX)
996 OSName.consume_front("macos");
998 parseVersionFromName(OSName, Major, Minor, Micro);
1001 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
1002 unsigned &Micro) const {
1003 getOSVersion(Major, Minor, Micro);
1006 default: llvm_unreachable("unexpected OS for Darwin triple");
1008 // Default to darwin8, i.e., MacOSX 10.4.
1011 // Darwin version numbers are skewed from OS X versions.
1030 // Ignore the version from the triple. This is only handled because the
1031 // the clang driver combines OS X and IOS support into a common Darwin
1032 // toolchain that wants to know the OS X version number even when targeting
1042 void Triple::getiOSVersion(unsigned &Major, unsigned &Minor,
1043 unsigned &Micro) const {
1045 default: llvm_unreachable("unexpected OS for Darwin triple");
1048 // Ignore the version from the triple. This is only handled because the
1049 // the clang driver combines OS X and IOS support into a common Darwin
1050 // toolchain that wants to know the iOS version number even when targeting
1058 getOSVersion(Major, Minor, Micro);
1059 // Default to 5.0 (or 7.0 for arm64).
1061 Major = (getArch() == aarch64) ? 7 : 5;
1064 llvm_unreachable("conflicting triple info");
1068 void Triple::getWatchOSVersion(unsigned &Major, unsigned &Minor,
1069 unsigned &Micro) const {
1071 default: llvm_unreachable("unexpected OS for Darwin triple");
1074 // Ignore the version from the triple. This is only handled because the
1075 // the clang driver combines OS X and IOS support into a common Darwin
1076 // toolchain that wants to know the iOS version number even when targeting
1083 getOSVersion(Major, Minor, Micro);
1088 llvm_unreachable("conflicting triple info");
1092 void Triple::setTriple(const Twine &Str) {
1093 *this = Triple(Str);
1096 void Triple::setArch(ArchType Kind) {
1097 setArchName(getArchTypeName(Kind));
1100 void Triple::setVendor(VendorType Kind) {
1101 setVendorName(getVendorTypeName(Kind));
1104 void Triple::setOS(OSType Kind) {
1105 setOSName(getOSTypeName(Kind));
1108 void Triple::setEnvironment(EnvironmentType Kind) {
1109 if (ObjectFormat == getDefaultFormat(*this))
1110 return setEnvironmentName(getEnvironmentTypeName(Kind));
1112 setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") +
1113 getObjectFormatTypeName(ObjectFormat)).str());
1116 void Triple::setObjectFormat(ObjectFormatType Kind) {
1117 if (Environment == UnknownEnvironment)
1118 return setEnvironmentName(getObjectFormatTypeName(Kind));
1120 setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +
1121 getObjectFormatTypeName(Kind)).str());
1124 void Triple::setArchName(StringRef Str) {
1125 // Work around a miscompilation bug for Twines in gcc 4.0.3.
1126 SmallString<64> Triple;
1129 Triple += getVendorName();
1131 Triple += getOSAndEnvironmentName();
1135 void Triple::setVendorName(StringRef Str) {
1136 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
1139 void Triple::setOSName(StringRef Str) {
1140 if (hasEnvironment())
1141 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
1142 "-" + getEnvironmentName());
1144 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1147 void Triple::setEnvironmentName(StringRef Str) {
1148 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
1152 void Triple::setOSAndEnvironmentName(StringRef Str) {
1153 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1156 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
1158 case llvm::Triple::UnknownArch:
1161 case llvm::Triple::avr:
1162 case llvm::Triple::msp430:
1165 case llvm::Triple::arm:
1166 case llvm::Triple::armeb:
1167 case llvm::Triple::hexagon:
1168 case llvm::Triple::le32:
1169 case llvm::Triple::mips:
1170 case llvm::Triple::mipsel:
1171 case llvm::Triple::nios2:
1172 case llvm::Triple::nvptx:
1173 case llvm::Triple::ppc:
1174 case llvm::Triple::r600:
1175 case llvm::Triple::riscv32:
1176 case llvm::Triple::sparc:
1177 case llvm::Triple::sparcel:
1178 case llvm::Triple::tce:
1179 case llvm::Triple::tcele:
1180 case llvm::Triple::thumb:
1181 case llvm::Triple::thumbeb:
1182 case llvm::Triple::x86:
1183 case llvm::Triple::xcore:
1184 case llvm::Triple::amdil:
1185 case llvm::Triple::hsail:
1186 case llvm::Triple::spir:
1187 case llvm::Triple::kalimba:
1188 case llvm::Triple::lanai:
1189 case llvm::Triple::shave:
1190 case llvm::Triple::wasm32:
1191 case llvm::Triple::renderscript32:
1194 case llvm::Triple::aarch64:
1195 case llvm::Triple::aarch64_be:
1196 case llvm::Triple::amdgcn:
1197 case llvm::Triple::bpfel:
1198 case llvm::Triple::bpfeb:
1199 case llvm::Triple::le64:
1200 case llvm::Triple::mips64:
1201 case llvm::Triple::mips64el:
1202 case llvm::Triple::nvptx64:
1203 case llvm::Triple::ppc64:
1204 case llvm::Triple::ppc64le:
1205 case llvm::Triple::riscv64:
1206 case llvm::Triple::sparcv9:
1207 case llvm::Triple::systemz:
1208 case llvm::Triple::x86_64:
1209 case llvm::Triple::amdil64:
1210 case llvm::Triple::hsail64:
1211 case llvm::Triple::spir64:
1212 case llvm::Triple::wasm64:
1213 case llvm::Triple::renderscript64:
1216 llvm_unreachable("Invalid architecture value");
1219 bool Triple::isArch64Bit() const {
1220 return getArchPointerBitWidth(getArch()) == 64;
1223 bool Triple::isArch32Bit() const {
1224 return getArchPointerBitWidth(getArch()) == 32;
1227 bool Triple::isArch16Bit() const {
1228 return getArchPointerBitWidth(getArch()) == 16;
1231 Triple Triple::get32BitArchVariant() const {
1233 switch (getArch()) {
1234 case Triple::UnknownArch:
1235 case Triple::amdgcn:
1239 case Triple::msp430:
1240 case Triple::systemz:
1241 case Triple::ppc64le:
1242 T.setArch(UnknownArch);
1250 case Triple::hexagon:
1251 case Triple::kalimba:
1254 case Triple::mipsel:
1259 case Triple::riscv32:
1261 case Triple::sparcel:
1265 case Triple::thumbeb:
1270 case Triple::wasm32:
1271 case Triple::renderscript32:
1275 case Triple::aarch64: T.setArch(Triple::arm); break;
1276 case Triple::aarch64_be: T.setArch(Triple::armeb); break;
1277 case Triple::le64: T.setArch(Triple::le32); break;
1278 case Triple::mips64: T.setArch(Triple::mips); break;
1279 case Triple::mips64el: T.setArch(Triple::mipsel); break;
1280 case Triple::nvptx64: T.setArch(Triple::nvptx); break;
1281 case Triple::ppc64: T.setArch(Triple::ppc); break;
1282 case Triple::sparcv9: T.setArch(Triple::sparc); break;
1283 case Triple::riscv64: T.setArch(Triple::riscv32); break;
1284 case Triple::x86_64: T.setArch(Triple::x86); break;
1285 case Triple::amdil64: T.setArch(Triple::amdil); break;
1286 case Triple::hsail64: T.setArch(Triple::hsail); break;
1287 case Triple::spir64: T.setArch(Triple::spir); break;
1288 case Triple::wasm64: T.setArch(Triple::wasm32); break;
1289 case Triple::renderscript64: T.setArch(Triple::renderscript32); break;
1294 Triple Triple::get64BitArchVariant() const {
1296 switch (getArch()) {
1297 case Triple::UnknownArch:
1299 case Triple::hexagon:
1300 case Triple::kalimba:
1302 case Triple::msp430:
1308 case Triple::sparcel:
1310 T.setArch(UnknownArch);
1313 case Triple::aarch64:
1314 case Triple::aarch64_be:
1318 case Triple::amdil64:
1319 case Triple::amdgcn:
1320 case Triple::hsail64:
1321 case Triple::spir64:
1322 case Triple::mips64:
1323 case Triple::mips64el:
1324 case Triple::nvptx64:
1326 case Triple::ppc64le:
1327 case Triple::riscv64:
1328 case Triple::sparcv9:
1329 case Triple::systemz:
1330 case Triple::x86_64:
1331 case Triple::wasm64:
1332 case Triple::renderscript64:
1336 case Triple::arm: T.setArch(Triple::aarch64); break;
1337 case Triple::armeb: T.setArch(Triple::aarch64_be); break;
1338 case Triple::le32: T.setArch(Triple::le64); break;
1339 case Triple::mips: T.setArch(Triple::mips64); break;
1340 case Triple::mipsel: T.setArch(Triple::mips64el); break;
1341 case Triple::nvptx: T.setArch(Triple::nvptx64); break;
1342 case Triple::ppc: T.setArch(Triple::ppc64); break;
1343 case Triple::sparc: T.setArch(Triple::sparcv9); break;
1344 case Triple::riscv32: T.setArch(Triple::riscv64); break;
1345 case Triple::x86: T.setArch(Triple::x86_64); break;
1346 case Triple::amdil: T.setArch(Triple::amdil64); break;
1347 case Triple::hsail: T.setArch(Triple::hsail64); break;
1348 case Triple::spir: T.setArch(Triple::spir64); break;
1349 case Triple::thumb: T.setArch(Triple::aarch64); break;
1350 case Triple::thumbeb: T.setArch(Triple::aarch64_be); break;
1351 case Triple::wasm32: T.setArch(Triple::wasm64); break;
1352 case Triple::renderscript32: T.setArch(Triple::renderscript64); break;
1357 Triple Triple::getBigEndianArchVariant() const {
1359 // Already big endian.
1360 if (!isLittleEndian())
1362 switch (getArch()) {
1363 case Triple::UnknownArch:
1364 case Triple::amdgcn:
1365 case Triple::amdil64:
1368 case Triple::hexagon:
1369 case Triple::hsail64:
1371 case Triple::kalimba:
1374 case Triple::msp430:
1376 case Triple::nvptx64:
1379 case Triple::riscv32:
1380 case Triple::riscv64:
1382 case Triple::spir64:
1384 case Triple::wasm32:
1385 case Triple::wasm64:
1387 case Triple::x86_64:
1389 case Triple::renderscript32:
1390 case Triple::renderscript64:
1392 // ARM is intentionally unsupported here, changing the architecture would
1393 // drop any arch suffixes.
1396 T.setArch(UnknownArch);
1399 case Triple::tcele: T.setArch(Triple::tce); break;
1400 case Triple::aarch64: T.setArch(Triple::aarch64_be); break;
1401 case Triple::bpfel: T.setArch(Triple::bpfeb); break;
1402 case Triple::mips64el:T.setArch(Triple::mips64); break;
1403 case Triple::mipsel: T.setArch(Triple::mips); break;
1404 case Triple::ppc64le: T.setArch(Triple::ppc64); break;
1405 case Triple::sparcel: T.setArch(Triple::sparc); break;
1407 llvm_unreachable("getBigEndianArchVariant: unknown triple.");
1412 Triple Triple::getLittleEndianArchVariant() const {
1414 if (isLittleEndian())
1417 switch (getArch()) {
1418 case Triple::UnknownArch:
1421 case Triple::sparcv9:
1422 case Triple::systemz:
1424 // ARM is intentionally unsupported here, changing the architecture would
1425 // drop any arch suffixes.
1427 case Triple::thumbeb:
1428 T.setArch(UnknownArch);
1431 case Triple::tce: T.setArch(Triple::tcele); break;
1432 case Triple::aarch64_be: T.setArch(Triple::aarch64); break;
1433 case Triple::bpfeb: T.setArch(Triple::bpfel); break;
1434 case Triple::mips64: T.setArch(Triple::mips64el); break;
1435 case Triple::mips: T.setArch(Triple::mipsel); break;
1436 case Triple::ppc64: T.setArch(Triple::ppc64le); break;
1437 case Triple::sparc: T.setArch(Triple::sparcel); break;
1439 llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
1444 bool Triple::isLittleEndian() const {
1445 switch (getArch()) {
1446 case Triple::aarch64:
1447 case Triple::amdgcn:
1448 case Triple::amdil64:
1453 case Triple::hexagon:
1454 case Triple::hsail64:
1456 case Triple::kalimba:
1459 case Triple::mips64el:
1460 case Triple::mipsel:
1461 case Triple::msp430:
1463 case Triple::nvptx64:
1465 case Triple::ppc64le:
1467 case Triple::riscv32:
1468 case Triple::riscv64:
1470 case Triple::sparcel:
1471 case Triple::spir64:
1474 case Triple::wasm32:
1475 case Triple::wasm64:
1477 case Triple::x86_64:
1480 case Triple::renderscript32:
1481 case Triple::renderscript64:
1488 bool Triple::isCompatibleWith(const Triple &Other) const {
1489 // If vendor is apple, ignore the version number.
1490 if (getVendor() == Triple::Apple)
1491 return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
1492 getVendor() == Other.getVendor() && getOS() == Other.getOS();
1494 return *this == Other;
1497 std::string Triple::merge(const Triple &Other) const {
1498 // If vendor is apple, pick the triple with the larger version number.
1499 if (getVendor() == Triple::Apple)
1500 if (Other.isOSVersionLT(*this))
1506 StringRef Triple::getARMCPUForArch(StringRef MArch) const {
1508 MArch = getArchName();
1509 MArch = ARM::getCanonicalArchName(MArch);
1511 // Some defaults are forced.
1513 case llvm::Triple::FreeBSD:
1514 case llvm::Triple::NetBSD:
1515 if (!MArch.empty() && MArch == "v6")
1516 return "arm1176jzf-s";
1518 case llvm::Triple::Win32:
1519 // FIXME: this is invalid for WindowsCE
1521 case llvm::Triple::MacOSX:
1522 case llvm::Triple::IOS:
1523 case llvm::Triple::WatchOS:
1524 case llvm::Triple::TvOS:
1535 StringRef CPU = ARM::getDefaultCPU(MArch);
1539 // If no specific architecture version is requested, return the minimum CPU
1540 // required by the OS and environment.
1542 case llvm::Triple::NetBSD:
1543 switch (getEnvironment()) {
1544 case llvm::Triple::GNUEABIHF:
1545 case llvm::Triple::GNUEABI:
1546 case llvm::Triple::EABIHF:
1547 case llvm::Triple::EABI:
1548 return "arm926ej-s";
1552 case llvm::Triple::NaCl:
1553 case llvm::Triple::OpenBSD:
1556 switch (getEnvironment()) {
1557 case llvm::Triple::EABIHF:
1558 case llvm::Triple::GNUEABIHF:
1559 case llvm::Triple::MuslEABIHF:
1560 return "arm1176jzf-s";
1566 llvm_unreachable("invalid arch name");