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