1 //===--- Triple.cpp - Target triple helper class --------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ADT/Triple.h"
10 #include "llvm/ADT/STLArrayExtras.h"
11 #include "llvm/ADT/SmallString.h"
12 #include "llvm/ADT/StringExtras.h"
13 #include "llvm/ADT/StringSwitch.h"
14 #include "llvm/Support/ARMTargetParser.h"
15 #include "llvm/Support/ErrorHandling.h"
16 #include "llvm/Support/Host.h"
17 #include "llvm/Support/SwapByteOrder.h"
18 #include "llvm/Support/VersionTuple.h"
19 #include <cassert>
20 #include <cstring>
21 using namespace llvm;
22 
23 StringRef Triple::getArchTypeName(ArchType Kind) {
24   switch (Kind) {
25   case UnknownArch:    return "unknown";
26 
27   case aarch64:        return "aarch64";
28   case aarch64_32:     return "aarch64_32";
29   case aarch64_be:     return "aarch64_be";
30   case amdgcn:         return "amdgcn";
31   case amdil64:        return "amdil64";
32   case amdil:          return "amdil";
33   case arc:            return "arc";
34   case arm:            return "arm";
35   case armeb:          return "armeb";
36   case avr:            return "avr";
37   case bpfeb:          return "bpfeb";
38   case bpfel:          return "bpfel";
39   case csky:           return "csky";
40   case hexagon:        return "hexagon";
41   case hsail64:        return "hsail64";
42   case hsail:          return "hsail";
43   case kalimba:        return "kalimba";
44   case lanai:          return "lanai";
45   case le32:           return "le32";
46   case le64:           return "le64";
47   case loongarch32:    return "loongarch32";
48   case loongarch64:    return "loongarch64";
49   case m68k:           return "m68k";
50   case mips64:         return "mips64";
51   case mips64el:       return "mips64el";
52   case mips:           return "mips";
53   case mipsel:         return "mipsel";
54   case msp430:         return "msp430";
55   case nvptx64:        return "nvptx64";
56   case nvptx:          return "nvptx";
57   case ppc64:          return "powerpc64";
58   case ppc64le:        return "powerpc64le";
59   case ppc:            return "powerpc";
60   case ppcle:          return "powerpcle";
61   case r600:           return "r600";
62   case renderscript32: return "renderscript32";
63   case renderscript64: return "renderscript64";
64   case riscv32:        return "riscv32";
65   case riscv64:        return "riscv64";
66   case shave:          return "shave";
67   case sparc:          return "sparc";
68   case sparcel:        return "sparcel";
69   case sparcv9:        return "sparcv9";
70   case spir64:         return "spir64";
71   case spir:           return "spir";
72   case spirv32:        return "spirv32";
73   case spirv64:        return "spirv64";
74   case systemz:        return "s390x";
75   case tce:            return "tce";
76   case tcele:          return "tcele";
77   case thumb:          return "thumb";
78   case thumbeb:        return "thumbeb";
79   case ve:             return "ve";
80   case wasm32:         return "wasm32";
81   case wasm64:         return "wasm64";
82   case x86:            return "i386";
83   case x86_64:         return "x86_64";
84   case xcore:          return "xcore";
85   }
86 
87   llvm_unreachable("Invalid ArchType!");
88 }
89 
90 StringRef Triple::getArchTypePrefix(ArchType Kind) {
91   switch (Kind) {
92   default:
93     return StringRef();
94 
95   case aarch64:
96   case aarch64_be:
97   case aarch64_32:  return "aarch64";
98 
99   case arc:         return "arc";
100 
101   case arm:
102   case armeb:
103   case thumb:
104   case thumbeb:     return "arm";
105 
106   case avr:         return "avr";
107 
108   case ppc64:
109   case ppc64le:
110   case ppc:
111   case ppcle:       return "ppc";
112 
113   case m68k:        return "m68k";
114 
115   case mips:
116   case mipsel:
117   case mips64:
118   case mips64el:    return "mips";
119 
120   case hexagon:     return "hexagon";
121 
122   case amdgcn:      return "amdgcn";
123   case r600:        return "r600";
124 
125   case bpfel:
126   case bpfeb:       return "bpf";
127 
128   case sparcv9:
129   case sparcel:
130   case sparc:       return "sparc";
131 
132   case systemz:     return "s390";
133 
134   case x86:
135   case x86_64:      return "x86";
136 
137   case xcore:       return "xcore";
138 
139   // NVPTX intrinsics are namespaced under nvvm.
140   case nvptx:       return "nvvm";
141   case nvptx64:     return "nvvm";
142 
143   case le32:        return "le32";
144   case le64:        return "le64";
145 
146   case amdil:
147   case amdil64:     return "amdil";
148 
149   case hsail:
150   case hsail64:     return "hsail";
151 
152   case spir:
153   case spir64:      return "spir";
154 
155   case spirv32:
156   case spirv64:     return "spirv";
157 
158   case kalimba:     return "kalimba";
159   case lanai:       return "lanai";
160   case shave:       return "shave";
161   case wasm32:
162   case wasm64:      return "wasm";
163 
164   case riscv32:
165   case riscv64:     return "riscv";
166 
167   case ve:          return "ve";
168   case csky:        return "csky";
169 
170   case loongarch32:
171   case loongarch64: return "loongarch";
172   }
173 }
174 
175 StringRef Triple::getVendorTypeName(VendorType Kind) {
176   switch (Kind) {
177   case UnknownVendor: return "unknown";
178 
179   case AMD: return "amd";
180   case Apple: return "apple";
181   case CSR: return "csr";
182   case Freescale: return "fsl";
183   case IBM: return "ibm";
184   case ImaginationTechnologies: return "img";
185   case Mesa: return "mesa";
186   case MipsTechnologies: return "mti";
187   case Myriad: return "myriad";
188   case NVIDIA: return "nvidia";
189   case OpenEmbedded: return "oe";
190   case PC: return "pc";
191   case SCEI: return "scei";
192   case SUSE: return "suse";
193   }
194 
195   llvm_unreachable("Invalid VendorType!");
196 }
197 
198 StringRef Triple::getOSTypeName(OSType Kind) {
199   switch (Kind) {
200   case UnknownOS: return "unknown";
201 
202   case AIX: return "aix";
203   case AMDHSA: return "amdhsa";
204   case AMDPAL: return "amdpal";
205   case Ananas: return "ananas";
206   case CUDA: return "cuda";
207   case CloudABI: return "cloudabi";
208   case Contiki: return "contiki";
209   case Darwin: return "darwin";
210   case DragonFly: return "dragonfly";
211   case DriverKit: return "driverkit";
212   case ELFIAMCU: return "elfiamcu";
213   case Emscripten: return "emscripten";
214   case FreeBSD: return "freebsd";
215   case Fuchsia: return "fuchsia";
216   case Haiku: return "haiku";
217   case HermitCore: return "hermit";
218   case Hurd: return "hurd";
219   case IOS: return "ios";
220   case KFreeBSD: return "kfreebsd";
221   case Linux: return "linux";
222   case Lv2: return "lv2";
223   case MacOSX: return "macosx";
224   case Mesa3D: return "mesa3d";
225   case Minix: return "minix";
226   case NVCL: return "nvcl";
227   case NaCl: return "nacl";
228   case NetBSD: return "netbsd";
229   case OpenBSD: return "openbsd";
230   case PS4: return "ps4";
231   case RTEMS: return "rtems";
232   case Solaris: return "solaris";
233   case TvOS: return "tvos";
234   case WASI: return "wasi";
235   case WatchOS: return "watchos";
236   case Win32: return "windows";
237   case ZOS: return "zos";
238   }
239 
240   llvm_unreachable("Invalid OSType");
241 }
242 
243 StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
244   switch (Kind) {
245   case UnknownEnvironment: return "unknown";
246   case Android: return "android";
247   case CODE16: return "code16";
248   case CoreCLR: return "coreclr";
249   case Cygnus: return "cygnus";
250   case EABI: return "eabi";
251   case EABIHF: return "eabihf";
252   case GNU: return "gnu";
253   case GNUABI64: return "gnuabi64";
254   case GNUABIN32: return "gnuabin32";
255   case GNUEABI: return "gnueabi";
256   case GNUEABIHF: return "gnueabihf";
257   case GNUX32: return "gnux32";
258   case GNUILP32: return "gnu_ilp32";
259   case Itanium: return "itanium";
260   case MSVC: return "msvc";
261   case MacABI: return "macabi";
262   case Musl: return "musl";
263   case MuslEABI: return "musleabi";
264   case MuslEABIHF: return "musleabihf";
265   case MuslX32: return "muslx32";
266   case Simulator: return "simulator";
267   }
268 
269   llvm_unreachable("Invalid EnvironmentType!");
270 }
271 
272 static Triple::ArchType parseBPFArch(StringRef ArchName) {
273   if (ArchName.equals("bpf")) {
274     if (sys::IsLittleEndianHost)
275       return Triple::bpfel;
276     else
277       return Triple::bpfeb;
278   } else if (ArchName.equals("bpf_be") || ArchName.equals("bpfeb")) {
279     return Triple::bpfeb;
280   } else if (ArchName.equals("bpf_le") || ArchName.equals("bpfel")) {
281     return Triple::bpfel;
282   } else {
283     return Triple::UnknownArch;
284   }
285 }
286 
287 Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
288   Triple::ArchType BPFArch(parseBPFArch(Name));
289   return StringSwitch<Triple::ArchType>(Name)
290     .Case("aarch64", aarch64)
291     .Case("aarch64_be", aarch64_be)
292     .Case("aarch64_32", aarch64_32)
293     .Case("arc", arc)
294     .Case("arm64", aarch64) // "arm64" is an alias for "aarch64"
295     .Case("arm64_32", aarch64_32)
296     .Case("arm", arm)
297     .Case("armeb", armeb)
298     .Case("avr", avr)
299     .StartsWith("bpf", BPFArch)
300     .Case("m68k", m68k)
301     .Case("mips", mips)
302     .Case("mipsel", mipsel)
303     .Case("mips64", mips64)
304     .Case("mips64el", mips64el)
305     .Case("msp430", msp430)
306     .Case("ppc64", ppc64)
307     .Case("ppc32", ppc)
308     .Case("ppc", ppc)
309     .Case("ppc32le", ppcle)
310     .Case("ppcle", ppcle)
311     .Case("ppc64le", ppc64le)
312     .Case("r600", r600)
313     .Case("amdgcn", amdgcn)
314     .Case("riscv32", riscv32)
315     .Case("riscv64", riscv64)
316     .Case("hexagon", hexagon)
317     .Case("sparc", sparc)
318     .Case("sparcel", sparcel)
319     .Case("sparcv9", sparcv9)
320     .Case("systemz", systemz)
321     .Case("tce", tce)
322     .Case("tcele", tcele)
323     .Case("thumb", thumb)
324     .Case("thumbeb", thumbeb)
325     .Case("x86", x86)
326     .Case("x86-64", x86_64)
327     .Case("xcore", xcore)
328     .Case("nvptx", nvptx)
329     .Case("nvptx64", nvptx64)
330     .Case("le32", le32)
331     .Case("le64", le64)
332     .Case("amdil", amdil)
333     .Case("amdil64", amdil64)
334     .Case("hsail", hsail)
335     .Case("hsail64", hsail64)
336     .Case("spir", spir)
337     .Case("spir64", spir64)
338     .Case("spirv32", spirv32)
339     .Case("spirv64", spirv64)
340     .Case("kalimba", kalimba)
341     .Case("lanai", lanai)
342     .Case("shave", shave)
343     .Case("wasm32", wasm32)
344     .Case("wasm64", wasm64)
345     .Case("renderscript32", renderscript32)
346     .Case("renderscript64", renderscript64)
347     .Case("ve", ve)
348     .Case("csky", csky)
349     .Case("loongarch32", loongarch32)
350     .Case("loongarch64", loongarch64)
351     .Default(UnknownArch);
352 }
353 
354 static Triple::ArchType parseARMArch(StringRef ArchName) {
355   ARM::ISAKind ISA = ARM::parseArchISA(ArchName);
356   ARM::EndianKind ENDIAN = ARM::parseArchEndian(ArchName);
357 
358   Triple::ArchType arch = Triple::UnknownArch;
359   switch (ENDIAN) {
360   case ARM::EndianKind::LITTLE: {
361     switch (ISA) {
362     case ARM::ISAKind::ARM:
363       arch = Triple::arm;
364       break;
365     case ARM::ISAKind::THUMB:
366       arch = Triple::thumb;
367       break;
368     case ARM::ISAKind::AARCH64:
369       arch = Triple::aarch64;
370       break;
371     case ARM::ISAKind::INVALID:
372       break;
373     }
374     break;
375   }
376   case ARM::EndianKind::BIG: {
377     switch (ISA) {
378     case ARM::ISAKind::ARM:
379       arch = Triple::armeb;
380       break;
381     case ARM::ISAKind::THUMB:
382       arch = Triple::thumbeb;
383       break;
384     case ARM::ISAKind::AARCH64:
385       arch = Triple::aarch64_be;
386       break;
387     case ARM::ISAKind::INVALID:
388       break;
389     }
390     break;
391   }
392   case ARM::EndianKind::INVALID: {
393     break;
394   }
395   }
396 
397   ArchName = ARM::getCanonicalArchName(ArchName);
398   if (ArchName.empty())
399     return Triple::UnknownArch;
400 
401   // Thumb only exists in v4+
402   if (ISA == ARM::ISAKind::THUMB &&
403       (ArchName.startswith("v2") || ArchName.startswith("v3")))
404     return Triple::UnknownArch;
405 
406   // Thumb only for v6m
407   ARM::ProfileKind Profile = ARM::parseArchProfile(ArchName);
408   unsigned Version = ARM::parseArchVersion(ArchName);
409   if (Profile == ARM::ProfileKind::M && Version == 6) {
410     if (ENDIAN == ARM::EndianKind::BIG)
411       return Triple::thumbeb;
412     else
413       return Triple::thumb;
414   }
415 
416   return arch;
417 }
418 
419 static Triple::ArchType parseArch(StringRef ArchName) {
420   auto AT = StringSwitch<Triple::ArchType>(ArchName)
421     .Cases("i386", "i486", "i586", "i686", Triple::x86)
422     // FIXME: Do we need to support these?
423     .Cases("i786", "i886", "i986", Triple::x86)
424     .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64)
425     .Cases("powerpc", "powerpcspe", "ppc", "ppc32", Triple::ppc)
426     .Cases("powerpcle", "ppcle", "ppc32le", Triple::ppcle)
427     .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64)
428     .Cases("powerpc64le", "ppc64le", Triple::ppc64le)
429     .Case("xscale", Triple::arm)
430     .Case("xscaleeb", Triple::armeb)
431     .Case("aarch64", Triple::aarch64)
432     .Case("aarch64_be", Triple::aarch64_be)
433     .Case("aarch64_32", Triple::aarch64_32)
434     .Case("arc", Triple::arc)
435     .Case("arm64", Triple::aarch64)
436     .Case("arm64_32", Triple::aarch64_32)
437     .Case("arm64e", Triple::aarch64)
438     .Case("arm", Triple::arm)
439     .Case("armeb", Triple::armeb)
440     .Case("thumb", Triple::thumb)
441     .Case("thumbeb", Triple::thumbeb)
442     .Case("avr", Triple::avr)
443     .Case("m68k", Triple::m68k)
444     .Case("msp430", Triple::msp430)
445     .Cases("mips", "mipseb", "mipsallegrex", "mipsisa32r6",
446            "mipsr6", Triple::mips)
447     .Cases("mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el",
448            Triple::mipsel)
449     .Cases("mips64", "mips64eb", "mipsn32", "mipsisa64r6",
450            "mips64r6", "mipsn32r6", Triple::mips64)
451     .Cases("mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",
452            "mipsn32r6el", Triple::mips64el)
453     .Case("r600", Triple::r600)
454     .Case("amdgcn", Triple::amdgcn)
455     .Case("riscv32", Triple::riscv32)
456     .Case("riscv64", Triple::riscv64)
457     .Case("hexagon", Triple::hexagon)
458     .Cases("s390x", "systemz", Triple::systemz)
459     .Case("sparc", Triple::sparc)
460     .Case("sparcel", Triple::sparcel)
461     .Cases("sparcv9", "sparc64", Triple::sparcv9)
462     .Case("tce", Triple::tce)
463     .Case("tcele", Triple::tcele)
464     .Case("xcore", Triple::xcore)
465     .Case("nvptx", Triple::nvptx)
466     .Case("nvptx64", Triple::nvptx64)
467     .Case("le32", Triple::le32)
468     .Case("le64", Triple::le64)
469     .Case("amdil", Triple::amdil)
470     .Case("amdil64", Triple::amdil64)
471     .Case("hsail", Triple::hsail)
472     .Case("hsail64", Triple::hsail64)
473     .Case("spir", Triple::spir)
474     .Case("spir64", Triple::spir64)
475     .Case("spirv32", Triple::spirv32)
476     .Case("spirv64", Triple::spirv64)
477     .StartsWith("kalimba", Triple::kalimba)
478     .Case("lanai", Triple::lanai)
479     .Case("renderscript32", Triple::renderscript32)
480     .Case("renderscript64", Triple::renderscript64)
481     .Case("shave", Triple::shave)
482     .Case("ve", Triple::ve)
483     .Case("wasm32", Triple::wasm32)
484     .Case("wasm64", Triple::wasm64)
485     .Case("csky", Triple::csky)
486     .Case("loongarch32", Triple::loongarch32)
487     .Case("loongarch64", Triple::loongarch64)
488     .Default(Triple::UnknownArch);
489 
490   // Some architectures require special parsing logic just to compute the
491   // ArchType result.
492   if (AT == Triple::UnknownArch) {
493     if (ArchName.startswith("arm") || ArchName.startswith("thumb") ||
494         ArchName.startswith("aarch64"))
495       return parseARMArch(ArchName);
496     if (ArchName.startswith("bpf"))
497       return parseBPFArch(ArchName);
498   }
499 
500   return AT;
501 }
502 
503 static Triple::VendorType parseVendor(StringRef VendorName) {
504   return StringSwitch<Triple::VendorType>(VendorName)
505     .Case("apple", Triple::Apple)
506     .Case("pc", Triple::PC)
507     .Case("scei", Triple::SCEI)
508     .Case("sie", Triple::SCEI)
509     .Case("fsl", Triple::Freescale)
510     .Case("ibm", Triple::IBM)
511     .Case("img", Triple::ImaginationTechnologies)
512     .Case("mti", Triple::MipsTechnologies)
513     .Case("nvidia", Triple::NVIDIA)
514     .Case("csr", Triple::CSR)
515     .Case("myriad", Triple::Myriad)
516     .Case("amd", Triple::AMD)
517     .Case("mesa", Triple::Mesa)
518     .Case("suse", Triple::SUSE)
519     .Case("oe", Triple::OpenEmbedded)
520     .Default(Triple::UnknownVendor);
521 }
522 
523 static Triple::OSType parseOS(StringRef OSName) {
524   return StringSwitch<Triple::OSType>(OSName)
525     .StartsWith("ananas", Triple::Ananas)
526     .StartsWith("cloudabi", Triple::CloudABI)
527     .StartsWith("darwin", Triple::Darwin)
528     .StartsWith("dragonfly", Triple::DragonFly)
529     .StartsWith("freebsd", Triple::FreeBSD)
530     .StartsWith("fuchsia", Triple::Fuchsia)
531     .StartsWith("ios", Triple::IOS)
532     .StartsWith("kfreebsd", Triple::KFreeBSD)
533     .StartsWith("linux", Triple::Linux)
534     .StartsWith("lv2", Triple::Lv2)
535     .StartsWith("macos", Triple::MacOSX)
536     .StartsWith("netbsd", Triple::NetBSD)
537     .StartsWith("openbsd", Triple::OpenBSD)
538     .StartsWith("solaris", Triple::Solaris)
539     .StartsWith("win32", Triple::Win32)
540     .StartsWith("windows", Triple::Win32)
541     .StartsWith("zos", Triple::ZOS)
542     .StartsWith("haiku", Triple::Haiku)
543     .StartsWith("minix", Triple::Minix)
544     .StartsWith("rtems", Triple::RTEMS)
545     .StartsWith("nacl", Triple::NaCl)
546     .StartsWith("aix", Triple::AIX)
547     .StartsWith("cuda", Triple::CUDA)
548     .StartsWith("nvcl", Triple::NVCL)
549     .StartsWith("amdhsa", Triple::AMDHSA)
550     .StartsWith("ps4", Triple::PS4)
551     .StartsWith("elfiamcu", Triple::ELFIAMCU)
552     .StartsWith("tvos", Triple::TvOS)
553     .StartsWith("watchos", Triple::WatchOS)
554     .StartsWith("driverkit", Triple::DriverKit)
555     .StartsWith("mesa3d", Triple::Mesa3D)
556     .StartsWith("contiki", Triple::Contiki)
557     .StartsWith("amdpal", Triple::AMDPAL)
558     .StartsWith("hermit", Triple::HermitCore)
559     .StartsWith("hurd", Triple::Hurd)
560     .StartsWith("wasi", Triple::WASI)
561     .StartsWith("emscripten", Triple::Emscripten)
562     .Default(Triple::UnknownOS);
563 }
564 
565 static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
566   return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
567       .StartsWith("eabihf", Triple::EABIHF)
568       .StartsWith("eabi", Triple::EABI)
569       .StartsWith("gnuabin32", Triple::GNUABIN32)
570       .StartsWith("gnuabi64", Triple::GNUABI64)
571       .StartsWith("gnueabihf", Triple::GNUEABIHF)
572       .StartsWith("gnueabi", Triple::GNUEABI)
573       .StartsWith("gnux32", Triple::GNUX32)
574       .StartsWith("gnu_ilp32", Triple::GNUILP32)
575       .StartsWith("code16", Triple::CODE16)
576       .StartsWith("gnu", Triple::GNU)
577       .StartsWith("android", Triple::Android)
578       .StartsWith("musleabihf", Triple::MuslEABIHF)
579       .StartsWith("musleabi", Triple::MuslEABI)
580       .StartsWith("muslx32", Triple::MuslX32)
581       .StartsWith("musl", Triple::Musl)
582       .StartsWith("msvc", Triple::MSVC)
583       .StartsWith("itanium", Triple::Itanium)
584       .StartsWith("cygnus", Triple::Cygnus)
585       .StartsWith("coreclr", Triple::CoreCLR)
586       .StartsWith("simulator", Triple::Simulator)
587       .StartsWith("macabi", Triple::MacABI)
588       .Default(Triple::UnknownEnvironment);
589 }
590 
591 static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {
592   return StringSwitch<Triple::ObjectFormatType>(EnvironmentName)
593     // "xcoff" must come before "coff" because of the order-dependendent
594     // pattern matching.
595     .EndsWith("xcoff", Triple::XCOFF)
596     .EndsWith("coff", Triple::COFF)
597     .EndsWith("elf", Triple::ELF)
598     .EndsWith("goff", Triple::GOFF)
599     .EndsWith("macho", Triple::MachO)
600     .EndsWith("wasm", Triple::Wasm)
601     .Default(Triple::UnknownObjectFormat);
602 }
603 
604 static Triple::SubArchType parseSubArch(StringRef SubArchName) {
605   if (SubArchName.startswith("mips") &&
606       (SubArchName.endswith("r6el") || SubArchName.endswith("r6")))
607     return Triple::MipsSubArch_r6;
608 
609   if (SubArchName == "powerpcspe")
610     return Triple::PPCSubArch_spe;
611 
612   if (SubArchName == "arm64e")
613     return Triple::AArch64SubArch_arm64e;
614 
615   StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
616 
617   // For now, this is the small part. Early return.
618   if (ARMSubArch.empty())
619     return StringSwitch<Triple::SubArchType>(SubArchName)
620       .EndsWith("kalimba3", Triple::KalimbaSubArch_v3)
621       .EndsWith("kalimba4", Triple::KalimbaSubArch_v4)
622       .EndsWith("kalimba5", Triple::KalimbaSubArch_v5)
623       .Default(Triple::NoSubArch);
624 
625   // ARM sub arch.
626   switch(ARM::parseArch(ARMSubArch)) {
627   case ARM::ArchKind::ARMV4:
628     return Triple::NoSubArch;
629   case ARM::ArchKind::ARMV4T:
630     return Triple::ARMSubArch_v4t;
631   case ARM::ArchKind::ARMV5T:
632     return Triple::ARMSubArch_v5;
633   case ARM::ArchKind::ARMV5TE:
634   case ARM::ArchKind::IWMMXT:
635   case ARM::ArchKind::IWMMXT2:
636   case ARM::ArchKind::XSCALE:
637   case ARM::ArchKind::ARMV5TEJ:
638     return Triple::ARMSubArch_v5te;
639   case ARM::ArchKind::ARMV6:
640     return Triple::ARMSubArch_v6;
641   case ARM::ArchKind::ARMV6K:
642   case ARM::ArchKind::ARMV6KZ:
643     return Triple::ARMSubArch_v6k;
644   case ARM::ArchKind::ARMV6T2:
645     return Triple::ARMSubArch_v6t2;
646   case ARM::ArchKind::ARMV6M:
647     return Triple::ARMSubArch_v6m;
648   case ARM::ArchKind::ARMV7A:
649   case ARM::ArchKind::ARMV7R:
650     return Triple::ARMSubArch_v7;
651   case ARM::ArchKind::ARMV7VE:
652     return Triple::ARMSubArch_v7ve;
653   case ARM::ArchKind::ARMV7K:
654     return Triple::ARMSubArch_v7k;
655   case ARM::ArchKind::ARMV7M:
656     return Triple::ARMSubArch_v7m;
657   case ARM::ArchKind::ARMV7S:
658     return Triple::ARMSubArch_v7s;
659   case ARM::ArchKind::ARMV7EM:
660     return Triple::ARMSubArch_v7em;
661   case ARM::ArchKind::ARMV8A:
662     return Triple::ARMSubArch_v8;
663   case ARM::ArchKind::ARMV8_1A:
664     return Triple::ARMSubArch_v8_1a;
665   case ARM::ArchKind::ARMV8_2A:
666     return Triple::ARMSubArch_v8_2a;
667   case ARM::ArchKind::ARMV8_3A:
668     return Triple::ARMSubArch_v8_3a;
669   case ARM::ArchKind::ARMV8_4A:
670     return Triple::ARMSubArch_v8_4a;
671   case ARM::ArchKind::ARMV8_5A:
672     return Triple::ARMSubArch_v8_5a;
673   case ARM::ArchKind::ARMV8_6A:
674     return Triple::ARMSubArch_v8_6a;
675   case ARM::ArchKind::ARMV8_7A:
676     return Triple::ARMSubArch_v8_7a;
677   case ARM::ArchKind::ARMV8_8A:
678     return Triple::ARMSubArch_v8_8a;
679   case ARM::ArchKind::ARMV9A:
680     return Triple::ARMSubArch_v9;
681   case ARM::ArchKind::ARMV9_1A:
682     return Triple::ARMSubArch_v9_1a;
683   case ARM::ArchKind::ARMV9_2A:
684     return Triple::ARMSubArch_v9_2a;
685   case ARM::ArchKind::ARMV9_3A:
686     return Triple::ARMSubArch_v9_3a;
687   case ARM::ArchKind::ARMV8R:
688     return Triple::ARMSubArch_v8r;
689   case ARM::ArchKind::ARMV8MBaseline:
690     return Triple::ARMSubArch_v8m_baseline;
691   case ARM::ArchKind::ARMV8MMainline:
692     return Triple::ARMSubArch_v8m_mainline;
693   case ARM::ArchKind::ARMV8_1MMainline:
694     return Triple::ARMSubArch_v8_1m_mainline;
695   default:
696     return Triple::NoSubArch;
697   }
698 }
699 
700 static StringRef getObjectFormatTypeName(Triple::ObjectFormatType Kind) {
701   switch (Kind) {
702   case Triple::UnknownObjectFormat: return "";
703   case Triple::COFF:  return "coff";
704   case Triple::ELF:   return "elf";
705   case Triple::GOFF:  return "goff";
706   case Triple::MachO: return "macho";
707   case Triple::Wasm:  return "wasm";
708   case Triple::XCOFF: return "xcoff";
709   }
710   llvm_unreachable("unknown object format type");
711 }
712 
713 static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
714   switch (T.getArch()) {
715   case Triple::UnknownArch:
716   case Triple::aarch64:
717   case Triple::aarch64_32:
718   case Triple::arm:
719   case Triple::thumb:
720   case Triple::x86:
721   case Triple::x86_64:
722     if (T.isOSDarwin())
723       return Triple::MachO;
724     else if (T.isOSWindows())
725       return Triple::COFF;
726     return Triple::ELF;
727 
728   case Triple::aarch64_be:
729   case Triple::amdgcn:
730   case Triple::amdil64:
731   case Triple::amdil:
732   case Triple::arc:
733   case Triple::armeb:
734   case Triple::avr:
735   case Triple::bpfeb:
736   case Triple::bpfel:
737   case Triple::csky:
738   case Triple::hexagon:
739   case Triple::hsail64:
740   case Triple::hsail:
741   case Triple::kalimba:
742   case Triple::lanai:
743   case Triple::le32:
744   case Triple::le64:
745   case Triple::loongarch32:
746   case Triple::loongarch64:
747   case Triple::m68k:
748   case Triple::mips64:
749   case Triple::mips64el:
750   case Triple::mips:
751   case Triple::mipsel:
752   case Triple::msp430:
753   case Triple::nvptx64:
754   case Triple::nvptx:
755   case Triple::ppc64le:
756   case Triple::ppcle:
757   case Triple::r600:
758   case Triple::renderscript32:
759   case Triple::renderscript64:
760   case Triple::riscv32:
761   case Triple::riscv64:
762   case Triple::shave:
763   case Triple::sparc:
764   case Triple::sparcel:
765   case Triple::sparcv9:
766   case Triple::spir64:
767   case Triple::spir:
768   case Triple::tce:
769   case Triple::tcele:
770   case Triple::thumbeb:
771   case Triple::ve:
772   case Triple::xcore:
773     return Triple::ELF;
774 
775   case Triple::ppc64:
776   case Triple::ppc:
777     if (T.isOSAIX())
778       return Triple::XCOFF;
779     return Triple::ELF;
780 
781   case Triple::systemz:
782     if (T.isOSzOS())
783       return Triple::GOFF;
784     return Triple::ELF;
785 
786   case Triple::wasm32:
787   case Triple::wasm64:
788     return Triple::Wasm;
789 
790   case Triple::spirv32:
791   case Triple::spirv64:
792     // TODO: In future this will be Triple::SPIRV.
793     return Triple::UnknownObjectFormat;
794   }
795   llvm_unreachable("unknown architecture");
796 }
797 
798 /// Construct a triple from the string representation provided.
799 ///
800 /// This stores the string representation and parses the various pieces into
801 /// enum members.
802 Triple::Triple(const Twine &Str)
803     : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch),
804       Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment),
805       ObjectFormat(UnknownObjectFormat) {
806   // Do minimal parsing by hand here.
807   SmallVector<StringRef, 4> Components;
808   StringRef(Data).split(Components, '-', /*MaxSplit*/ 3);
809   if (Components.size() > 0) {
810     Arch = parseArch(Components[0]);
811     SubArch = parseSubArch(Components[0]);
812     if (Components.size() > 1) {
813       Vendor = parseVendor(Components[1]);
814       if (Components.size() > 2) {
815         OS = parseOS(Components[2]);
816         if (Components.size() > 3) {
817           Environment = parseEnvironment(Components[3]);
818           ObjectFormat = parseFormat(Components[3]);
819         }
820       }
821     } else {
822       Environment =
823           StringSwitch<Triple::EnvironmentType>(Components[0])
824               .StartsWith("mipsn32", Triple::GNUABIN32)
825               .StartsWith("mips64", Triple::GNUABI64)
826               .StartsWith("mipsisa64", Triple::GNUABI64)
827               .StartsWith("mipsisa32", Triple::GNU)
828               .Cases("mips", "mipsel", "mipsr6", "mipsr6el", Triple::GNU)
829               .Default(UnknownEnvironment);
830     }
831   }
832   if (ObjectFormat == UnknownObjectFormat)
833     ObjectFormat = getDefaultFormat(*this);
834 }
835 
836 /// Construct a triple from string representations of the architecture,
837 /// vendor, and OS.
838 ///
839 /// This joins each argument into a canonical string representation and parses
840 /// them into enum members. It leaves the environment unknown and omits it from
841 /// the string representation.
842 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
843     : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
844       Arch(parseArch(ArchStr.str())),
845       SubArch(parseSubArch(ArchStr.str())),
846       Vendor(parseVendor(VendorStr.str())),
847       OS(parseOS(OSStr.str())),
848       Environment(), ObjectFormat(Triple::UnknownObjectFormat) {
849   ObjectFormat = getDefaultFormat(*this);
850 }
851 
852 /// Construct a triple from string representations of the architecture,
853 /// vendor, OS, and environment.
854 ///
855 /// This joins each argument into a canonical string representation and parses
856 /// them into enum members.
857 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
858                const Twine &EnvironmentStr)
859     : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
860             EnvironmentStr).str()),
861       Arch(parseArch(ArchStr.str())),
862       SubArch(parseSubArch(ArchStr.str())),
863       Vendor(parseVendor(VendorStr.str())),
864       OS(parseOS(OSStr.str())),
865       Environment(parseEnvironment(EnvironmentStr.str())),
866       ObjectFormat(parseFormat(EnvironmentStr.str())) {
867   if (ObjectFormat == Triple::UnknownObjectFormat)
868     ObjectFormat = getDefaultFormat(*this);
869 }
870 
871 std::string Triple::normalize(StringRef Str) {
872   bool IsMinGW32 = false;
873   bool IsCygwin = false;
874 
875   // Parse into components.
876   SmallVector<StringRef, 4> Components;
877   Str.split(Components, '-');
878 
879   // If the first component corresponds to a known architecture, preferentially
880   // use it for the architecture.  If the second component corresponds to a
881   // known vendor, preferentially use it for the vendor, etc.  This avoids silly
882   // component movement when a component parses as (eg) both a valid arch and a
883   // valid os.
884   ArchType Arch = UnknownArch;
885   if (Components.size() > 0)
886     Arch = parseArch(Components[0]);
887   VendorType Vendor = UnknownVendor;
888   if (Components.size() > 1)
889     Vendor = parseVendor(Components[1]);
890   OSType OS = UnknownOS;
891   if (Components.size() > 2) {
892     OS = parseOS(Components[2]);
893     IsCygwin = Components[2].startswith("cygwin");
894     IsMinGW32 = Components[2].startswith("mingw");
895   }
896   EnvironmentType Environment = UnknownEnvironment;
897   if (Components.size() > 3)
898     Environment = parseEnvironment(Components[3]);
899   ObjectFormatType ObjectFormat = UnknownObjectFormat;
900   if (Components.size() > 4)
901     ObjectFormat = parseFormat(Components[4]);
902 
903   // Note which components are already in their final position.  These will not
904   // be moved.
905   bool Found[4];
906   Found[0] = Arch != UnknownArch;
907   Found[1] = Vendor != UnknownVendor;
908   Found[2] = OS != UnknownOS;
909   Found[3] = Environment != UnknownEnvironment;
910 
911   // If they are not there already, permute the components into their canonical
912   // positions by seeing if they parse as a valid architecture, and if so moving
913   // the component to the architecture position etc.
914   for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
915     if (Found[Pos])
916       continue; // Already in the canonical position.
917 
918     for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
919       // Do not reparse any components that already matched.
920       if (Idx < array_lengthof(Found) && Found[Idx])
921         continue;
922 
923       // Does this component parse as valid for the target position?
924       bool Valid = false;
925       StringRef Comp = Components[Idx];
926       switch (Pos) {
927       default: llvm_unreachable("unexpected component type!");
928       case 0:
929         Arch = parseArch(Comp);
930         Valid = Arch != UnknownArch;
931         break;
932       case 1:
933         Vendor = parseVendor(Comp);
934         Valid = Vendor != UnknownVendor;
935         break;
936       case 2:
937         OS = parseOS(Comp);
938         IsCygwin = Comp.startswith("cygwin");
939         IsMinGW32 = Comp.startswith("mingw");
940         Valid = OS != UnknownOS || IsCygwin || IsMinGW32;
941         break;
942       case 3:
943         Environment = parseEnvironment(Comp);
944         Valid = Environment != UnknownEnvironment;
945         if (!Valid) {
946           ObjectFormat = parseFormat(Comp);
947           Valid = ObjectFormat != UnknownObjectFormat;
948         }
949         break;
950       }
951       if (!Valid)
952         continue; // Nope, try the next component.
953 
954       // Move the component to the target position, pushing any non-fixed
955       // components that are in the way to the right.  This tends to give
956       // good results in the common cases of a forgotten vendor component
957       // or a wrongly positioned environment.
958       if (Pos < Idx) {
959         // Insert left, pushing the existing components to the right.  For
960         // example, a-b-i386 -> i386-a-b when moving i386 to the front.
961         StringRef CurrentComponent(""); // The empty component.
962         // Replace the component we are moving with an empty component.
963         std::swap(CurrentComponent, Components[Idx]);
964         // Insert the component being moved at Pos, displacing any existing
965         // components to the right.
966         for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
967           // Skip over any fixed components.
968           while (i < array_lengthof(Found) && Found[i])
969             ++i;
970           // Place the component at the new position, getting the component
971           // that was at this position - it will be moved right.
972           std::swap(CurrentComponent, Components[i]);
973         }
974       } else if (Pos > Idx) {
975         // Push right by inserting empty components until the component at Idx
976         // reaches the target position Pos.  For example, pc-a -> -pc-a when
977         // moving pc to the second position.
978         do {
979           // Insert one empty component at Idx.
980           StringRef CurrentComponent(""); // The empty component.
981           for (unsigned i = Idx; i < Components.size();) {
982             // Place the component at the new position, getting the component
983             // that was at this position - it will be moved right.
984             std::swap(CurrentComponent, Components[i]);
985             // If it was placed on top of an empty component then we are done.
986             if (CurrentComponent.empty())
987               break;
988             // Advance to the next component, skipping any fixed components.
989             while (++i < array_lengthof(Found) && Found[i])
990               ;
991           }
992           // The last component was pushed off the end - append it.
993           if (!CurrentComponent.empty())
994             Components.push_back(CurrentComponent);
995 
996           // Advance Idx to the component's new position.
997           while (++Idx < array_lengthof(Found) && Found[Idx])
998             ;
999         } while (Idx < Pos); // Add more until the final position is reached.
1000       }
1001       assert(Pos < Components.size() && Components[Pos] == Comp &&
1002              "Component moved wrong!");
1003       Found[Pos] = true;
1004       break;
1005     }
1006   }
1007 
1008   // Replace empty components with "unknown" value.
1009   for (StringRef &C : Components)
1010     if (C.empty())
1011       C = "unknown";
1012 
1013   // Special case logic goes here.  At this point Arch, Vendor and OS have the
1014   // correct values for the computed components.
1015   std::string NormalizedEnvironment;
1016   if (Environment == Triple::Android && Components[3].startswith("androideabi")) {
1017     StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));
1018     if (AndroidVersion.empty()) {
1019       Components[3] = "android";
1020     } else {
1021       NormalizedEnvironment = Twine("android", AndroidVersion).str();
1022       Components[3] = NormalizedEnvironment;
1023     }
1024   }
1025 
1026   // SUSE uses "gnueabi" to mean "gnueabihf"
1027   if (Vendor == Triple::SUSE && Environment == llvm::Triple::GNUEABI)
1028     Components[3] = "gnueabihf";
1029 
1030   if (OS == Triple::Win32) {
1031     Components.resize(4);
1032     Components[2] = "windows";
1033     if (Environment == UnknownEnvironment) {
1034       if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)
1035         Components[3] = "msvc";
1036       else
1037         Components[3] = getObjectFormatTypeName(ObjectFormat);
1038     }
1039   } else if (IsMinGW32) {
1040     Components.resize(4);
1041     Components[2] = "windows";
1042     Components[3] = "gnu";
1043   } else if (IsCygwin) {
1044     Components.resize(4);
1045     Components[2] = "windows";
1046     Components[3] = "cygnus";
1047   }
1048   if (IsMinGW32 || IsCygwin ||
1049       (OS == Triple::Win32 && Environment != UnknownEnvironment)) {
1050     if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {
1051       Components.resize(5);
1052       Components[4] = getObjectFormatTypeName(ObjectFormat);
1053     }
1054   }
1055 
1056   // Stick the corrected components back together to form the normalized string.
1057   return join(Components, "-");
1058 }
1059 
1060 StringRef Triple::getArchName() const {
1061   return StringRef(Data).split('-').first;           // Isolate first component
1062 }
1063 
1064 StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) const {
1065   switch (Kind) {
1066   case Triple::mips:
1067     if (SubArch == MipsSubArch_r6)
1068       return "mipsisa32r6";
1069     break;
1070   case Triple::mipsel:
1071     if (SubArch == MipsSubArch_r6)
1072       return "mipsisa32r6el";
1073     break;
1074   case Triple::mips64:
1075     if (SubArch == MipsSubArch_r6)
1076       return "mipsisa64r6";
1077     break;
1078   case Triple::mips64el:
1079     if (SubArch == MipsSubArch_r6)
1080       return "mipsisa64r6el";
1081     break;
1082   default:
1083     break;
1084   }
1085   return getArchTypeName(Kind);
1086 }
1087 
1088 StringRef Triple::getVendorName() const {
1089   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1090   return Tmp.split('-').first;                       // Isolate second component
1091 }
1092 
1093 StringRef Triple::getOSName() const {
1094   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1095   Tmp = Tmp.split('-').second;                       // Strip second component
1096   return Tmp.split('-').first;                       // Isolate third component
1097 }
1098 
1099 StringRef Triple::getEnvironmentName() const {
1100   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1101   Tmp = Tmp.split('-').second;                       // Strip second component
1102   return Tmp.split('-').second;                      // Strip third component
1103 }
1104 
1105 StringRef Triple::getOSAndEnvironmentName() const {
1106   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
1107   return Tmp.split('-').second;                      // Strip second component
1108 }
1109 
1110 static VersionTuple parseVersionFromName(StringRef Name) {
1111   VersionTuple Version;
1112   Version.tryParse(Name);
1113   return Version.withoutBuild();
1114 }
1115 
1116 VersionTuple Triple::getEnvironmentVersion() const {
1117   StringRef EnvironmentName = getEnvironmentName();
1118   StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
1119   if (EnvironmentName.startswith(EnvironmentTypeName))
1120     EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size());
1121 
1122   return parseVersionFromName(EnvironmentName);
1123 }
1124 
1125 VersionTuple Triple::getOSVersion() const {
1126   StringRef OSName = getOSName();
1127   // Assume that the OS portion of the triple starts with the canonical name.
1128   StringRef OSTypeName = getOSTypeName(getOS());
1129   if (OSName.startswith(OSTypeName))
1130     OSName = OSName.substr(OSTypeName.size());
1131   else if (getOS() == MacOSX)
1132     OSName.consume_front("macos");
1133 
1134   return parseVersionFromName(OSName);
1135 }
1136 
1137 bool Triple::getMacOSXVersion(VersionTuple &Version) const {
1138   Version = getOSVersion();
1139 
1140   switch (getOS()) {
1141   default: llvm_unreachable("unexpected OS for Darwin triple");
1142   case Darwin:
1143     // Default to darwin8, i.e., MacOSX 10.4.
1144     if (Version.getMajor() == 0)
1145       Version = VersionTuple(8);
1146     // Darwin version numbers are skewed from OS X versions.
1147     if (Version.getMajor() < 4) {
1148       return false;
1149     }
1150     if (Version.getMajor() <= 19) {
1151       Version = VersionTuple(10, Version.getMajor() - 4);
1152     } else {
1153       // darwin20+ corresponds to macOS 11+.
1154       Version = VersionTuple(11 + Version.getMajor() - 20);
1155     }
1156     break;
1157   case MacOSX:
1158     // Default to 10.4.
1159     if (Version.getMajor() == 0) {
1160       Version = VersionTuple(10, 4);
1161     } else if (Version.getMajor() < 10) {
1162       return false;
1163     }
1164     break;
1165   case IOS:
1166   case TvOS:
1167   case WatchOS:
1168     // Ignore the version from the triple.  This is only handled because the
1169     // the clang driver combines OS X and IOS support into a common Darwin
1170     // toolchain that wants to know the OS X version number even when targeting
1171     // IOS.
1172     Version = VersionTuple(10, 4);
1173     break;
1174   case DriverKit:
1175     llvm_unreachable("OSX version isn't relevant for DriverKit");
1176   }
1177   return true;
1178 }
1179 
1180 VersionTuple Triple::getiOSVersion() const {
1181   switch (getOS()) {
1182   default: llvm_unreachable("unexpected OS for Darwin triple");
1183   case Darwin:
1184   case MacOSX:
1185     // Ignore the version from the triple.  This is only handled because the
1186     // the clang driver combines OS X and IOS support into a common Darwin
1187     // toolchain that wants to know the iOS version number even when targeting
1188     // OS X.
1189     return VersionTuple(5);
1190   case IOS:
1191   case TvOS: {
1192     VersionTuple Version = getOSVersion();
1193     // Default to 5.0 (or 7.0 for arm64).
1194     if (Version.getMajor() == 0)
1195       return (getArch() == aarch64) ? VersionTuple(7) : VersionTuple(5);
1196     return Version;
1197   }
1198   case WatchOS:
1199     llvm_unreachable("conflicting triple info");
1200   case DriverKit:
1201     llvm_unreachable("DriverKit doesn't have an iOS version");
1202   }
1203 }
1204 
1205 VersionTuple Triple::getWatchOSVersion() const {
1206   switch (getOS()) {
1207   default: llvm_unreachable("unexpected OS for Darwin triple");
1208   case Darwin:
1209   case MacOSX:
1210     // Ignore the version from the triple.  This is only handled because the
1211     // the clang driver combines OS X and IOS support into a common Darwin
1212     // toolchain that wants to know the iOS version number even when targeting
1213     // OS X.
1214     return VersionTuple(2);
1215   case WatchOS: {
1216     VersionTuple Version = getOSVersion();
1217     if (Version.getMajor() == 0)
1218       return VersionTuple(2);
1219     return Version;
1220   }
1221   case IOS:
1222     llvm_unreachable("conflicting triple info");
1223   case DriverKit:
1224     llvm_unreachable("DriverKit doesn't have a WatchOS version");
1225   }
1226 }
1227 
1228 VersionTuple Triple::getDriverKitVersion() const {
1229   switch (getOS()) {
1230   default:
1231     llvm_unreachable("unexpected OS for Darwin triple");
1232   case DriverKit:
1233     VersionTuple Version = getOSVersion();
1234     if (Version.getMajor() == 0)
1235       return Version.withMajorReplaced(19);
1236     return Version;
1237   }
1238 }
1239 
1240 void Triple::setTriple(const Twine &Str) {
1241   *this = Triple(Str);
1242 }
1243 
1244 void Triple::setArch(ArchType Kind, SubArchType SubArch) {
1245   setArchName(getArchName(Kind, SubArch));
1246 }
1247 
1248 void Triple::setVendor(VendorType Kind) {
1249   setVendorName(getVendorTypeName(Kind));
1250 }
1251 
1252 void Triple::setOS(OSType Kind) {
1253   setOSName(getOSTypeName(Kind));
1254 }
1255 
1256 void Triple::setEnvironment(EnvironmentType Kind) {
1257   if (ObjectFormat == getDefaultFormat(*this))
1258     return setEnvironmentName(getEnvironmentTypeName(Kind));
1259 
1260   setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") +
1261                       getObjectFormatTypeName(ObjectFormat)).str());
1262 }
1263 
1264 void Triple::setObjectFormat(ObjectFormatType Kind) {
1265   if (Environment == UnknownEnvironment)
1266     return setEnvironmentName(getObjectFormatTypeName(Kind));
1267 
1268   setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +
1269                       getObjectFormatTypeName(Kind)).str());
1270 }
1271 
1272 void Triple::setArchName(StringRef Str) {
1273   // Work around a miscompilation bug for Twines in gcc 4.0.3.
1274   SmallString<64> Triple;
1275   Triple += Str;
1276   Triple += "-";
1277   Triple += getVendorName();
1278   Triple += "-";
1279   Triple += getOSAndEnvironmentName();
1280   setTriple(Triple);
1281 }
1282 
1283 void Triple::setVendorName(StringRef Str) {
1284   setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
1285 }
1286 
1287 void Triple::setOSName(StringRef Str) {
1288   if (hasEnvironment())
1289     setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
1290               "-" + getEnvironmentName());
1291   else
1292     setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1293 }
1294 
1295 void Triple::setEnvironmentName(StringRef Str) {
1296   setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
1297             "-" + Str);
1298 }
1299 
1300 void Triple::setOSAndEnvironmentName(StringRef Str) {
1301   setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1302 }
1303 
1304 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
1305   switch (Arch) {
1306   case llvm::Triple::UnknownArch:
1307     return 0;
1308 
1309   case llvm::Triple::avr:
1310   case llvm::Triple::msp430:
1311     return 16;
1312 
1313   case llvm::Triple::aarch64_32:
1314   case llvm::Triple::amdil:
1315   case llvm::Triple::arc:
1316   case llvm::Triple::arm:
1317   case llvm::Triple::armeb:
1318   case llvm::Triple::csky:
1319   case llvm::Triple::hexagon:
1320   case llvm::Triple::hsail:
1321   case llvm::Triple::kalimba:
1322   case llvm::Triple::lanai:
1323   case llvm::Triple::le32:
1324   case llvm::Triple::loongarch32:
1325   case llvm::Triple::m68k:
1326   case llvm::Triple::mips:
1327   case llvm::Triple::mipsel:
1328   case llvm::Triple::nvptx:
1329   case llvm::Triple::ppc:
1330   case llvm::Triple::ppcle:
1331   case llvm::Triple::r600:
1332   case llvm::Triple::renderscript32:
1333   case llvm::Triple::riscv32:
1334   case llvm::Triple::shave:
1335   case llvm::Triple::sparc:
1336   case llvm::Triple::sparcel:
1337   case llvm::Triple::spir:
1338   case llvm::Triple::spirv32:
1339   case llvm::Triple::tce:
1340   case llvm::Triple::tcele:
1341   case llvm::Triple::thumb:
1342   case llvm::Triple::thumbeb:
1343   case llvm::Triple::wasm32:
1344   case llvm::Triple::x86:
1345   case llvm::Triple::xcore:
1346     return 32;
1347 
1348   case llvm::Triple::aarch64:
1349   case llvm::Triple::aarch64_be:
1350   case llvm::Triple::amdgcn:
1351   case llvm::Triple::amdil64:
1352   case llvm::Triple::bpfeb:
1353   case llvm::Triple::bpfel:
1354   case llvm::Triple::hsail64:
1355   case llvm::Triple::le64:
1356   case llvm::Triple::loongarch64:
1357   case llvm::Triple::mips64:
1358   case llvm::Triple::mips64el:
1359   case llvm::Triple::nvptx64:
1360   case llvm::Triple::ppc64:
1361   case llvm::Triple::ppc64le:
1362   case llvm::Triple::renderscript64:
1363   case llvm::Triple::riscv64:
1364   case llvm::Triple::sparcv9:
1365   case llvm::Triple::spir64:
1366   case llvm::Triple::spirv64:
1367   case llvm::Triple::systemz:
1368   case llvm::Triple::ve:
1369   case llvm::Triple::wasm64:
1370   case llvm::Triple::x86_64:
1371     return 64;
1372   }
1373   llvm_unreachable("Invalid architecture value");
1374 }
1375 
1376 bool Triple::isArch64Bit() const {
1377   return getArchPointerBitWidth(getArch()) == 64;
1378 }
1379 
1380 bool Triple::isArch32Bit() const {
1381   return getArchPointerBitWidth(getArch()) == 32;
1382 }
1383 
1384 bool Triple::isArch16Bit() const {
1385   return getArchPointerBitWidth(getArch()) == 16;
1386 }
1387 
1388 Triple Triple::get32BitArchVariant() const {
1389   Triple T(*this);
1390   switch (getArch()) {
1391   case Triple::UnknownArch:
1392   case Triple::amdgcn:
1393   case Triple::avr:
1394   case Triple::bpfeb:
1395   case Triple::bpfel:
1396   case Triple::msp430:
1397   case Triple::systemz:
1398   case Triple::ve:
1399     T.setArch(UnknownArch);
1400     break;
1401 
1402   case Triple::aarch64_32:
1403   case Triple::amdil:
1404   case Triple::arc:
1405   case Triple::arm:
1406   case Triple::armeb:
1407   case Triple::csky:
1408   case Triple::hexagon:
1409   case Triple::hsail:
1410   case Triple::kalimba:
1411   case Triple::lanai:
1412   case Triple::le32:
1413   case Triple::loongarch32:
1414   case Triple::m68k:
1415   case Triple::mips:
1416   case Triple::mipsel:
1417   case Triple::nvptx:
1418   case Triple::ppc:
1419   case Triple::ppcle:
1420   case Triple::r600:
1421   case Triple::renderscript32:
1422   case Triple::riscv32:
1423   case Triple::shave:
1424   case Triple::sparc:
1425   case Triple::sparcel:
1426   case Triple::spir:
1427   case Triple::spirv32:
1428   case Triple::tce:
1429   case Triple::tcele:
1430   case Triple::thumb:
1431   case Triple::thumbeb:
1432   case Triple::wasm32:
1433   case Triple::x86:
1434   case Triple::xcore:
1435     // Already 32-bit.
1436     break;
1437 
1438   case Triple::aarch64:        T.setArch(Triple::arm);     break;
1439   case Triple::aarch64_be:     T.setArch(Triple::armeb);   break;
1440   case Triple::amdil64:        T.setArch(Triple::amdil);   break;
1441   case Triple::hsail64:        T.setArch(Triple::hsail);   break;
1442   case Triple::le64:           T.setArch(Triple::le32);    break;
1443   case Triple::loongarch64:    T.setArch(Triple::loongarch32); break;
1444   case Triple::mips64:
1445     T.setArch(Triple::mips, getSubArch());
1446     break;
1447   case Triple::mips64el:
1448     T.setArch(Triple::mipsel, getSubArch());
1449     break;
1450   case Triple::nvptx64:        T.setArch(Triple::nvptx);   break;
1451   case Triple::ppc64:          T.setArch(Triple::ppc);     break;
1452   case Triple::ppc64le:        T.setArch(Triple::ppcle);   break;
1453   case Triple::renderscript64: T.setArch(Triple::renderscript32); break;
1454   case Triple::riscv64:        T.setArch(Triple::riscv32); break;
1455   case Triple::sparcv9:        T.setArch(Triple::sparc);   break;
1456   case Triple::spir64:         T.setArch(Triple::spir);    break;
1457   case Triple::spirv64:        T.setArch(Triple::spirv32); break;
1458   case Triple::wasm64:         T.setArch(Triple::wasm32);  break;
1459   case Triple::x86_64:         T.setArch(Triple::x86);     break;
1460   }
1461   return T;
1462 }
1463 
1464 Triple Triple::get64BitArchVariant() const {
1465   Triple T(*this);
1466   switch (getArch()) {
1467   case Triple::UnknownArch:
1468   case Triple::arc:
1469   case Triple::avr:
1470   case Triple::csky:
1471   case Triple::hexagon:
1472   case Triple::kalimba:
1473   case Triple::lanai:
1474   case Triple::m68k:
1475   case Triple::msp430:
1476   case Triple::r600:
1477   case Triple::shave:
1478   case Triple::sparcel:
1479   case Triple::tce:
1480   case Triple::tcele:
1481   case Triple::xcore:
1482     T.setArch(UnknownArch);
1483     break;
1484 
1485   case Triple::aarch64:
1486   case Triple::aarch64_be:
1487   case Triple::amdgcn:
1488   case Triple::amdil64:
1489   case Triple::bpfeb:
1490   case Triple::bpfel:
1491   case Triple::hsail64:
1492   case Triple::le64:
1493   case Triple::loongarch64:
1494   case Triple::mips64:
1495   case Triple::mips64el:
1496   case Triple::nvptx64:
1497   case Triple::ppc64:
1498   case Triple::ppc64le:
1499   case Triple::renderscript64:
1500   case Triple::riscv64:
1501   case Triple::sparcv9:
1502   case Triple::spir64:
1503   case Triple::spirv64:
1504   case Triple::systemz:
1505   case Triple::ve:
1506   case Triple::wasm64:
1507   case Triple::x86_64:
1508     // Already 64-bit.
1509     break;
1510 
1511   case Triple::aarch64_32:      T.setArch(Triple::aarch64);    break;
1512   case Triple::amdil:           T.setArch(Triple::amdil64);    break;
1513   case Triple::arm:             T.setArch(Triple::aarch64);    break;
1514   case Triple::armeb:           T.setArch(Triple::aarch64_be); break;
1515   case Triple::hsail:           T.setArch(Triple::hsail64);    break;
1516   case Triple::le32:            T.setArch(Triple::le64);       break;
1517   case Triple::loongarch32:     T.setArch(Triple::loongarch64);    break;
1518   case Triple::mips:
1519     T.setArch(Triple::mips64, getSubArch());
1520     break;
1521   case Triple::mipsel:
1522     T.setArch(Triple::mips64el, getSubArch());
1523     break;
1524   case Triple::nvptx:           T.setArch(Triple::nvptx64);    break;
1525   case Triple::ppc:             T.setArch(Triple::ppc64);      break;
1526   case Triple::ppcle:           T.setArch(Triple::ppc64le);    break;
1527   case Triple::renderscript32:  T.setArch(Triple::renderscript64);     break;
1528   case Triple::riscv32:         T.setArch(Triple::riscv64);    break;
1529   case Triple::sparc:           T.setArch(Triple::sparcv9);    break;
1530   case Triple::spir:            T.setArch(Triple::spir64);     break;
1531   case Triple::spirv32:         T.setArch(Triple::spirv64);    break;
1532   case Triple::thumb:           T.setArch(Triple::aarch64);    break;
1533   case Triple::thumbeb:         T.setArch(Triple::aarch64_be); break;
1534   case Triple::wasm32:          T.setArch(Triple::wasm64);     break;
1535   case Triple::x86:             T.setArch(Triple::x86_64);     break;
1536   }
1537   return T;
1538 }
1539 
1540 Triple Triple::getBigEndianArchVariant() const {
1541   Triple T(*this);
1542   // Already big endian.
1543   if (!isLittleEndian())
1544     return T;
1545   switch (getArch()) {
1546   case Triple::UnknownArch:
1547   case Triple::amdgcn:
1548   case Triple::amdil64:
1549   case Triple::amdil:
1550   case Triple::avr:
1551   case Triple::hexagon:
1552   case Triple::hsail64:
1553   case Triple::hsail:
1554   case Triple::kalimba:
1555   case Triple::le32:
1556   case Triple::le64:
1557   case Triple::loongarch32:
1558   case Triple::loongarch64:
1559   case Triple::msp430:
1560   case Triple::nvptx64:
1561   case Triple::nvptx:
1562   case Triple::r600:
1563   case Triple::renderscript32:
1564   case Triple::renderscript64:
1565   case Triple::riscv32:
1566   case Triple::riscv64:
1567   case Triple::shave:
1568   case Triple::spir64:
1569   case Triple::spir:
1570   case Triple::spirv32:
1571   case Triple::spirv64:
1572   case Triple::wasm32:
1573   case Triple::wasm64:
1574   case Triple::x86:
1575   case Triple::x86_64:
1576   case Triple::xcore:
1577   case Triple::ve:
1578   case Triple::csky:
1579 
1580   // ARM is intentionally unsupported here, changing the architecture would
1581   // drop any arch suffixes.
1582   case Triple::arm:
1583   case Triple::thumb:
1584     T.setArch(UnknownArch);
1585     break;
1586 
1587   case Triple::aarch64: T.setArch(Triple::aarch64_be); break;
1588   case Triple::bpfel:   T.setArch(Triple::bpfeb);      break;
1589   case Triple::mips64el:
1590     T.setArch(Triple::mips64, getSubArch());
1591     break;
1592   case Triple::mipsel:
1593     T.setArch(Triple::mips, getSubArch());
1594     break;
1595   case Triple::ppcle:   T.setArch(Triple::ppc);        break;
1596   case Triple::ppc64le: T.setArch(Triple::ppc64);      break;
1597   case Triple::sparcel: T.setArch(Triple::sparc);      break;
1598   case Triple::tcele:   T.setArch(Triple::tce);        break;
1599   default:
1600     llvm_unreachable("getBigEndianArchVariant: unknown triple.");
1601   }
1602   return T;
1603 }
1604 
1605 Triple Triple::getLittleEndianArchVariant() const {
1606   Triple T(*this);
1607   if (isLittleEndian())
1608     return T;
1609 
1610   switch (getArch()) {
1611   case Triple::UnknownArch:
1612   case Triple::lanai:
1613   case Triple::sparcv9:
1614   case Triple::systemz:
1615   case Triple::m68k:
1616 
1617   // ARM is intentionally unsupported here, changing the architecture would
1618   // drop any arch suffixes.
1619   case Triple::armeb:
1620   case Triple::thumbeb:
1621     T.setArch(UnknownArch);
1622     break;
1623 
1624   case Triple::aarch64_be: T.setArch(Triple::aarch64);  break;
1625   case Triple::bpfeb:      T.setArch(Triple::bpfel);    break;
1626   case Triple::mips64:
1627     T.setArch(Triple::mips64el, getSubArch());
1628     break;
1629   case Triple::mips:
1630     T.setArch(Triple::mipsel, getSubArch());
1631     break;
1632   case Triple::ppc:        T.setArch(Triple::ppcle);    break;
1633   case Triple::ppc64:      T.setArch(Triple::ppc64le);  break;
1634   case Triple::sparc:      T.setArch(Triple::sparcel);  break;
1635   case Triple::tce:        T.setArch(Triple::tcele);    break;
1636   default:
1637     llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
1638   }
1639   return T;
1640 }
1641 
1642 bool Triple::isLittleEndian() const {
1643   switch (getArch()) {
1644   case Triple::aarch64:
1645   case Triple::aarch64_32:
1646   case Triple::amdgcn:
1647   case Triple::amdil64:
1648   case Triple::amdil:
1649   case Triple::arm:
1650   case Triple::avr:
1651   case Triple::bpfel:
1652   case Triple::csky:
1653   case Triple::hexagon:
1654   case Triple::hsail64:
1655   case Triple::hsail:
1656   case Triple::kalimba:
1657   case Triple::le32:
1658   case Triple::le64:
1659   case Triple::loongarch32:
1660   case Triple::loongarch64:
1661   case Triple::mips64el:
1662   case Triple::mipsel:
1663   case Triple::msp430:
1664   case Triple::nvptx64:
1665   case Triple::nvptx:
1666   case Triple::ppcle:
1667   case Triple::ppc64le:
1668   case Triple::r600:
1669   case Triple::renderscript32:
1670   case Triple::renderscript64:
1671   case Triple::riscv32:
1672   case Triple::riscv64:
1673   case Triple::shave:
1674   case Triple::sparcel:
1675   case Triple::spir64:
1676   case Triple::spir:
1677   case Triple::spirv32:
1678   case Triple::spirv64:
1679   case Triple::tcele:
1680   case Triple::thumb:
1681   case Triple::ve:
1682   case Triple::wasm32:
1683   case Triple::wasm64:
1684   case Triple::x86:
1685   case Triple::x86_64:
1686   case Triple::xcore:
1687     return true;
1688   default:
1689     return false;
1690   }
1691 }
1692 
1693 bool Triple::isCompatibleWith(const Triple &Other) const {
1694   // ARM and Thumb triples are compatible, if subarch, vendor and OS match.
1695   if ((getArch() == Triple::thumb && Other.getArch() == Triple::arm) ||
1696       (getArch() == Triple::arm && Other.getArch() == Triple::thumb) ||
1697       (getArch() == Triple::thumbeb && Other.getArch() == Triple::armeb) ||
1698       (getArch() == Triple::armeb && Other.getArch() == Triple::thumbeb)) {
1699     if (getVendor() == Triple::Apple)
1700       return getSubArch() == Other.getSubArch() &&
1701              getVendor() == Other.getVendor() && getOS() == Other.getOS();
1702     else
1703       return getSubArch() == Other.getSubArch() &&
1704              getVendor() == Other.getVendor() && getOS() == Other.getOS() &&
1705              getEnvironment() == Other.getEnvironment() &&
1706              getObjectFormat() == Other.getObjectFormat();
1707   }
1708 
1709   // If vendor is apple, ignore the version number.
1710   if (getVendor() == Triple::Apple)
1711     return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
1712            getVendor() == Other.getVendor() && getOS() == Other.getOS();
1713 
1714   return *this == Other;
1715 }
1716 
1717 std::string Triple::merge(const Triple &Other) const {
1718   // If vendor is apple, pick the triple with the larger version number.
1719   if (getVendor() == Triple::Apple)
1720     if (Other.isOSVersionLT(*this))
1721       return str();
1722 
1723   return Other.str();
1724 }
1725 
1726 bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor,
1727                                unsigned Micro) const {
1728   assert(isMacOSX() && "Not an OS X triple!");
1729 
1730   // If this is OS X, expect a sane version number.
1731   if (getOS() == Triple::MacOSX)
1732     return isOSVersionLT(Major, Minor, Micro);
1733 
1734   // Otherwise, compare to the "Darwin" number.
1735   if (Major == 10) {
1736     return isOSVersionLT(Minor + 4, Micro, 0);
1737   } else {
1738     assert(Major >= 11 && "Unexpected major version");
1739     return isOSVersionLT(Major - 11 + 20, Minor, Micro);
1740   }
1741 }
1742 
1743 VersionTuple Triple::getMinimumSupportedOSVersion() const {
1744   if (getVendor() != Triple::Apple || getArch() != Triple::aarch64)
1745     return VersionTuple();
1746   switch (getOS()) {
1747   case Triple::MacOSX:
1748     // ARM64 slice is supported starting from macOS 11.0+.
1749     return VersionTuple(11, 0, 0);
1750   case Triple::IOS:
1751     // ARM64 slice is supported starting from Mac Catalyst 14 (macOS 11).
1752     // ARM64 simulators are supported for iOS 14+.
1753     if (isMacCatalystEnvironment() || isSimulatorEnvironment())
1754       return VersionTuple(14, 0, 0);
1755     // ARM64e slice is supported starting from iOS 14.
1756     if (isArm64e())
1757       return VersionTuple(14, 0, 0);
1758     break;
1759   case Triple::TvOS:
1760     // ARM64 simulators are supported for tvOS 14+.
1761     if (isSimulatorEnvironment())
1762       return VersionTuple(14, 0, 0);
1763     break;
1764   case Triple::WatchOS:
1765     // ARM64 simulators are supported for watchOS 7+.
1766     if (isSimulatorEnvironment())
1767       return VersionTuple(7, 0, 0);
1768     break;
1769   case Triple::DriverKit:
1770     return VersionTuple(20, 0, 0);
1771   default:
1772     break;
1773   }
1774   return VersionTuple();
1775 }
1776 
1777 StringRef Triple::getARMCPUForArch(StringRef MArch) const {
1778   if (MArch.empty())
1779     MArch = getArchName();
1780   MArch = ARM::getCanonicalArchName(MArch);
1781 
1782   // Some defaults are forced.
1783   switch (getOS()) {
1784   case llvm::Triple::FreeBSD:
1785   case llvm::Triple::NetBSD:
1786   case llvm::Triple::OpenBSD:
1787     if (!MArch.empty() && MArch == "v6")
1788       return "arm1176jzf-s";
1789     if (!MArch.empty() && MArch == "v7")
1790       return "cortex-a8";
1791     break;
1792   case llvm::Triple::Win32:
1793     // FIXME: this is invalid for WindowsCE
1794     if (ARM::parseArchVersion(MArch) <= 7)
1795       return "cortex-a9";
1796     break;
1797   case llvm::Triple::IOS:
1798   case llvm::Triple::MacOSX:
1799   case llvm::Triple::TvOS:
1800   case llvm::Triple::WatchOS:
1801   case llvm::Triple::DriverKit:
1802     if (MArch == "v7k")
1803       return "cortex-a7";
1804     break;
1805   default:
1806     break;
1807   }
1808 
1809   if (MArch.empty())
1810     return StringRef();
1811 
1812   StringRef CPU = ARM::getDefaultCPU(MArch);
1813   if (!CPU.empty() && !CPU.equals("invalid"))
1814     return CPU;
1815 
1816   // If no specific architecture version is requested, return the minimum CPU
1817   // required by the OS and environment.
1818   switch (getOS()) {
1819   case llvm::Triple::NetBSD:
1820     switch (getEnvironment()) {
1821     case llvm::Triple::EABI:
1822     case llvm::Triple::EABIHF:
1823     case llvm::Triple::GNUEABI:
1824     case llvm::Triple::GNUEABIHF:
1825       return "arm926ej-s";
1826     default:
1827       return "strongarm";
1828     }
1829   case llvm::Triple::NaCl:
1830   case llvm::Triple::OpenBSD:
1831     return "cortex-a8";
1832   default:
1833     switch (getEnvironment()) {
1834     case llvm::Triple::EABIHF:
1835     case llvm::Triple::GNUEABIHF:
1836     case llvm::Triple::MuslEABIHF:
1837       return "arm1176jzf-s";
1838     default:
1839       return "arm7tdmi";
1840     }
1841   }
1842 
1843   llvm_unreachable("invalid arch name");
1844 }
1845 
1846 VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind,
1847                                               const VersionTuple &Version) {
1848   switch (OSKind) {
1849   case MacOSX:
1850     // macOS 10.16 is canonicalized to macOS 11.
1851     if (Version == VersionTuple(10, 16))
1852       return VersionTuple(11, 0);
1853     LLVM_FALLTHROUGH;
1854   default:
1855     return Version;
1856   }
1857 }
1858