Triple.cpp revision 124e51c0d2b521b0fb3aaaf2443403cd451b7857
123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//===--- Triple.cpp - Target triple helper class --------------------------===//
223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//                     The LLVM Compiler Infrastructure
423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// This file is distributed under the University of Illinois Open Source
623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// License. See LICENSE.TXT for details.
723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//===----------------------------------------------------------------------===//
923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include "llvm/ADT/Triple.h"
110b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin#include "llvm/ADT/SmallString.h"
1206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth#include "llvm/ADT/StringSwitch.h"
135754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands#include "llvm/ADT/STLExtras.h"
144d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie#include "llvm/Support/ErrorHandling.h"
1570748756427c115b9344c7ce7759ff7041ce879bMikhail Glushenkov#include <cstring>
1623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarusing namespace llvm;
1723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getArchTypeName(ArchType Kind) {
1923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
2023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownArch: return "unknown";
21e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
226337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case arm:     return "arm";
236337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case cellspu: return "cellspu";
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  case hexagon: return "hexagon";
256337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case mips:    return "mips";
266337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case mipsel:  return "mipsel";
2770303688bc489a316cb0892499ac4024088fa58aAkira Hatanaka  case mips64:  return "mips64";
2870303688bc489a316cb0892499ac4024088fa58aAkira Hatanaka  case mips64el:return "mips64el";
296337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case msp430:  return "msp430";
308c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case ppc64:   return "powerpc64";
318c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case ppc:     return "powerpc";
326337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case sparc:   return "sparc";
3387c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  case sparcv9: return "sparcv9";
3474db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  case tce:     return "tce";
356337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case thumb:   return "thumb";
366337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86:     return "i386";
376337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86_64:  return "x86_64";
388c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case xcore:   return "xcore";
39a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  case mblaze:  return "mblaze";
40e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx32:   return "ptx32";
41e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx64:   return "ptx64";
4238fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin  case le32:    return "le32";
4305d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser  case amdil:   return "amdil";
4423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
4523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
464d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid ArchType!");
4723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
4823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
49688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbarconst char *Triple::getArchTypePrefix(ArchType Kind) {
50688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  switch (Kind) {
51688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  default:
52688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar    return 0;
53688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
54688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case arm:
55688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case thumb:   return "arm";
56688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
57688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case cellspu: return "spu";
58688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
59688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case ppc64:
60688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case ppc:     return "ppc";
61688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
62a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  case mblaze:  return "mblaze";
63a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  case hexagon:   return "hexagon";
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
6687c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  case sparcv9:
67688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case sparc:   return "sparc";
68688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
69688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86:
70688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86_64:  return "x86";
71f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
72688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case xcore:   return "xcore";
73f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
74e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx32:   return "ptx";
75e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx64:   return "ptx";
7638fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin  case le32:    return "le32";
7705d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser  case amdil:   return "amdil";
78688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  }
79688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar}
80688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
8123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) {
8223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
8323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownVendor: return "unknown";
8423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
8523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Apple: return "apple";
8656ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner  case PC: return "pc";
876046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson  case SCEI: return "scei";
8823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
8923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
904d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid VendorType!");
9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
9223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) {
9423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
9523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownOS: return "unknown";
9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
97852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  case AuroraUX: return "auroraux";
986337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Cygwin: return "cygwin";
9923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Darwin: return "darwin";
1007eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar  case DragonFly: return "dragonfly";
10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case FreeBSD: return "freebsd";
1020dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar  case IOS: return "ios";
103652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands  case KFreeBSD: return "kfreebsd";
10423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Linux: return "linux";
105cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan  case Lv2: return "lv2";
1061af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar  case MacOSX: return "macosx";
1076337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case MinGW32: return "mingw32";
108b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner  case NetBSD: return "netbsd";
109cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands  case OpenBSD: return "openbsd";
110e0fb75d5864c0eef0464b216ac46bc1642469508Edward O'Callaghan  case Psp: return "psp";
111fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  case Solaris: return "solaris";
1126337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Win32: return "win32";
113a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner  case Haiku: return "haiku";
11429269d03af6dc3feb69d0230831a059f39c03700Chris Lattner  case Minix: return "minix";
1156ced1d12dd7ee18d65a6df6e66c9662753a5876dDouglas Gregor  case RTEMS: return "rtems";
116fb23462889ff2dcd016a4b4169ebce94a878218eIvan Krasin  case NativeClient: return "nacl";
11723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
11823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1194d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid OSType");
12023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
12123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1225754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsconst char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
1235754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  switch (Kind) {
1245754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  case UnknownEnvironment: return "unknown";
125859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case GNU: return "gnu";
1268887a0f34152b63a84e759b76694d6928d01b4eeRafael Espindola  case GNUEABIHF: return "gnueabihf";
127859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case GNUEABI: return "gnueabi";
128859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case EABI: return "eabi";
1292bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng  case MachO: return "macho";
130fd553c2cb54ee01d56f5d80d70a5d52220286fccChandler Carruth  case ANDROIDEABI: return "androideabi";
1315754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  }
1325754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
1334d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid EnvironmentType!");
1345754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
1355754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
1362928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
13706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<Triple::ArchType>(Name)
13806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("arm", arm)
13906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("cellspu", cellspu)
14006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips", mips)
14106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mipsel", mipsel)
14206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips64", mips64)
14306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips64el", mips64el)
14406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("msp430", msp430)
14506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc64", ppc64)
14606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc32", ppc)
14706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc", ppc)
14806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mblaze", mblaze)
14906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("hexagon", hexagon)
15006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("sparc", sparc)
15106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("sparcv9", sparcv9)
15206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("tce", tce)
15306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("thumb", thumb)
15406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86", x86)
15506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86-64", x86_64)
15606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("xcore", xcore)
15706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx32", ptx32)
15806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx64", ptx64)
15906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("le32", le32)
16006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("amdil", amdil)
16106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(UnknownArch);
1623c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar}
1633c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
1642928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) {
165baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
166baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // archs which Darwin doesn't use.
167baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
168baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // The matching this routine does is fairly pointless, since it is neither the
169baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // complete architecture list, nor a reasonable subset. The problem is that
170baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // historically the driver driver accepts this and also ties its -march=
171baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // handling to the architecture name, so we need to be careful before removing
172baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // support for it.
173baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
174ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar  // This code must be kept in sync with Clang's Darwin specific argument
175ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar  // translation.
176ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar
17706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<ArchType>(Str)
17806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", Triple::ppc)
17906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", Triple::ppc)
18006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc64", Triple::ppc64)
18106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("i386", "i486", "i486SX", "i586", "i686", Triple::x86)
18206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
18306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth           Triple::x86)
18406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86_64", Triple::x86_64)
18506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    // This is derived from the driver driver.
18606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("arm", "armv4t", "armv5", "armv6", Triple::arm)
18706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", Triple::arm)
18806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx32", Triple::ptx32)
18906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx64", Triple::ptx64)
19006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("amdil", Triple::amdil)
19106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(Triple::UnknownArch);
192baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar}
193baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
194bbdca3f68edce8b2cc409ed71d256b4dbb0c56adDuncan Sands// Returns architecture name that is understood by the target assembler.
19551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzovconst char *Triple::getArchNameForAssembler() {
196e1fe09f6826f158def69cff89f3ce4e67e199bb5Daniel Dunbar  if (!isOSDarwin() && getVendor() != Triple::Apple)
19751cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return NULL;
19851cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov
19906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<const char*>(getArchName())
20006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("i386", "i386")
20106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86_64", "x86_64")
20206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("powerpc", "ppc")
20306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("powerpc64", "ppc64")
20406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("mblaze", "microblaze", "mblaze")
20506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("arm", "arm")
20606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv4t", "thumbv4t", "armv4t")
20706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv5", "armv5e", "thumbv5", "thumbv5e", "armv5")
20806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv6", "thumbv6", "armv6")
20906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv7", "thumbv7", "armv7")
21006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx32", "ptx32")
21106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx64", "ptx64")
21206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("le32", "le32")
21306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("amdil", "amdil")
21406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(NULL);
21551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov}
21651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov
217335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::ArchType Triple::ParseArch(StringRef ArchName) {
21806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<ArchType>(ArchName)
21906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("i386", "i486", "i586", "i686", x86)
22006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("i786", "i886", "i986", x86) // FIXME: Do we need to support these?
22106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("amd64", "x86_64", x86_64)
22206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("powerpc", ppc)
22306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("powerpc64", "ppu", ppc64)
22406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mblaze", mblaze)
22506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("arm", "xscale", arm)
2260a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth    // FIXME: It would be good to replace these with explicit names for all the
2270a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth    // various suffixes supported.
2280a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth    .StartsWith("armv", arm)
22906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("thumb", thumb)
2300a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth    .StartsWith("thumbv", thumb)
23106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("spu", "cellspu", cellspu)
23206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("msp430", msp430)
23306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("mips", "mipseb", "mipsallegrex", mips)
23406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("mipsel", "mipsallegrexel", "psp", mipsel)
23506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("mips64", "mips64eb", mips64)
23606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips64el", mips64el)
23706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("hexagon", hexagon)
23806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("sparc", sparc)
23906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("sparcv9", sparcv9)
24006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("tce", tce)
24106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("xcore", xcore)
24206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx32", ptx32)
24306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ptx64", ptx64)
24406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("le32", le32)
24506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("amdil", amdil)
24606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(UnknownArch);
247335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
248651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
249335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::VendorType Triple::ParseVendor(StringRef VendorName) {
25006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<VendorType>(VendorName)
25106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("apple", Apple)
25206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("pc", PC)
25306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("scei", SCEI)
25406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(UnknownVendor);
255335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
25623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
257335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::OSType Triple::ParseOS(StringRef OSName) {
25861c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer  return StringSwitch<OSType>(OSName)
25961c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("auroraux", AuroraUX)
26061c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("cygwin", Cygwin)
26161c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("darwin", Darwin)
26261c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("dragonfly", DragonFly)
26361c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("freebsd", FreeBSD)
26461c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("ios", IOS)
26561c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("kfreebsd", KFreeBSD)
26661c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("linux", Linux)
26761c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("lv2", Lv2)
26861c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("macosx", MacOSX)
26961c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("mingw32", MinGW32)
27061c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("netbsd", NetBSD)
27161c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("openbsd", OpenBSD)
27261c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("psp", Psp)
27361c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("solaris", Solaris)
27461c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("win32", Win32)
27561c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("haiku", Haiku)
27661c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("minix", Minix)
27761c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("rtems", RTEMS)
27861c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("nacl", NativeClient)
27961c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .Default(UnknownOS);
280335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
281335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
2825754a4525625a67a6c9b4f63512ea9db6997bf05Duncan SandsTriple::EnvironmentType Triple::ParseEnvironment(StringRef EnvironmentName) {
28361c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer  return StringSwitch<EnvironmentType>(EnvironmentName)
28461c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("eabi", EABI)
28561c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("gnueabihf", GNUEABIHF)
28661c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("gnueabi", GNUEABI)
28761c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("gnu", GNU)
28861c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("macho", MachO)
28961c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .StartsWith("androideabi", ANDROIDEABI)
29061c2c128f7ebed525f153fb518d362f52b710ee8Benjamin Kramer    .Default(UnknownEnvironment);
2915754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
2925754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
293cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from the string representation provided.
294cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth///
295cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// This doesn't actually parse the string representation eagerly. Instead it
296cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// stores it, and tracks the fact that it hasn't been parsed. The first time
297cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// any of the structural queries are made, the string is parsed and the
298cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// results cached in various members.
299124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler CarruthTriple::Triple(const Twine &Str)
300124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth    : Data(Str.str()),
301124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Arch(ParseArch(getArchName())),
302124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Vendor(ParseVendor(getVendorName())),
303124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      OS(ParseOS(getOSName())),
304124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Environment(ParseEnvironment(getEnvironmentName())) {
305124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth}
306cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth
307cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture,
308cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, and OS.
309cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth///
310cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// This doesn't actually use these already distinct strings to setup the
311cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// triple information. Instead it joins them into a canonical form of a triple
312cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// string, and lazily parses it on use.
313cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
314cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth    : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
315124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Arch(ParseArch(ArchStr.str())),
316124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Vendor(ParseVendor(VendorStr.str())),
317124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      OS(ParseOS(OSStr.str())),
318124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Environment() {
319cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth}
320cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth
321cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture,
322cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, OS, and environment.
323cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth///
324cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// This doesn't actually use these already distinct strings to setup the
325cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// triple information. Instead it joins them into a canonical form of a triple
326cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// string, and lazily parses it on use.
327cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
328cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth               const Twine &EnvironmentStr)
329cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth    : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
330cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth            EnvironmentStr).str()),
331124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Arch(ParseArch(ArchStr.str())),
332124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Vendor(ParseVendor(VendorStr.str())),
333124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      OS(ParseOS(OSStr.str())),
334124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Environment(ParseEnvironment(EnvironmentStr.str())) {
335cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth}
336cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth
337335db223926931db204bf54d4accac6677b8e6b1Duncan Sandsstd::string Triple::normalize(StringRef Str) {
338335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Parse into components.
339335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  SmallVector<StringRef, 4> Components;
340335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  for (size_t First = 0, Last = 0; Last != StringRef::npos; First = Last + 1) {
341335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    Last = Str.find('-', First);
342335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    Components.push_back(Str.slice(First, Last));
343335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  }
344335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
345335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // If the first component corresponds to a known architecture, preferentially
346335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // use it for the architecture.  If the second component corresponds to a
347335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // known vendor, preferentially use it for the vendor, etc.  This avoids silly
348335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // component movement when a component parses as (eg) both a valid arch and a
349335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // valid os.
350335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  ArchType Arch = UnknownArch;
351335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  if (Components.size() > 0)
352335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    Arch = ParseArch(Components[0]);
353335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  VendorType Vendor = UnknownVendor;
354335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  if (Components.size() > 1)
355335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    Vendor = ParseVendor(Components[1]);
356335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  OSType OS = UnknownOS;
357335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  if (Components.size() > 2)
358335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    OS = ParseOS(Components[2]);
3595754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  EnvironmentType Environment = UnknownEnvironment;
3605754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  if (Components.size() > 3)
3615754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands    Environment = ParseEnvironment(Components[3]);
362335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
363335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Note which components are already in their final position.  These will not
364335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // be moved.
3655754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  bool Found[4];
366335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  Found[0] = Arch != UnknownArch;
367335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  Found[1] = Vendor != UnknownVendor;
368335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  Found[2] = OS != UnknownOS;
3695754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  Found[3] = Environment != UnknownEnvironment;
370335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
371335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // If they are not there already, permute the components into their canonical
372335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // positions by seeing if they parse as a valid architecture, and if so moving
373335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // the component to the architecture position etc.
3745754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
375335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    if (Found[Pos])
376335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      continue; // Already in the canonical position.
377335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
378335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
379335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // Do not reparse any components that already matched.
3805754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands      if (Idx < array_lengthof(Found) && Found[Idx])
381335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        continue;
382335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
383335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // Does this component parse as valid for the target position?
384335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      bool Valid = false;
385335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      StringRef Comp = Components[Idx];
386335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      switch (Pos) {
387858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("unexpected component type!");
388335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      case 0:
389335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        Arch = ParseArch(Comp);
390335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        Valid = Arch != UnknownArch;
391335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        break;
392335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      case 1:
393335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        Vendor = ParseVendor(Comp);
394335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        Valid = Vendor != UnknownVendor;
395335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        break;
396335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      case 2:
397335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        OS = ParseOS(Comp);
398ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands        Valid = OS != UnknownOS;
399335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        break;
4005754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands      case 3:
4015754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands        Environment = ParseEnvironment(Comp);
4025754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands        Valid = Environment != UnknownEnvironment;
4035754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands        break;
404335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      }
405335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      if (!Valid)
406335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        continue; // Nope, try the next component.
407335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
408335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // Move the component to the target position, pushing any non-fixed
409335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // components that are in the way to the right.  This tends to give
410335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // good results in the common cases of a forgotten vendor component
411335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // or a wrongly positioned environment.
412335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      if (Pos < Idx) {
413335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Insert left, pushing the existing components to the right.  For
414335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // example, a-b-i386 -> i386-a-b when moving i386 to the front.
415335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        StringRef CurrentComponent(""); // The empty component.
416335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Replace the component we are moving with an empty component.
417335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        std::swap(CurrentComponent, Components[Idx]);
418335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Insert the component being moved at Pos, displacing any existing
419335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // components to the right.
420335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
421335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Skip over any fixed components.
4225754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands          while (i < array_lengthof(Found) && Found[i]) ++i;
423335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Place the component at the new position, getting the component
424335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // that was at this position - it will be moved right.
425335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          std::swap(CurrentComponent, Components[i]);
426335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        }
427335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      } else if (Pos > Idx) {
428335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Push right by inserting empty components until the component at Idx
429335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // reaches the target position Pos.  For example, pc-a -> -pc-a when
430335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // moving pc to the second position.
431335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        do {
432335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Insert one empty component at Idx.
433335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          StringRef CurrentComponent(""); // The empty component.
434ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands          for (unsigned i = Idx; i < Components.size();) {
435335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            // Place the component at the new position, getting the component
436335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            // that was at this position - it will be moved right.
437335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            std::swap(CurrentComponent, Components[i]);
438335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            // If it was placed on top of an empty component then we are done.
439335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            if (CurrentComponent.empty())
440335db223926931db204bf54d4accac6677b8e6b1Duncan Sands              break;
441ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands            // Advance to the next component, skipping any fixed components.
44215ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson            while (++i < array_lengthof(Found) && Found[i])
44315ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson              ;
444335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          }
445335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // The last component was pushed off the end - append it.
446335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          if (!CurrentComponent.empty())
447335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            Components.push_back(CurrentComponent);
448335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
449335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Advance Idx to the component's new position.
4505754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands          while (++Idx < array_lengthof(Found) && Found[Idx]) {}
451335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        } while (Idx < Pos); // Add more until the final position is reached.
452335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      }
453335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      assert(Pos < Components.size() && Components[Pos] == Comp &&
454335db223926931db204bf54d4accac6677b8e6b1Duncan Sands             "Component moved wrong!");
455335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      Found[Pos] = true;
456335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      break;
457335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    }
458335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  }
459335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
460335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Special case logic goes here.  At this point Arch, Vendor and OS have the
461335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // correct values for the computed components.
462335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
463335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Stick the corrected components back together to form the normalized string.
464335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  std::string Normalized;
465335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  for (unsigned i = 0, e = Components.size(); i != e; ++i) {
466335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    if (i) Normalized += '-';
467335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    Normalized += Components[i];
468335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  }
469335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  return Normalized;
470335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
471335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
472a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getArchName() const {
473a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return StringRef(Data).split('-').first;           // Isolate first component
47423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
47523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
476a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getVendorName() const {
477a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
478a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').first;                       // Isolate second component
47923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
48023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
481a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSName() const {
482a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
483a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Tmp = Tmp.split('-').second;                       // Strip second component
484a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').first;                       // Isolate third component
48523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
48623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
487a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getEnvironmentName() const {
488a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
489a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Tmp = Tmp.split('-').second;                       // Strip second component
490a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').second;                      // Strip third component
49123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
49223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
493a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSAndEnvironmentName() const {
494a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
495a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').second;                      // Strip second component
49623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
49723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
498dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnerstatic unsigned EatNumber(StringRef &Str) {
499dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
500087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  unsigned Result = 0;
501e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
502087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  do {
503087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    // Consume the leading digit.
504dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    Result = Result*10 + (Str[0] - '0');
505087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar
506dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    // Eat the digit.
507dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    Str = Str.substr(1);
508087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
509e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
510dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  return Result;
511dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner}
512dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
513087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbarvoid Triple::getOSVersion(unsigned &Major, unsigned &Minor,
514087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar                          unsigned &Micro) const {
515dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  StringRef OSName = getOSName();
516dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
517087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  // Assume that the OS portion of the triple starts with the canonical name.
518087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  StringRef OSTypeName = getOSTypeName(getOS());
519087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  if (OSName.startswith(OSTypeName))
520087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    OSName = OSName.substr(OSTypeName.size());
521e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
522087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  // Any unset version defaults to 0.
523087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  Major = Minor = Micro = 0;
524e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
525087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  // Parse up to three components.
526087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  unsigned *Components[3] = { &Major, &Minor, &Micro };
527087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  for (unsigned i = 0; i != 3; ++i) {
528087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
529087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar      break;
530e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
531087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    // Consume the leading number.
532087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    *Components[i] = EatNumber(OSName);
533dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
534087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    // Consume the separator, if present.
535087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    if (OSName.startswith("."))
536087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar      OSName = OSName.substr(1);
537087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  }
538dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner}
539dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
540bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilsonbool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
541bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson                              unsigned &Micro) const {
542bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  getOSVersion(Major, Minor, Micro);
543bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson
544bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  switch (getOS()) {
545858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  default: llvm_unreachable("unexpected OS for Darwin triple");
546bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  case Darwin:
547bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Default to darwin8, i.e., MacOSX 10.4.
548bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major == 0)
549bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      Major = 8;
550bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Darwin version numbers are skewed from OS X versions.
551bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major < 4)
552bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      return false;
553bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Micro = 0;
554bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Minor = Major - 4;
555bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Major = 10;
556bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    break;
557bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  case MacOSX:
558bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Default to 10.4.
559bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major == 0) {
560bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      Major = 10;
561bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      Minor = 4;
562bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    }
563bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major != 10)
564bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      return false;
565bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    break;
566bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  case IOS:
567bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Ignore the version from the triple.  This is only handled because the
568bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // the clang driver combines OS X and IOS support into a common Darwin
569bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // toolchain that wants to know the OS X version number even when targeting
570bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // IOS.
571bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Major = 10;
572bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Minor = 4;
573bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Micro = 0;
574bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    break;
575bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  }
576bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  return true;
577bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson}
578bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson
579a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setTriple(const Twine &Str) {
580124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth  *this = Triple(Str);
58123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
58223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
58323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) {
58423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setArchName(getArchTypeName(Kind));
58523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
58623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
58723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) {
58823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setVendorName(getVendorTypeName(Kind));
58923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
59023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
59123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) {
59223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setOSName(getOSTypeName(Kind));
59323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
59423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
5955754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsvoid Triple::setEnvironment(EnvironmentType Kind) {
5965754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  setEnvironmentName(getEnvironmentTypeName(Kind));
5975754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
5985754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
5992928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setArchName(StringRef Str) {
6000b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  // Work around a miscompilation bug for Twines in gcc 4.0.3.
6010b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  SmallString<64> Triple;
6020b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += Str;
6030b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += "-";
6040b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += getVendorName();
6050b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += "-";
6060b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += getOSAndEnvironmentName();
6070b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  setTriple(Triple.str());
60823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
60923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6102928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setVendorName(StringRef Str) {
61123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
61223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
61323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6142928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSName(StringRef Str) {
61523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (hasEnvironment())
61623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
61723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar              "-" + getEnvironmentName());
61823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
61923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
62023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
62123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6222928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setEnvironmentName(StringRef Str) {
6232928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
62423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar            "-" + Str);
62523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
62623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6272928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSAndEnvironmentName(StringRef Str) {
62823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
62923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
6306f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6316f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthstatic unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
6326f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  switch (Arch) {
6336f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::UnknownArch:
6346f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 0;
6356f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6366f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::msp430:
6376f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 16;
6386f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6396f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::amdil:
6406f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::arm:
6416f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::cellspu:
6426f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::hexagon:
6436f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::le32:
6446f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mblaze:
6456f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mips:
6466f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mipsel:
6476f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::ppc:
6486f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::ptx32:
6496f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::sparc:
6506f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::tce:
6516f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::thumb:
6526f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::x86:
6536f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::xcore:
6546f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 32;
6556f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6566f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mips64:
6576f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mips64el:
6586f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::ppc64:
6596f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::ptx64:
6606f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::sparcv9:
6616f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::x86_64:
6626f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 64;
6636f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  }
6646f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  llvm_unreachable("Invalid architecture value");
6656f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
6666f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6676f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch64Bit() const {
6686f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  return getArchPointerBitWidth(getArch()) == 64;
6696f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
6706f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6716f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch32Bit() const {
6726f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  return getArchPointerBitWidth(getArch()) == 32;
6736f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
6746f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6756f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch16Bit() const {
6766f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  return getArchPointerBitWidth(getArch()) == 16;
6776f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
6787d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
6797d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get32BitArchVariant() const {
6807d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  Triple T(*this);
6817d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  switch (getArch()) {
6827d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::UnknownArch:
6837d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::msp430:
6847d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    T.setArch(UnknownArch);
6857d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
6867d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
6877d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::amdil:
6887d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::arm:
6897d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::cellspu:
6907d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::hexagon:
6917d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::le32:
6927d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mblaze:
6937d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips:
6947d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mipsel:
6957d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc:
6967d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ptx32:
6977d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparc:
6987d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::tce:
6997d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::thumb:
7007d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86:
7017d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::xcore:
7027d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    // Already 32-bit.
7037d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7047d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7057d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64:    T.setArch(Triple::mips);    break;
7067d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64el:  T.setArch(Triple::mipsel);  break;
7077d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc64:     T.setArch(Triple::ppc);   break;
7087d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ptx64:     T.setArch(Triple::ptx32);   break;
7097d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparcv9:   T.setArch(Triple::sparc);   break;
7107d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86_64:    T.setArch(Triple::x86);     break;
7117d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  }
7127d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  return T;
7137d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth}
7147d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7157d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get64BitArchVariant() const {
7167d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  Triple T(*this);
7177d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  switch (getArch()) {
7187d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::UnknownArch:
7197d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::amdil:
7207d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::arm:
7217d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::cellspu:
7227d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::hexagon:
7237d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::le32:
7247d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mblaze:
7257d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::msp430:
7267d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::tce:
7277d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::thumb:
7287d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::xcore:
7297d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    T.setArch(UnknownArch);
7307d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7317d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7327d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64:
7337d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64el:
7347d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc64:
7357d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ptx64:
7367d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparcv9:
7377d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86_64:
7387d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    // Already 64-bit.
7397d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7407d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7417d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips:    T.setArch(Triple::mips64);    break;
7427d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mipsel:  T.setArch(Triple::mips64el);  break;
7437d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc:     T.setArch(Triple::ppc64);     break;
7447d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ptx32:   T.setArch(Triple::ptx64);     break;
7457d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparc:   T.setArch(Triple::sparcv9);   break;
7467d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86:     T.setArch(Triple::x86_64);    break;
7477d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  }
7487d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  return T;
7497d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth}
750