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