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