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