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