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