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