1 //===--- Triple.cpp - Target triple helper class --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/ADT/Triple.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/StringSwitch.h"
14 #include "llvm/Support/ErrorHandling.h"
15 #include "llvm/Support/TargetParser.h"
16 #include "llvm/Support/Host.h"
17 #include <cstring>
18 using namespace llvm;
19 
20 StringRef Triple::getArchTypeName(ArchType Kind) {
21   switch (Kind) {
22   case UnknownArch:    return "unknown";
23 
24   case aarch64:        return "aarch64";
25   case aarch64_be:     return "aarch64_be";
26   case arm:            return "arm";
27   case armeb:          return "armeb";
28   case avr:            return "avr";
29   case bpfel:          return "bpfel";
30   case bpfeb:          return "bpfeb";
31   case hexagon:        return "hexagon";
32   case mips:           return "mips";
33   case mipsel:         return "mipsel";
34   case mips64:         return "mips64";
35   case mips64el:       return "mips64el";
36   case msp430:         return "msp430";
37   case ppc64:          return "powerpc64";
38   case ppc64le:        return "powerpc64le";
39   case ppc:            return "powerpc";
40   case r600:           return "r600";
41   case amdgcn:         return "amdgcn";
42   case riscv32:        return "riscv32";
43   case riscv64:        return "riscv64";
44   case sparc:          return "sparc";
45   case sparcv9:        return "sparcv9";
46   case sparcel:        return "sparcel";
47   case systemz:        return "s390x";
48   case tce:            return "tce";
49   case tcele:          return "tcele";
50   case thumb:          return "thumb";
51   case thumbeb:        return "thumbeb";
52   case x86:            return "i386";
53   case x86_64:         return "x86_64";
54   case xcore:          return "xcore";
55   case nvptx:          return "nvptx";
56   case nvptx64:        return "nvptx64";
57   case le32:           return "le32";
58   case le64:           return "le64";
59   case amdil:          return "amdil";
60   case amdil64:        return "amdil64";
61   case hsail:          return "hsail";
62   case hsail64:        return "hsail64";
63   case spir:           return "spir";
64   case spir64:         return "spir64";
65   case kalimba:        return "kalimba";
66   case lanai:          return "lanai";
67   case shave:          return "shave";
68   case wasm32:         return "wasm32";
69   case wasm64:         return "wasm64";
70   case renderscript32: return "renderscript32";
71   case renderscript64: return "renderscript64";
72   }
73 
74   llvm_unreachable("Invalid ArchType!");
75 }
76 
77 StringRef Triple::getArchTypePrefix(ArchType Kind) {
78   switch (Kind) {
79   default:
80     return StringRef();
81 
82   case aarch64:
83   case aarch64_be:  return "aarch64";
84 
85   case arm:
86   case armeb:
87   case thumb:
88   case thumbeb:     return "arm";
89 
90   case avr:         return "avr";
91 
92   case ppc64:
93   case ppc64le:
94   case ppc:         return "ppc";
95 
96   case mips:
97   case mipsel:
98   case mips64:
99   case mips64el:    return "mips";
100 
101   case hexagon:     return "hexagon";
102 
103   case amdgcn:      return "amdgcn";
104   case r600:        return "r600";
105 
106   case bpfel:
107   case bpfeb:       return "bpf";
108 
109   case sparcv9:
110   case sparcel:
111   case sparc:       return "sparc";
112 
113   case systemz:     return "s390";
114 
115   case x86:
116   case x86_64:      return "x86";
117 
118   case xcore:       return "xcore";
119 
120   // NVPTX intrinsics are namespaced under nvvm.
121   case nvptx:       return "nvvm";
122   case nvptx64:     return "nvvm";
123 
124   case le32:        return "le32";
125   case le64:        return "le64";
126 
127   case amdil:
128   case amdil64:     return "amdil";
129 
130   case hsail:
131   case hsail64:     return "hsail";
132 
133   case spir:
134   case spir64:      return "spir";
135   case kalimba:     return "kalimba";
136   case lanai:       return "lanai";
137   case shave:       return "shave";
138   case wasm32:
139   case wasm64:      return "wasm";
140 
141   case riscv32:
142   case riscv64:     return "riscv";
143   }
144 }
145 
146 StringRef Triple::getVendorTypeName(VendorType Kind) {
147   switch (Kind) {
148   case UnknownVendor: return "unknown";
149 
150   case Apple: return "apple";
151   case PC: return "pc";
152   case SCEI: return "scei";
153   case BGP: return "bgp";
154   case BGQ: return "bgq";
155   case Freescale: return "fsl";
156   case IBM: return "ibm";
157   case ImaginationTechnologies: return "img";
158   case MipsTechnologies: return "mti";
159   case NVIDIA: return "nvidia";
160   case CSR: return "csr";
161   case Myriad: return "myriad";
162   case AMD: return "amd";
163   case Mesa: return "mesa";
164   }
165 
166   llvm_unreachable("Invalid VendorType!");
167 }
168 
169 StringRef Triple::getOSTypeName(OSType Kind) {
170   switch (Kind) {
171   case UnknownOS: return "unknown";
172 
173   case CloudABI: return "cloudabi";
174   case Darwin: return "darwin";
175   case DragonFly: return "dragonfly";
176   case FreeBSD: return "freebsd";
177   case Fuchsia: return "fuchsia";
178   case IOS: return "ios";
179   case KFreeBSD: return "kfreebsd";
180   case Linux: return "linux";
181   case Lv2: return "lv2";
182   case MacOSX: return "macosx";
183   case NetBSD: return "netbsd";
184   case OpenBSD: return "openbsd";
185   case Solaris: return "solaris";
186   case Win32: return "windows";
187   case Haiku: return "haiku";
188   case Minix: return "minix";
189   case RTEMS: return "rtems";
190   case NaCl: return "nacl";
191   case CNK: return "cnk";
192   case Bitrig: return "bitrig";
193   case AIX: return "aix";
194   case CUDA: return "cuda";
195   case NVCL: return "nvcl";
196   case AMDHSA: return "amdhsa";
197   case PS4: return "ps4";
198   case ELFIAMCU: return "elfiamcu";
199   case TvOS: return "tvos";
200   case WatchOS: return "watchos";
201   case Mesa3D: return "mesa3d";
202   case Contiki: return "contiki";
203   }
204 
205   llvm_unreachable("Invalid OSType");
206 }
207 
208 StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
209   switch (Kind) {
210   case UnknownEnvironment: return "unknown";
211   case GNU: return "gnu";
212   case GNUABI64: return "gnuabi64";
213   case GNUEABIHF: return "gnueabihf";
214   case GNUEABI: return "gnueabi";
215   case GNUX32: return "gnux32";
216   case CODE16: return "code16";
217   case EABI: return "eabi";
218   case EABIHF: return "eabihf";
219   case Android: return "android";
220   case Musl: return "musl";
221   case MuslEABI: return "musleabi";
222   case MuslEABIHF: return "musleabihf";
223   case MSVC: return "msvc";
224   case Itanium: return "itanium";
225   case Cygnus: return "cygnus";
226   case AMDOpenCL: return "amdopencl";
227   case CoreCLR: return "coreclr";
228   case OpenCL: return "opencl";
229   }
230 
231   llvm_unreachable("Invalid EnvironmentType!");
232 }
233 
234 static Triple::ArchType parseBPFArch(StringRef ArchName) {
235   if (ArchName.equals("bpf")) {
236     if (sys::IsLittleEndianHost)
237       return Triple::bpfel;
238     else
239       return Triple::bpfeb;
240   } else if (ArchName.equals("bpf_be") || ArchName.equals("bpfeb")) {
241     return Triple::bpfeb;
242   } else if (ArchName.equals("bpf_le") || ArchName.equals("bpfel")) {
243     return Triple::bpfel;
244   } else {
245     return Triple::UnknownArch;
246   }
247 }
248 
249 Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
250   Triple::ArchType BPFArch(parseBPFArch(Name));
251   return StringSwitch<Triple::ArchType>(Name)
252     .Case("aarch64", aarch64)
253     .Case("aarch64_be", aarch64_be)
254     .Case("arm64", aarch64) // "arm64" is an alias for "aarch64"
255     .Case("arm", arm)
256     .Case("armeb", armeb)
257     .Case("avr", avr)
258     .StartsWith("bpf", BPFArch)
259     .Case("mips", mips)
260     .Case("mipsel", mipsel)
261     .Case("mips64", mips64)
262     .Case("mips64el", mips64el)
263     .Case("msp430", msp430)
264     .Case("ppc64", ppc64)
265     .Case("ppc32", ppc)
266     .Case("ppc", ppc)
267     .Case("ppc64le", ppc64le)
268     .Case("r600", r600)
269     .Case("amdgcn", amdgcn)
270     .Case("riscv32", riscv32)
271     .Case("riscv64", riscv64)
272     .Case("hexagon", hexagon)
273     .Case("sparc", sparc)
274     .Case("sparcel", sparcel)
275     .Case("sparcv9", sparcv9)
276     .Case("systemz", systemz)
277     .Case("tce", tce)
278     .Case("tcele", tcele)
279     .Case("thumb", thumb)
280     .Case("thumbeb", thumbeb)
281     .Case("x86", x86)
282     .Case("x86-64", x86_64)
283     .Case("xcore", xcore)
284     .Case("nvptx", nvptx)
285     .Case("nvptx64", nvptx64)
286     .Case("le32", le32)
287     .Case("le64", le64)
288     .Case("amdil", amdil)
289     .Case("amdil64", amdil64)
290     .Case("hsail", hsail)
291     .Case("hsail64", hsail64)
292     .Case("spir", spir)
293     .Case("spir64", spir64)
294     .Case("kalimba", kalimba)
295     .Case("lanai", lanai)
296     .Case("shave", shave)
297     .Case("wasm32", wasm32)
298     .Case("wasm64", wasm64)
299     .Case("renderscript32", renderscript32)
300     .Case("renderscript64", renderscript64)
301     .Default(UnknownArch);
302 }
303 
304 static Triple::ArchType parseARMArch(StringRef ArchName) {
305   unsigned ISA = ARM::parseArchISA(ArchName);
306   unsigned ENDIAN = ARM::parseArchEndian(ArchName);
307 
308   Triple::ArchType arch = Triple::UnknownArch;
309   switch (ENDIAN) {
310   case ARM::EK_LITTLE: {
311     switch (ISA) {
312     case ARM::IK_ARM:
313       arch = Triple::arm;
314       break;
315     case ARM::IK_THUMB:
316       arch = Triple::thumb;
317       break;
318     case ARM::IK_AARCH64:
319       arch = Triple::aarch64;
320       break;
321     }
322     break;
323   }
324   case ARM::EK_BIG: {
325     switch (ISA) {
326     case ARM::IK_ARM:
327       arch = Triple::armeb;
328       break;
329     case ARM::IK_THUMB:
330       arch = Triple::thumbeb;
331       break;
332     case ARM::IK_AARCH64:
333       arch = Triple::aarch64_be;
334       break;
335     }
336     break;
337   }
338   }
339 
340   ArchName = ARM::getCanonicalArchName(ArchName);
341   if (ArchName.empty())
342     return Triple::UnknownArch;
343 
344   // Thumb only exists in v4+
345   if (ISA == ARM::IK_THUMB &&
346       (ArchName.startswith("v2") || ArchName.startswith("v3")))
347     return Triple::UnknownArch;
348 
349   // Thumb only for v6m
350   unsigned Profile = ARM::parseArchProfile(ArchName);
351   unsigned Version = ARM::parseArchVersion(ArchName);
352   if (Profile == ARM::PK_M && Version == 6) {
353     if (ENDIAN == ARM::EK_BIG)
354       return Triple::thumbeb;
355     else
356       return Triple::thumb;
357   }
358 
359   return arch;
360 }
361 
362 static Triple::ArchType parseArch(StringRef ArchName) {
363   auto AT = StringSwitch<Triple::ArchType>(ArchName)
364     .Cases("i386", "i486", "i586", "i686", Triple::x86)
365     // FIXME: Do we need to support these?
366     .Cases("i786", "i886", "i986", Triple::x86)
367     .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64)
368     .Cases("powerpc", "ppc32", Triple::ppc)
369     .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64)
370     .Cases("powerpc64le", "ppc64le", Triple::ppc64le)
371     .Case("xscale", Triple::arm)
372     .Case("xscaleeb", Triple::armeb)
373     .Case("aarch64", Triple::aarch64)
374     .Case("aarch64_be", Triple::aarch64_be)
375     .Case("arm64", Triple::aarch64)
376     .Case("arm", Triple::arm)
377     .Case("armeb", Triple::armeb)
378     .Case("thumb", Triple::thumb)
379     .Case("thumbeb", Triple::thumbeb)
380     .Case("avr", Triple::avr)
381     .Case("msp430", Triple::msp430)
382     .Cases("mips", "mipseb", "mipsallegrex", Triple::mips)
383     .Cases("mipsel", "mipsallegrexel", Triple::mipsel)
384     .Cases("mips64", "mips64eb", Triple::mips64)
385     .Case("mips64el", Triple::mips64el)
386     .Case("r600", Triple::r600)
387     .Case("amdgcn", Triple::amdgcn)
388     .Case("riscv32", Triple::riscv32)
389     .Case("riscv64", Triple::riscv64)
390     .Case("hexagon", Triple::hexagon)
391     .Cases("s390x", "systemz", Triple::systemz)
392     .Case("sparc", Triple::sparc)
393     .Case("sparcel", Triple::sparcel)
394     .Cases("sparcv9", "sparc64", Triple::sparcv9)
395     .Case("tce", Triple::tce)
396     .Case("tcele", Triple::tcele)
397     .Case("xcore", Triple::xcore)
398     .Case("nvptx", Triple::nvptx)
399     .Case("nvptx64", Triple::nvptx64)
400     .Case("le32", Triple::le32)
401     .Case("le64", Triple::le64)
402     .Case("amdil", Triple::amdil)
403     .Case("amdil64", Triple::amdil64)
404     .Case("hsail", Triple::hsail)
405     .Case("hsail64", Triple::hsail64)
406     .Case("spir", Triple::spir)
407     .Case("spir64", Triple::spir64)
408     .StartsWith("kalimba", Triple::kalimba)
409     .Case("lanai", Triple::lanai)
410     .Case("shave", Triple::shave)
411     .Case("wasm32", Triple::wasm32)
412     .Case("wasm64", Triple::wasm64)
413     .Case("renderscript32", Triple::renderscript32)
414     .Case("renderscript64", Triple::renderscript64)
415     .Default(Triple::UnknownArch);
416 
417   // Some architectures require special parsing logic just to compute the
418   // ArchType result.
419   if (AT == Triple::UnknownArch) {
420     if (ArchName.startswith("arm") || ArchName.startswith("thumb") ||
421         ArchName.startswith("aarch64"))
422       return parseARMArch(ArchName);
423     if (ArchName.startswith("bpf"))
424       return parseBPFArch(ArchName);
425   }
426 
427   return AT;
428 }
429 
430 static Triple::VendorType parseVendor(StringRef VendorName) {
431   return StringSwitch<Triple::VendorType>(VendorName)
432     .Case("apple", Triple::Apple)
433     .Case("pc", Triple::PC)
434     .Case("scei", Triple::SCEI)
435     .Case("bgp", Triple::BGP)
436     .Case("bgq", Triple::BGQ)
437     .Case("fsl", Triple::Freescale)
438     .Case("ibm", Triple::IBM)
439     .Case("img", Triple::ImaginationTechnologies)
440     .Case("mti", Triple::MipsTechnologies)
441     .Case("nvidia", Triple::NVIDIA)
442     .Case("csr", Triple::CSR)
443     .Case("myriad", Triple::Myriad)
444     .Case("amd", Triple::AMD)
445     .Case("mesa", Triple::Mesa)
446     .Default(Triple::UnknownVendor);
447 }
448 
449 static Triple::OSType parseOS(StringRef OSName) {
450   return StringSwitch<Triple::OSType>(OSName)
451     .StartsWith("cloudabi", Triple::CloudABI)
452     .StartsWith("darwin", Triple::Darwin)
453     .StartsWith("dragonfly", Triple::DragonFly)
454     .StartsWith("freebsd", Triple::FreeBSD)
455     .StartsWith("fuchsia", Triple::Fuchsia)
456     .StartsWith("ios", Triple::IOS)
457     .StartsWith("kfreebsd", Triple::KFreeBSD)
458     .StartsWith("linux", Triple::Linux)
459     .StartsWith("lv2", Triple::Lv2)
460     .StartsWith("macosx", Triple::MacOSX)
461     .StartsWith("netbsd", Triple::NetBSD)
462     .StartsWith("openbsd", Triple::OpenBSD)
463     .StartsWith("solaris", Triple::Solaris)
464     .StartsWith("win32", Triple::Win32)
465     .StartsWith("windows", Triple::Win32)
466     .StartsWith("haiku", Triple::Haiku)
467     .StartsWith("minix", Triple::Minix)
468     .StartsWith("rtems", Triple::RTEMS)
469     .StartsWith("nacl", Triple::NaCl)
470     .StartsWith("cnk", Triple::CNK)
471     .StartsWith("bitrig", Triple::Bitrig)
472     .StartsWith("aix", Triple::AIX)
473     .StartsWith("cuda", Triple::CUDA)
474     .StartsWith("nvcl", Triple::NVCL)
475     .StartsWith("amdhsa", Triple::AMDHSA)
476     .StartsWith("ps4", Triple::PS4)
477     .StartsWith("elfiamcu", Triple::ELFIAMCU)
478     .StartsWith("tvos", Triple::TvOS)
479     .StartsWith("watchos", Triple::WatchOS)
480     .StartsWith("mesa3d", Triple::Mesa3D)
481     .StartsWith("contiki", Triple::Contiki)
482     .Default(Triple::UnknownOS);
483 }
484 
485 static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
486   return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
487     .StartsWith("eabihf", Triple::EABIHF)
488     .StartsWith("eabi", Triple::EABI)
489     .StartsWith("gnuabi64", Triple::GNUABI64)
490     .StartsWith("gnueabihf", Triple::GNUEABIHF)
491     .StartsWith("gnueabi", Triple::GNUEABI)
492     .StartsWith("gnux32", Triple::GNUX32)
493     .StartsWith("code16", Triple::CODE16)
494     .StartsWith("gnu", Triple::GNU)
495     .StartsWith("android", Triple::Android)
496     .StartsWith("musleabihf", Triple::MuslEABIHF)
497     .StartsWith("musleabi", Triple::MuslEABI)
498     .StartsWith("musl", Triple::Musl)
499     .StartsWith("msvc", Triple::MSVC)
500     .StartsWith("itanium", Triple::Itanium)
501     .StartsWith("cygnus", Triple::Cygnus)
502     .StartsWith("amdopencl", Triple::AMDOpenCL)
503     .StartsWith("coreclr", Triple::CoreCLR)
504     .StartsWith("opencl", Triple::OpenCL)
505     .Default(Triple::UnknownEnvironment);
506 }
507 
508 static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {
509   return StringSwitch<Triple::ObjectFormatType>(EnvironmentName)
510     .EndsWith("coff", Triple::COFF)
511     .EndsWith("elf", Triple::ELF)
512     .EndsWith("macho", Triple::MachO)
513     .EndsWith("wasm", Triple::Wasm)
514     .Default(Triple::UnknownObjectFormat);
515 }
516 
517 static Triple::SubArchType parseSubArch(StringRef SubArchName) {
518   StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
519 
520   // For now, this is the small part. Early return.
521   if (ARMSubArch.empty())
522     return StringSwitch<Triple::SubArchType>(SubArchName)
523       .EndsWith("kalimba3", Triple::KalimbaSubArch_v3)
524       .EndsWith("kalimba4", Triple::KalimbaSubArch_v4)
525       .EndsWith("kalimba5", Triple::KalimbaSubArch_v5)
526       .Default(Triple::NoSubArch);
527 
528   // ARM sub arch.
529   switch(ARM::parseArch(ARMSubArch)) {
530   case ARM::AK_ARMV4:
531     return Triple::NoSubArch;
532   case ARM::AK_ARMV4T:
533     return Triple::ARMSubArch_v4t;
534   case ARM::AK_ARMV5T:
535     return Triple::ARMSubArch_v5;
536   case ARM::AK_ARMV5TE:
537   case ARM::AK_IWMMXT:
538   case ARM::AK_IWMMXT2:
539   case ARM::AK_XSCALE:
540   case ARM::AK_ARMV5TEJ:
541     return Triple::ARMSubArch_v5te;
542   case ARM::AK_ARMV6:
543     return Triple::ARMSubArch_v6;
544   case ARM::AK_ARMV6K:
545   case ARM::AK_ARMV6KZ:
546     return Triple::ARMSubArch_v6k;
547   case ARM::AK_ARMV6T2:
548     return Triple::ARMSubArch_v6t2;
549   case ARM::AK_ARMV6M:
550     return Triple::ARMSubArch_v6m;
551   case ARM::AK_ARMV7A:
552   case ARM::AK_ARMV7R:
553     return Triple::ARMSubArch_v7;
554   case ARM::AK_ARMV7K:
555     return Triple::ARMSubArch_v7k;
556   case ARM::AK_ARMV7M:
557     return Triple::ARMSubArch_v7m;
558   case ARM::AK_ARMV7S:
559     return Triple::ARMSubArch_v7s;
560   case ARM::AK_ARMV7EM:
561     return Triple::ARMSubArch_v7em;
562   case ARM::AK_ARMV8A:
563     return Triple::ARMSubArch_v8;
564   case ARM::AK_ARMV8_1A:
565     return Triple::ARMSubArch_v8_1a;
566   case ARM::AK_ARMV8_2A:
567     return Triple::ARMSubArch_v8_2a;
568   case ARM::AK_ARMV8R:
569     return Triple::ARMSubArch_v8r;
570   case ARM::AK_ARMV8MBaseline:
571     return Triple::ARMSubArch_v8m_baseline;
572   case ARM::AK_ARMV8MMainline:
573     return Triple::ARMSubArch_v8m_mainline;
574   default:
575     return Triple::NoSubArch;
576   }
577 }
578 
579 static StringRef getObjectFormatTypeName(Triple::ObjectFormatType Kind) {
580   switch (Kind) {
581   case Triple::UnknownObjectFormat: return "";
582   case Triple::COFF: return "coff";
583   case Triple::ELF: return "elf";
584   case Triple::MachO: return "macho";
585   case Triple::Wasm: return "wasm";
586   }
587   llvm_unreachable("unknown object format type");
588 }
589 
590 static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
591   switch (T.getArch()) {
592   case Triple::UnknownArch:
593   case Triple::aarch64:
594   case Triple::arm:
595   case Triple::thumb:
596   case Triple::x86:
597   case Triple::x86_64:
598     if (T.isOSDarwin())
599       return Triple::MachO;
600     else if (T.isOSWindows())
601       return Triple::COFF;
602     return Triple::ELF;
603 
604   case Triple::aarch64_be:
605   case Triple::amdgcn:
606   case Triple::amdil:
607   case Triple::amdil64:
608   case Triple::armeb:
609   case Triple::avr:
610   case Triple::bpfeb:
611   case Triple::bpfel:
612   case Triple::hexagon:
613   case Triple::lanai:
614   case Triple::hsail:
615   case Triple::hsail64:
616   case Triple::kalimba:
617   case Triple::le32:
618   case Triple::le64:
619   case Triple::mips:
620   case Triple::mips64:
621   case Triple::mips64el:
622   case Triple::mipsel:
623   case Triple::msp430:
624   case Triple::nvptx:
625   case Triple::nvptx64:
626   case Triple::ppc64le:
627   case Triple::r600:
628   case Triple::renderscript32:
629   case Triple::renderscript64:
630   case Triple::riscv32:
631   case Triple::riscv64:
632   case Triple::shave:
633   case Triple::sparc:
634   case Triple::sparcel:
635   case Triple::sparcv9:
636   case Triple::spir:
637   case Triple::spir64:
638   case Triple::systemz:
639   case Triple::tce:
640   case Triple::tcele:
641   case Triple::thumbeb:
642   case Triple::wasm32:
643   case Triple::wasm64:
644   case Triple::xcore:
645     return Triple::ELF;
646 
647   case Triple::ppc:
648   case Triple::ppc64:
649     if (T.isOSDarwin())
650       return Triple::MachO;
651     return Triple::ELF;
652   }
653   llvm_unreachable("unknown architecture");
654 }
655 
656 /// \brief Construct a triple from the string representation provided.
657 ///
658 /// This stores the string representation and parses the various pieces into
659 /// enum members.
660 Triple::Triple(const Twine &Str)
661     : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch),
662       Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment),
663       ObjectFormat(UnknownObjectFormat) {
664   // Do minimal parsing by hand here.
665   SmallVector<StringRef, 4> Components;
666   StringRef(Data).split(Components, '-', /*MaxSplit*/ 3);
667   if (Components.size() > 0) {
668     Arch = parseArch(Components[0]);
669     SubArch = parseSubArch(Components[0]);
670     if (Components.size() > 1) {
671       Vendor = parseVendor(Components[1]);
672       if (Components.size() > 2) {
673         OS = parseOS(Components[2]);
674         if (Components.size() > 3) {
675           Environment = parseEnvironment(Components[3]);
676           ObjectFormat = parseFormat(Components[3]);
677         }
678       }
679     }
680   }
681   if (ObjectFormat == UnknownObjectFormat)
682     ObjectFormat = getDefaultFormat(*this);
683 }
684 
685 /// \brief Construct a triple from string representations of the architecture,
686 /// vendor, and OS.
687 ///
688 /// This joins each argument into a canonical string representation and parses
689 /// them into enum members. It leaves the environment unknown and omits it from
690 /// the string representation.
691 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
692     : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
693       Arch(parseArch(ArchStr.str())),
694       SubArch(parseSubArch(ArchStr.str())),
695       Vendor(parseVendor(VendorStr.str())),
696       OS(parseOS(OSStr.str())),
697       Environment(), ObjectFormat(Triple::UnknownObjectFormat) {
698   ObjectFormat = getDefaultFormat(*this);
699 }
700 
701 /// \brief Construct a triple from string representations of the architecture,
702 /// vendor, OS, and environment.
703 ///
704 /// This joins each argument into a canonical string representation and parses
705 /// them into enum members.
706 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
707                const Twine &EnvironmentStr)
708     : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
709             EnvironmentStr).str()),
710       Arch(parseArch(ArchStr.str())),
711       SubArch(parseSubArch(ArchStr.str())),
712       Vendor(parseVendor(VendorStr.str())),
713       OS(parseOS(OSStr.str())),
714       Environment(parseEnvironment(EnvironmentStr.str())),
715       ObjectFormat(parseFormat(EnvironmentStr.str())) {
716   if (ObjectFormat == Triple::UnknownObjectFormat)
717     ObjectFormat = getDefaultFormat(*this);
718 }
719 
720 std::string Triple::normalize(StringRef Str) {
721   bool IsMinGW32 = false;
722   bool IsCygwin = false;
723 
724   // Parse into components.
725   SmallVector<StringRef, 4> Components;
726   Str.split(Components, '-');
727 
728   // If the first component corresponds to a known architecture, preferentially
729   // use it for the architecture.  If the second component corresponds to a
730   // known vendor, preferentially use it for the vendor, etc.  This avoids silly
731   // component movement when a component parses as (eg) both a valid arch and a
732   // valid os.
733   ArchType Arch = UnknownArch;
734   if (Components.size() > 0)
735     Arch = parseArch(Components[0]);
736   VendorType Vendor = UnknownVendor;
737   if (Components.size() > 1)
738     Vendor = parseVendor(Components[1]);
739   OSType OS = UnknownOS;
740   if (Components.size() > 2) {
741     OS = parseOS(Components[2]);
742     IsCygwin = Components[2].startswith("cygwin");
743     IsMinGW32 = Components[2].startswith("mingw");
744   }
745   EnvironmentType Environment = UnknownEnvironment;
746   if (Components.size() > 3)
747     Environment = parseEnvironment(Components[3]);
748   ObjectFormatType ObjectFormat = UnknownObjectFormat;
749   if (Components.size() > 4)
750     ObjectFormat = parseFormat(Components[4]);
751 
752   // Note which components are already in their final position.  These will not
753   // be moved.
754   bool Found[4];
755   Found[0] = Arch != UnknownArch;
756   Found[1] = Vendor != UnknownVendor;
757   Found[2] = OS != UnknownOS;
758   Found[3] = Environment != UnknownEnvironment;
759 
760   // If they are not there already, permute the components into their canonical
761   // positions by seeing if they parse as a valid architecture, and if so moving
762   // the component to the architecture position etc.
763   for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
764     if (Found[Pos])
765       continue; // Already in the canonical position.
766 
767     for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
768       // Do not reparse any components that already matched.
769       if (Idx < array_lengthof(Found) && Found[Idx])
770         continue;
771 
772       // Does this component parse as valid for the target position?
773       bool Valid = false;
774       StringRef Comp = Components[Idx];
775       switch (Pos) {
776       default: llvm_unreachable("unexpected component type!");
777       case 0:
778         Arch = parseArch(Comp);
779         Valid = Arch != UnknownArch;
780         break;
781       case 1:
782         Vendor = parseVendor(Comp);
783         Valid = Vendor != UnknownVendor;
784         break;
785       case 2:
786         OS = parseOS(Comp);
787         IsCygwin = Comp.startswith("cygwin");
788         IsMinGW32 = Comp.startswith("mingw");
789         Valid = OS != UnknownOS || IsCygwin || IsMinGW32;
790         break;
791       case 3:
792         Environment = parseEnvironment(Comp);
793         Valid = Environment != UnknownEnvironment;
794         if (!Valid) {
795           ObjectFormat = parseFormat(Comp);
796           Valid = ObjectFormat != UnknownObjectFormat;
797         }
798         break;
799       }
800       if (!Valid)
801         continue; // Nope, try the next component.
802 
803       // Move the component to the target position, pushing any non-fixed
804       // components that are in the way to the right.  This tends to give
805       // good results in the common cases of a forgotten vendor component
806       // or a wrongly positioned environment.
807       if (Pos < Idx) {
808         // Insert left, pushing the existing components to the right.  For
809         // example, a-b-i386 -> i386-a-b when moving i386 to the front.
810         StringRef CurrentComponent(""); // The empty component.
811         // Replace the component we are moving with an empty component.
812         std::swap(CurrentComponent, Components[Idx]);
813         // Insert the component being moved at Pos, displacing any existing
814         // components to the right.
815         for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
816           // Skip over any fixed components.
817           while (i < array_lengthof(Found) && Found[i])
818             ++i;
819           // Place the component at the new position, getting the component
820           // that was at this position - it will be moved right.
821           std::swap(CurrentComponent, Components[i]);
822         }
823       } else if (Pos > Idx) {
824         // Push right by inserting empty components until the component at Idx
825         // reaches the target position Pos.  For example, pc-a -> -pc-a when
826         // moving pc to the second position.
827         do {
828           // Insert one empty component at Idx.
829           StringRef CurrentComponent(""); // The empty component.
830           for (unsigned i = Idx; i < Components.size();) {
831             // Place the component at the new position, getting the component
832             // that was at this position - it will be moved right.
833             std::swap(CurrentComponent, Components[i]);
834             // If it was placed on top of an empty component then we are done.
835             if (CurrentComponent.empty())
836               break;
837             // Advance to the next component, skipping any fixed components.
838             while (++i < array_lengthof(Found) && Found[i])
839               ;
840           }
841           // The last component was pushed off the end - append it.
842           if (!CurrentComponent.empty())
843             Components.push_back(CurrentComponent);
844 
845           // Advance Idx to the component's new position.
846           while (++Idx < array_lengthof(Found) && Found[Idx])
847             ;
848         } while (Idx < Pos); // Add more until the final position is reached.
849       }
850       assert(Pos < Components.size() && Components[Pos] == Comp &&
851              "Component moved wrong!");
852       Found[Pos] = true;
853       break;
854     }
855   }
856 
857   // Special case logic goes here.  At this point Arch, Vendor and OS have the
858   // correct values for the computed components.
859   std::string NormalizedEnvironment;
860   if (Environment == Triple::Android && Components[3].startswith("androideabi")) {
861     StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));
862     if (AndroidVersion.empty()) {
863       Components[3] = "android";
864     } else {
865       NormalizedEnvironment = Twine("android", AndroidVersion).str();
866       Components[3] = NormalizedEnvironment;
867     }
868   }
869 
870   if (OS == Triple::Win32) {
871     Components.resize(4);
872     Components[2] = "windows";
873     if (Environment == UnknownEnvironment) {
874       if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)
875         Components[3] = "msvc";
876       else
877         Components[3] = getObjectFormatTypeName(ObjectFormat);
878     }
879   } else if (IsMinGW32) {
880     Components.resize(4);
881     Components[2] = "windows";
882     Components[3] = "gnu";
883   } else if (IsCygwin) {
884     Components.resize(4);
885     Components[2] = "windows";
886     Components[3] = "cygnus";
887   }
888   if (IsMinGW32 || IsCygwin ||
889       (OS == Triple::Win32 && Environment != UnknownEnvironment)) {
890     if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {
891       Components.resize(5);
892       Components[4] = getObjectFormatTypeName(ObjectFormat);
893     }
894   }
895 
896   // Stick the corrected components back together to form the normalized string.
897   std::string Normalized;
898   for (unsigned i = 0, e = Components.size(); i != e; ++i) {
899     if (i) Normalized += '-';
900     Normalized += Components[i];
901   }
902   return Normalized;
903 }
904 
905 StringRef Triple::getArchName() const {
906   return StringRef(Data).split('-').first;           // Isolate first component
907 }
908 
909 StringRef Triple::getVendorName() const {
910   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
911   return Tmp.split('-').first;                       // Isolate second component
912 }
913 
914 StringRef Triple::getOSName() const {
915   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
916   Tmp = Tmp.split('-').second;                       // Strip second component
917   return Tmp.split('-').first;                       // Isolate third component
918 }
919 
920 StringRef Triple::getEnvironmentName() const {
921   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
922   Tmp = Tmp.split('-').second;                       // Strip second component
923   return Tmp.split('-').second;                      // Strip third component
924 }
925 
926 StringRef Triple::getOSAndEnvironmentName() const {
927   StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
928   return Tmp.split('-').second;                      // Strip second component
929 }
930 
931 static unsigned EatNumber(StringRef &Str) {
932   assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
933   unsigned Result = 0;
934 
935   do {
936     // Consume the leading digit.
937     Result = Result*10 + (Str[0] - '0');
938 
939     // Eat the digit.
940     Str = Str.substr(1);
941   } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
942 
943   return Result;
944 }
945 
946 static void parseVersionFromName(StringRef Name, unsigned &Major,
947                                  unsigned &Minor, unsigned &Micro) {
948   // Any unset version defaults to 0.
949   Major = Minor = Micro = 0;
950 
951   // Parse up to three components.
952   unsigned *Components[3] = {&Major, &Minor, &Micro};
953   for (unsigned i = 0; i != 3; ++i) {
954     if (Name.empty() || Name[0] < '0' || Name[0] > '9')
955       break;
956 
957     // Consume the leading number.
958     *Components[i] = EatNumber(Name);
959 
960     // Consume the separator, if present.
961     if (Name.startswith("."))
962       Name = Name.substr(1);
963   }
964 }
965 
966 void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor,
967                                    unsigned &Micro) const {
968   StringRef EnvironmentName = getEnvironmentName();
969   StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
970   if (EnvironmentName.startswith(EnvironmentTypeName))
971     EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size());
972 
973   parseVersionFromName(EnvironmentName, Major, Minor, Micro);
974 }
975 
976 void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
977                           unsigned &Micro) const {
978   StringRef OSName = getOSName();
979   // Assume that the OS portion of the triple starts with the canonical name.
980   StringRef OSTypeName = getOSTypeName(getOS());
981   if (OSName.startswith(OSTypeName))
982     OSName = OSName.substr(OSTypeName.size());
983 
984   parseVersionFromName(OSName, Major, Minor, Micro);
985 }
986 
987 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
988                               unsigned &Micro) const {
989   getOSVersion(Major, Minor, Micro);
990 
991   switch (getOS()) {
992   default: llvm_unreachable("unexpected OS for Darwin triple");
993   case Darwin:
994     // Default to darwin8, i.e., MacOSX 10.4.
995     if (Major == 0)
996       Major = 8;
997     // Darwin version numbers are skewed from OS X versions.
998     if (Major < 4)
999       return false;
1000     Micro = 0;
1001     Minor = Major - 4;
1002     Major = 10;
1003     break;
1004   case MacOSX:
1005     // Default to 10.4.
1006     if (Major == 0) {
1007       Major = 10;
1008       Minor = 4;
1009     }
1010     if (Major != 10)
1011       return false;
1012     break;
1013   case IOS:
1014   case TvOS:
1015   case WatchOS:
1016     // Ignore the version from the triple.  This is only handled because the
1017     // the clang driver combines OS X and IOS support into a common Darwin
1018     // toolchain that wants to know the OS X version number even when targeting
1019     // IOS.
1020     Major = 10;
1021     Minor = 4;
1022     Micro = 0;
1023     break;
1024   }
1025   return true;
1026 }
1027 
1028 void Triple::getiOSVersion(unsigned &Major, unsigned &Minor,
1029                            unsigned &Micro) const {
1030   switch (getOS()) {
1031   default: llvm_unreachable("unexpected OS for Darwin triple");
1032   case Darwin:
1033   case MacOSX:
1034     // Ignore the version from the triple.  This is only handled because the
1035     // the clang driver combines OS X and IOS support into a common Darwin
1036     // toolchain that wants to know the iOS version number even when targeting
1037     // OS X.
1038     Major = 5;
1039     Minor = 0;
1040     Micro = 0;
1041     break;
1042   case IOS:
1043   case TvOS:
1044     getOSVersion(Major, Minor, Micro);
1045     // Default to 5.0 (or 7.0 for arm64).
1046     if (Major == 0)
1047       Major = (getArch() == aarch64) ? 7 : 5;
1048     break;
1049   case WatchOS:
1050     llvm_unreachable("conflicting triple info");
1051   }
1052 }
1053 
1054 void Triple::getWatchOSVersion(unsigned &Major, unsigned &Minor,
1055                                unsigned &Micro) const {
1056   switch (getOS()) {
1057   default: llvm_unreachable("unexpected OS for Darwin triple");
1058   case Darwin:
1059   case MacOSX:
1060     // Ignore the version from the triple.  This is only handled because the
1061     // the clang driver combines OS X and IOS support into a common Darwin
1062     // toolchain that wants to know the iOS version number even when targeting
1063     // OS X.
1064     Major = 2;
1065     Minor = 0;
1066     Micro = 0;
1067     break;
1068   case WatchOS:
1069     getOSVersion(Major, Minor, Micro);
1070     if (Major == 0)
1071       Major = 2;
1072     break;
1073   case IOS:
1074     llvm_unreachable("conflicting triple info");
1075   }
1076 }
1077 
1078 void Triple::setTriple(const Twine &Str) {
1079   *this = Triple(Str);
1080 }
1081 
1082 void Triple::setArch(ArchType Kind) {
1083   setArchName(getArchTypeName(Kind));
1084 }
1085 
1086 void Triple::setVendor(VendorType Kind) {
1087   setVendorName(getVendorTypeName(Kind));
1088 }
1089 
1090 void Triple::setOS(OSType Kind) {
1091   setOSName(getOSTypeName(Kind));
1092 }
1093 
1094 void Triple::setEnvironment(EnvironmentType Kind) {
1095   if (ObjectFormat == getDefaultFormat(*this))
1096     return setEnvironmentName(getEnvironmentTypeName(Kind));
1097 
1098   setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") +
1099                       getObjectFormatTypeName(ObjectFormat)).str());
1100 }
1101 
1102 void Triple::setObjectFormat(ObjectFormatType Kind) {
1103   if (Environment == UnknownEnvironment)
1104     return setEnvironmentName(getObjectFormatTypeName(Kind));
1105 
1106   setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +
1107                       getObjectFormatTypeName(Kind)).str());
1108 }
1109 
1110 void Triple::setArchName(StringRef Str) {
1111   // Work around a miscompilation bug for Twines in gcc 4.0.3.
1112   SmallString<64> Triple;
1113   Triple += Str;
1114   Triple += "-";
1115   Triple += getVendorName();
1116   Triple += "-";
1117   Triple += getOSAndEnvironmentName();
1118   setTriple(Triple);
1119 }
1120 
1121 void Triple::setVendorName(StringRef Str) {
1122   setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
1123 }
1124 
1125 void Triple::setOSName(StringRef Str) {
1126   if (hasEnvironment())
1127     setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
1128               "-" + getEnvironmentName());
1129   else
1130     setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1131 }
1132 
1133 void Triple::setEnvironmentName(StringRef Str) {
1134   setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
1135             "-" + Str);
1136 }
1137 
1138 void Triple::setOSAndEnvironmentName(StringRef Str) {
1139   setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
1140 }
1141 
1142 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
1143   switch (Arch) {
1144   case llvm::Triple::UnknownArch:
1145     return 0;
1146 
1147   case llvm::Triple::avr:
1148   case llvm::Triple::msp430:
1149     return 16;
1150 
1151   case llvm::Triple::arm:
1152   case llvm::Triple::armeb:
1153   case llvm::Triple::hexagon:
1154   case llvm::Triple::le32:
1155   case llvm::Triple::mips:
1156   case llvm::Triple::mipsel:
1157   case llvm::Triple::nvptx:
1158   case llvm::Triple::ppc:
1159   case llvm::Triple::r600:
1160   case llvm::Triple::riscv32:
1161   case llvm::Triple::sparc:
1162   case llvm::Triple::sparcel:
1163   case llvm::Triple::tce:
1164   case llvm::Triple::tcele:
1165   case llvm::Triple::thumb:
1166   case llvm::Triple::thumbeb:
1167   case llvm::Triple::x86:
1168   case llvm::Triple::xcore:
1169   case llvm::Triple::amdil:
1170   case llvm::Triple::hsail:
1171   case llvm::Triple::spir:
1172   case llvm::Triple::kalimba:
1173   case llvm::Triple::lanai:
1174   case llvm::Triple::shave:
1175   case llvm::Triple::wasm32:
1176   case llvm::Triple::renderscript32:
1177     return 32;
1178 
1179   case llvm::Triple::aarch64:
1180   case llvm::Triple::aarch64_be:
1181   case llvm::Triple::amdgcn:
1182   case llvm::Triple::bpfel:
1183   case llvm::Triple::bpfeb:
1184   case llvm::Triple::le64:
1185   case llvm::Triple::mips64:
1186   case llvm::Triple::mips64el:
1187   case llvm::Triple::nvptx64:
1188   case llvm::Triple::ppc64:
1189   case llvm::Triple::ppc64le:
1190   case llvm::Triple::riscv64:
1191   case llvm::Triple::sparcv9:
1192   case llvm::Triple::systemz:
1193   case llvm::Triple::x86_64:
1194   case llvm::Triple::amdil64:
1195   case llvm::Triple::hsail64:
1196   case llvm::Triple::spir64:
1197   case llvm::Triple::wasm64:
1198   case llvm::Triple::renderscript64:
1199     return 64;
1200   }
1201   llvm_unreachable("Invalid architecture value");
1202 }
1203 
1204 bool Triple::isArch64Bit() const {
1205   return getArchPointerBitWidth(getArch()) == 64;
1206 }
1207 
1208 bool Triple::isArch32Bit() const {
1209   return getArchPointerBitWidth(getArch()) == 32;
1210 }
1211 
1212 bool Triple::isArch16Bit() const {
1213   return getArchPointerBitWidth(getArch()) == 16;
1214 }
1215 
1216 Triple Triple::get32BitArchVariant() const {
1217   Triple T(*this);
1218   switch (getArch()) {
1219   case Triple::UnknownArch:
1220   case Triple::amdgcn:
1221   case Triple::avr:
1222   case Triple::bpfel:
1223   case Triple::bpfeb:
1224   case Triple::msp430:
1225   case Triple::systemz:
1226   case Triple::ppc64le:
1227     T.setArch(UnknownArch);
1228     break;
1229 
1230   case Triple::amdil:
1231   case Triple::hsail:
1232   case Triple::spir:
1233   case Triple::arm:
1234   case Triple::armeb:
1235   case Triple::hexagon:
1236   case Triple::kalimba:
1237   case Triple::le32:
1238   case Triple::mips:
1239   case Triple::mipsel:
1240   case Triple::nvptx:
1241   case Triple::ppc:
1242   case Triple::r600:
1243   case Triple::riscv32:
1244   case Triple::sparc:
1245   case Triple::sparcel:
1246   case Triple::tce:
1247   case Triple::tcele:
1248   case Triple::thumb:
1249   case Triple::thumbeb:
1250   case Triple::x86:
1251   case Triple::xcore:
1252   case Triple::lanai:
1253   case Triple::shave:
1254   case Triple::wasm32:
1255   case Triple::renderscript32:
1256     // Already 32-bit.
1257     break;
1258 
1259   case Triple::aarch64:        T.setArch(Triple::arm);     break;
1260   case Triple::aarch64_be:     T.setArch(Triple::armeb);   break;
1261   case Triple::le64:           T.setArch(Triple::le32);    break;
1262   case Triple::mips64:         T.setArch(Triple::mips);    break;
1263   case Triple::mips64el:       T.setArch(Triple::mipsel);  break;
1264   case Triple::nvptx64:        T.setArch(Triple::nvptx);   break;
1265   case Triple::ppc64:          T.setArch(Triple::ppc);     break;
1266   case Triple::sparcv9:        T.setArch(Triple::sparc);   break;
1267   case Triple::riscv64:        T.setArch(Triple::riscv32); break;
1268   case Triple::x86_64:         T.setArch(Triple::x86);     break;
1269   case Triple::amdil64:        T.setArch(Triple::amdil);   break;
1270   case Triple::hsail64:        T.setArch(Triple::hsail);   break;
1271   case Triple::spir64:         T.setArch(Triple::spir);    break;
1272   case Triple::wasm64:         T.setArch(Triple::wasm32);  break;
1273   case Triple::renderscript64: T.setArch(Triple::renderscript32); break;
1274   }
1275   return T;
1276 }
1277 
1278 Triple Triple::get64BitArchVariant() const {
1279   Triple T(*this);
1280   switch (getArch()) {
1281   case Triple::UnknownArch:
1282   case Triple::avr:
1283   case Triple::hexagon:
1284   case Triple::kalimba:
1285   case Triple::lanai:
1286   case Triple::msp430:
1287   case Triple::r600:
1288   case Triple::tce:
1289   case Triple::tcele:
1290   case Triple::xcore:
1291   case Triple::sparcel:
1292   case Triple::shave:
1293     T.setArch(UnknownArch);
1294     break;
1295 
1296   case Triple::aarch64:
1297   case Triple::aarch64_be:
1298   case Triple::bpfel:
1299   case Triple::bpfeb:
1300   case Triple::le64:
1301   case Triple::amdil64:
1302   case Triple::amdgcn:
1303   case Triple::hsail64:
1304   case Triple::spir64:
1305   case Triple::mips64:
1306   case Triple::mips64el:
1307   case Triple::nvptx64:
1308   case Triple::ppc64:
1309   case Triple::ppc64le:
1310   case Triple::riscv64:
1311   case Triple::sparcv9:
1312   case Triple::systemz:
1313   case Triple::x86_64:
1314   case Triple::wasm64:
1315   case Triple::renderscript64:
1316     // Already 64-bit.
1317     break;
1318 
1319   case Triple::arm:             T.setArch(Triple::aarch64);    break;
1320   case Triple::armeb:           T.setArch(Triple::aarch64_be); break;
1321   case Triple::le32:            T.setArch(Triple::le64);       break;
1322   case Triple::mips:            T.setArch(Triple::mips64);     break;
1323   case Triple::mipsel:          T.setArch(Triple::mips64el);   break;
1324   case Triple::nvptx:           T.setArch(Triple::nvptx64);    break;
1325   case Triple::ppc:             T.setArch(Triple::ppc64);      break;
1326   case Triple::sparc:           T.setArch(Triple::sparcv9);    break;
1327   case Triple::riscv32:         T.setArch(Triple::riscv64);    break;
1328   case Triple::x86:             T.setArch(Triple::x86_64);     break;
1329   case Triple::amdil:           T.setArch(Triple::amdil64);    break;
1330   case Triple::hsail:           T.setArch(Triple::hsail64);    break;
1331   case Triple::spir:            T.setArch(Triple::spir64);     break;
1332   case Triple::thumb:           T.setArch(Triple::aarch64);    break;
1333   case Triple::thumbeb:         T.setArch(Triple::aarch64_be); break;
1334   case Triple::wasm32:          T.setArch(Triple::wasm64);     break;
1335   case Triple::renderscript32:  T.setArch(Triple::renderscript64);     break;
1336   }
1337   return T;
1338 }
1339 
1340 Triple Triple::getBigEndianArchVariant() const {
1341   Triple T(*this);
1342   // Already big endian.
1343   if (!isLittleEndian())
1344     return T;
1345   switch (getArch()) {
1346   case Triple::UnknownArch:
1347   case Triple::amdgcn:
1348   case Triple::amdil64:
1349   case Triple::amdil:
1350   case Triple::avr:
1351   case Triple::hexagon:
1352   case Triple::hsail64:
1353   case Triple::hsail:
1354   case Triple::kalimba:
1355   case Triple::le32:
1356   case Triple::le64:
1357   case Triple::msp430:
1358   case Triple::nvptx64:
1359   case Triple::nvptx:
1360   case Triple::r600:
1361   case Triple::riscv32:
1362   case Triple::riscv64:
1363   case Triple::shave:
1364   case Triple::spir64:
1365   case Triple::spir:
1366   case Triple::wasm32:
1367   case Triple::wasm64:
1368   case Triple::x86:
1369   case Triple::x86_64:
1370   case Triple::xcore:
1371   case Triple::renderscript32:
1372   case Triple::renderscript64:
1373 
1374   // ARM is intentionally unsupported here, changing the architecture would
1375   // drop any arch suffixes.
1376   case Triple::arm:
1377   case Triple::thumb:
1378     T.setArch(UnknownArch);
1379     break;
1380 
1381   case Triple::tcele:   T.setArch(Triple::tce);        break;
1382   case Triple::aarch64: T.setArch(Triple::aarch64_be); break;
1383   case Triple::bpfel:   T.setArch(Triple::bpfeb);      break;
1384   case Triple::mips64el:T.setArch(Triple::mips64);     break;
1385   case Triple::mipsel:  T.setArch(Triple::mips);       break;
1386   case Triple::ppc64le: T.setArch(Triple::ppc64);      break;
1387   case Triple::sparcel: T.setArch(Triple::sparc);      break;
1388   default:
1389     llvm_unreachable("getBigEndianArchVariant: unknown triple.");
1390   }
1391   return T;
1392 }
1393 
1394 Triple Triple::getLittleEndianArchVariant() const {
1395   Triple T(*this);
1396   if (isLittleEndian())
1397     return T;
1398 
1399   switch (getArch()) {
1400   case Triple::UnknownArch:
1401   case Triple::lanai:
1402   case Triple::ppc:
1403   case Triple::sparcv9:
1404   case Triple::systemz:
1405 
1406   // ARM is intentionally unsupported here, changing the architecture would
1407   // drop any arch suffixes.
1408   case Triple::armeb:
1409   case Triple::thumbeb:
1410     T.setArch(UnknownArch);
1411     break;
1412 
1413   case Triple::tce:        T.setArch(Triple::tcele);    break;
1414   case Triple::aarch64_be: T.setArch(Triple::aarch64);  break;
1415   case Triple::bpfeb:      T.setArch(Triple::bpfel);    break;
1416   case Triple::mips64:     T.setArch(Triple::mips64el); break;
1417   case Triple::mips:       T.setArch(Triple::mipsel);   break;
1418   case Triple::ppc64:      T.setArch(Triple::ppc64le);  break;
1419   case Triple::sparc:      T.setArch(Triple::sparcel);  break;
1420   default:
1421     llvm_unreachable("getLittleEndianArchVariant: unknown triple.");
1422   }
1423   return T;
1424 }
1425 
1426 bool Triple::isLittleEndian() const {
1427   switch (getArch()) {
1428   case Triple::aarch64:
1429   case Triple::amdgcn:
1430   case Triple::amdil64:
1431   case Triple::amdil:
1432   case Triple::arm:
1433   case Triple::avr:
1434   case Triple::bpfel:
1435   case Triple::hexagon:
1436   case Triple::hsail64:
1437   case Triple::hsail:
1438   case Triple::kalimba:
1439   case Triple::le32:
1440   case Triple::le64:
1441   case Triple::mips64el:
1442   case Triple::mipsel:
1443   case Triple::msp430:
1444   case Triple::nvptx64:
1445   case Triple::nvptx:
1446   case Triple::ppc64le:
1447   case Triple::r600:
1448   case Triple::riscv32:
1449   case Triple::riscv64:
1450   case Triple::shave:
1451   case Triple::sparcel:
1452   case Triple::spir64:
1453   case Triple::spir:
1454   case Triple::thumb:
1455   case Triple::wasm32:
1456   case Triple::wasm64:
1457   case Triple::x86:
1458   case Triple::x86_64:
1459   case Triple::xcore:
1460   case Triple::tcele:
1461   case Triple::renderscript32:
1462   case Triple::renderscript64:
1463     return true;
1464   default:
1465     return false;
1466   }
1467 }
1468 
1469 StringRef Triple::getARMCPUForArch(StringRef MArch) const {
1470   if (MArch.empty())
1471     MArch = getArchName();
1472   MArch = ARM::getCanonicalArchName(MArch);
1473 
1474   // Some defaults are forced.
1475   switch (getOS()) {
1476   case llvm::Triple::FreeBSD:
1477   case llvm::Triple::NetBSD:
1478     if (!MArch.empty() && MArch == "v6")
1479       return "arm1176jzf-s";
1480     break;
1481   case llvm::Triple::Win32:
1482     // FIXME: this is invalid for WindowsCE
1483     return "cortex-a9";
1484   case llvm::Triple::MacOSX:
1485   case llvm::Triple::IOS:
1486   case llvm::Triple::WatchOS:
1487   case llvm::Triple::TvOS:
1488     if (MArch == "v7k")
1489       return "cortex-a7";
1490     break;
1491   default:
1492     break;
1493   }
1494 
1495   if (MArch.empty())
1496     return StringRef();
1497 
1498   StringRef CPU = ARM::getDefaultCPU(MArch);
1499   if (!CPU.empty())
1500     return CPU;
1501 
1502   // If no specific architecture version is requested, return the minimum CPU
1503   // required by the OS and environment.
1504   switch (getOS()) {
1505   case llvm::Triple::NetBSD:
1506     switch (getEnvironment()) {
1507     case llvm::Triple::GNUEABIHF:
1508     case llvm::Triple::GNUEABI:
1509     case llvm::Triple::EABIHF:
1510     case llvm::Triple::EABI:
1511       return "arm926ej-s";
1512     default:
1513       return "strongarm";
1514     }
1515   case llvm::Triple::NaCl:
1516     return "cortex-a8";
1517   default:
1518     switch (getEnvironment()) {
1519     case llvm::Triple::EABIHF:
1520     case llvm::Triple::GNUEABIHF:
1521     case llvm::Triple::MuslEABIHF:
1522       return "arm1176jzf-s";
1523     default:
1524       return "arm7tdmi";
1525     }
1526   }
1527 
1528   llvm_unreachable("invalid arch name");
1529 }
1530