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"
11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h"
120b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin#include "llvm/ADT/SmallString.h"
1306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth#include "llvm/ADT/StringSwitch.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
2272062f5744557e270a38192554c3126ea5f97434Tim Northover  case aarch64: return "aarch64";
236337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case arm:     return "arm";
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";
327415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov  case r600:    return "r600";
336337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case sparc:   return "sparc";
3487c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  case sparcv9: return "sparcv9";
3574db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  case tce:     return "tce";
366337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case thumb:   return "thumb";
376337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86:     return "i386";
386337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86_64:  return "x86_64";
398c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case xcore:   return "xcore";
40a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  case mblaze:  return "mblaze";
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case nvptx:   return "nvptx";
4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case nvptx64: return "nvptx64";
4338fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin  case le32:    return "le32";
4405d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser  case amdil:   return "amdil";
45e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow  case spir:    return "spir";
46ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case spir64:  return "spir64";
4723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
4823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
494d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid ArchType!");
5023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
5123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
52688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbarconst char *Triple::getArchTypePrefix(ArchType Kind) {
53688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  switch (Kind) {
54688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  default:
55688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar    return 0;
56688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
5772062f5744557e270a38192554c3126ea5f97434Tim Northover  case aarch64: return "aarch64";
5872062f5744557e270a38192554c3126ea5f97434Tim Northover
59688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case arm:
60688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case thumb:   return "arm";
61688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
62688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case ppc64:
63688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case ppc:     return "ppc";
64688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
65a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  case mblaze:  return "mblaze";
66a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck
67d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer  case mips:
68d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer  case mipsel:
69d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer  case mips64:
70d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer  case mips64el:return "mips";
71d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer
72d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer  case hexagon: return "hexagon";
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
747415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov  case r600:    return "r600";
757415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov
7687c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  case sparcv9:
77688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case sparc:   return "sparc";
78688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
79688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86:
80688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86_64:  return "x86";
81f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
82688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case xcore:   return "xcore";
83f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case nvptx:   return "nvptx";
8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case nvptx64: return "nvptx";
8638fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin  case le32:    return "le32";
8705d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser  case amdil:   return "amdil";
88e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow  case spir:    return "spir";
89ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case spir64:  return "spir";
90688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  }
91688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar}
92688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) {
9423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
9523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownVendor: return "unknown";
9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
9723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Apple: return "apple";
9856ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner  case PC: return "pc";
996046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson  case SCEI: return "scei";
100a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel  case BGP: return "bgp";
101a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel  case BGQ: return "bgq";
102d939cd68f40e6fa0ccd6bee6391374b66abd71a1Hal Finkel  case Freescale: return "fsl";
1032e522d05278a69cf75b41dcd4b358e46b5350425Duncan Sands  case IBM: return "ibm";
10423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
10523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1064d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid VendorType!");
10723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
10823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
10923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) {
11023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
11123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownOS: return "unknown";
11223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
113852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  case AuroraUX: return "auroraux";
1146337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Cygwin: return "cygwin";
11523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Darwin: return "darwin";
1167eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar  case DragonFly: return "dragonfly";
11723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case FreeBSD: return "freebsd";
1180dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar  case IOS: return "ios";
119652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands  case KFreeBSD: return "kfreebsd";
12023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Linux: return "linux";
121cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan  case Lv2: return "lv2";
1221af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar  case MacOSX: return "macosx";
1236337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case MinGW32: return "mingw32";
124b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner  case NetBSD: return "netbsd";
125cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands  case OpenBSD: return "openbsd";
126fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  case Solaris: return "solaris";
1276337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Win32: return "win32";
128a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner  case Haiku: return "haiku";
12929269d03af6dc3feb69d0230831a059f39c03700Chris Lattner  case Minix: return "minix";
1306ced1d12dd7ee18d65a6df6e66c9662753a5876dDouglas Gregor  case RTEMS: return "rtems";
131f659c0de6c7a4684a2a30c344ce6827ea87032d8Eli Bendersky  case NaCl: return "nacl";
132a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel  case CNK: return "cnk";
133b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher  case Bitrig: return "bitrig";
1342e522d05278a69cf75b41dcd4b358e46b5350425Duncan Sands  case AIX: return "aix";
13523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
13623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1374d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid OSType");
13823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
13923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1405754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsconst char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
1415754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  switch (Kind) {
1425754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  case UnknownEnvironment: return "unknown";
143859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case GNU: return "gnu";
1448887a0f34152b63a84e759b76694d6928d01b4eeRafael Espindola  case GNUEABIHF: return "gnueabihf";
145859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case GNUEABI: return "gnueabi";
1469dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky  case GNUX32: return "gnux32";
147859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case EABI: return "eabi";
1482bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng  case MachO: return "macho";
14943bf70986bb13c812e87ca959dd8f2dd9edf802cLogan Chien  case Android: return "android";
1507bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor  case ELF: return "elf";
1515754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  }
1525754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
1534d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid EnvironmentType!");
1545754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
1555754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
1562928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
15706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<Triple::ArchType>(Name)
15872062f5744557e270a38192554c3126ea5f97434Tim Northover    .Case("aarch64", aarch64)
15906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("arm", arm)
16006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips", mips)
16106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mipsel", mipsel)
16206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips64", mips64)
16306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mips64el", mips64el)
16406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("msp430", msp430)
16506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc64", ppc64)
16606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc32", ppc)
16706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("ppc", ppc)
16806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("mblaze", mblaze)
1697415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov    .Case("r600", r600)
17006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("hexagon", hexagon)
17106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("sparc", sparc)
17206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("sparcv9", sparcv9)
17306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("tce", tce)
17406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("thumb", thumb)
17506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86", x86)
17606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86-64", x86_64)
17706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("xcore", xcore)
17849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    .Case("nvptx", nvptx)
17949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    .Case("nvptx64", nvptx64)
18006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("le32", le32)
18106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("amdil", amdil)
182e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow    .Case("spir", spir)
183ac39a035351a20928e087617e412aa6ce510181fGuy Benyei    .Case("spir64", spir64)
18406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(UnknownArch);
1853c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar}
1863c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
187bbdca3f68edce8b2cc409ed71d256b4dbb0c56adDuncan Sands// Returns architecture name that is understood by the target assembler.
18851cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzovconst char *Triple::getArchNameForAssembler() {
189e1fe09f6826f158def69cff89f3ce4e67e199bb5Daniel Dunbar  if (!isOSDarwin() && getVendor() != Triple::Apple)
19051cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return NULL;
19151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov
19206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth  return StringSwitch<const char*>(getArchName())
19306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("i386", "i386")
19406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("x86_64", "x86_64")
19506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("powerpc", "ppc")
19606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("powerpc64", "ppc64")
19706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("mblaze", "microblaze", "mblaze")
19806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("arm", "arm")
19906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv4t", "thumbv4t", "armv4t")
20006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv5", "armv5e", "thumbv5", "thumbv5e", "armv5")
20106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv6", "thumbv6", "armv6")
20206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Cases("armv7", "thumbv7", "armv7")
2037415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov    .Case("r600", "r600")
20449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    .Case("nvptx", "nvptx")
20549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    .Case("nvptx64", "nvptx64")
20606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("le32", "le32")
20706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Case("amdil", "amdil")
208e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow    .Case("spir", "spir")
209ac39a035351a20928e087617e412aa6ce510181fGuy Benyei    .Case("spir64", "spir64")
21006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth    .Default(NULL);
21151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov}
21251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov
2134fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::ArchType parseArch(StringRef ArchName) {
2144fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth  return StringSwitch<Triple::ArchType>(ArchName)
2154fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("i386", "i486", "i586", "i686", Triple::x86)
2164fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    // FIXME: Do we need to support these?
2174fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("i786", "i886", "i986", Triple::x86)
2184fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("amd64", "x86_64", Triple::x86_64)
2194fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("powerpc", Triple::ppc)
2204fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("powerpc64", "ppu", Triple::ppc64)
2214fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("mblaze", Triple::mblaze)
22272062f5744557e270a38192554c3126ea5f97434Tim Northover    .Case("aarch64", Triple::aarch64)
2234fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("arm", "xscale", Triple::arm)
2240a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth    // FIXME: It would be good to replace these with explicit names for all the
2250a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth    // various suffixes supported.
2264fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("armv", Triple::arm)
2274fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("thumb", Triple::thumb)
2284fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("thumbv", Triple::thumb)
2294fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("msp430", Triple::msp430)
2304fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("mips", "mipseb", "mipsallegrex", Triple::mips)
231fdf0dc9e0bb5c0b848286e6c96bfc9a390d26775Chandler Carruth    .Cases("mipsel", "mipsallegrexel", Triple::mipsel)
2324fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Cases("mips64", "mips64eb", Triple::mips64)
2334fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("mips64el", Triple::mips64el)
2347415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov    .Case("r600", Triple::r600)
2354fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("hexagon", Triple::hexagon)
2364fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("sparc", Triple::sparc)
2374fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("sparcv9", Triple::sparcv9)
2384fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("tce", Triple::tce)
2394fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("xcore", Triple::xcore)
24049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    .Case("nvptx", Triple::nvptx)
24149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    .Case("nvptx64", Triple::nvptx64)
2424fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("le32", Triple::le32)
2434fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("amdil", Triple::amdil)
244e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow    .Case("spir", Triple::spir)
245ac39a035351a20928e087617e412aa6ce510181fGuy Benyei    .Case("spir64", Triple::spir64)
2464fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Default(Triple::UnknownArch);
247335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
248651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
2494fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::VendorType parseVendor(StringRef VendorName) {
2504fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth  return StringSwitch<Triple::VendorType>(VendorName)
2514fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("apple", Triple::Apple)
2524fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("pc", Triple::PC)
2534fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Case("scei", Triple::SCEI)
254a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel    .Case("bgp", Triple::BGP)
255a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel    .Case("bgq", Triple::BGQ)
256d939cd68f40e6fa0ccd6bee6391374b66abd71a1Hal Finkel    .Case("fsl", Triple::Freescale)
2572e522d05278a69cf75b41dcd4b358e46b5350425Duncan Sands    .Case("ibm", Triple::IBM)
2584fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Default(Triple::UnknownVendor);
259335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
26023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
2614fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::OSType parseOS(StringRef OSName) {
2624fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth  return StringSwitch<Triple::OSType>(OSName)
2634fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("auroraux", Triple::AuroraUX)
2644fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("cygwin", Triple::Cygwin)
2654fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("darwin", Triple::Darwin)
2664fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("dragonfly", Triple::DragonFly)
2674fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("freebsd", Triple::FreeBSD)
2684fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("ios", Triple::IOS)
2694fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("kfreebsd", Triple::KFreeBSD)
2704fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("linux", Triple::Linux)
2714fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("lv2", Triple::Lv2)
2724fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("macosx", Triple::MacOSX)
2734fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("mingw32", Triple::MinGW32)
2744fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("netbsd", Triple::NetBSD)
2754fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("openbsd", Triple::OpenBSD)
2764fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("solaris", Triple::Solaris)
2774fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("win32", Triple::Win32)
2784fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("haiku", Triple::Haiku)
2794fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("minix", Triple::Minix)
2804fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("rtems", Triple::RTEMS)
281f659c0de6c7a4684a2a30c344ce6827ea87032d8Eli Bendersky    .StartsWith("nacl", Triple::NaCl)
282a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel    .StartsWith("cnk", Triple::CNK)
283b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher    .StartsWith("bitrig", Triple::Bitrig)
2842e522d05278a69cf75b41dcd4b358e46b5350425Duncan Sands    .StartsWith("aix", Triple::AIX)
2854fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Default(Triple::UnknownOS);
286335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
287335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
2884fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
2894fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth  return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
2904fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("eabi", Triple::EABI)
2914fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("gnueabihf", Triple::GNUEABIHF)
2924fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("gnueabi", Triple::GNUEABI)
2939dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky    .StartsWith("gnux32", Triple::GNUX32)
2944fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("gnu", Triple::GNU)
2954fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .StartsWith("macho", Triple::MachO)
29643bf70986bb13c812e87ca959dd8f2dd9edf802cLogan Chien    .StartsWith("android", Triple::Android)
2977bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor    .StartsWith("elf", Triple::ELF)
2984fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    .Default(Triple::UnknownEnvironment);
2995754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
3005754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
301cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from the string representation provided.
302cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth///
3030523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This stores the string representation and parses the various pieces into
3040523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// enum members.
305124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler CarruthTriple::Triple(const Twine &Str)
306124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth    : Data(Str.str()),
3074fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Arch(parseArch(getArchName())),
3084fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Vendor(parseVendor(getVendorName())),
3094fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      OS(parseOS(getOSName())),
3104fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Environment(parseEnvironment(getEnvironmentName())) {
311124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth}
312cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth
313cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture,
314cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, and OS.
315cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth///
3160523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This joins each argument into a canonical string representation and parses
3170523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// them into enum members. It leaves the environment unknown and omits it from
3180523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// the string representation.
319cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
320cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth    : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
3214fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Arch(parseArch(ArchStr.str())),
3224fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Vendor(parseVendor(VendorStr.str())),
3234fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      OS(parseOS(OSStr.str())),
324124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth      Environment() {
325cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth}
326cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth
327cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture,
328cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, OS, and environment.
329cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth///
3300523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This joins each argument into a canonical string representation and parses
3310523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// them into enum members.
332cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
333cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth               const Twine &EnvironmentStr)
334cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth    : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
335cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth            EnvironmentStr).str()),
3364fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Arch(parseArch(ArchStr.str())),
3374fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Vendor(parseVendor(VendorStr.str())),
3384fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      OS(parseOS(OSStr.str())),
3394fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth      Environment(parseEnvironment(EnvironmentStr.str())) {
340cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth}
341cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth
342335db223926931db204bf54d4accac6677b8e6b1Duncan Sandsstd::string Triple::normalize(StringRef Str) {
343335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Parse into components.
344335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  SmallVector<StringRef, 4> Components;
345dac3d36584766a7c00972603598dcdff2f5314d5Chandler Carruth  Str.split(Components, "-");
346335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
347335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // If the first component corresponds to a known architecture, preferentially
348335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // use it for the architecture.  If the second component corresponds to a
349335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // known vendor, preferentially use it for the vendor, etc.  This avoids silly
350335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // component movement when a component parses as (eg) both a valid arch and a
351335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // valid os.
352335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  ArchType Arch = UnknownArch;
353335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  if (Components.size() > 0)
3544fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    Arch = parseArch(Components[0]);
355335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  VendorType Vendor = UnknownVendor;
356335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  if (Components.size() > 1)
3574fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    Vendor = parseVendor(Components[1]);
358335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  OSType OS = UnknownOS;
359335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  if (Components.size() > 2)
3604fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    OS = parseOS(Components[2]);
3615754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  EnvironmentType Environment = UnknownEnvironment;
3625754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  if (Components.size() > 3)
3634fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth    Environment = parseEnvironment(Components[3]);
364335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
365335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Note which components are already in their final position.  These will not
366335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // be moved.
3675754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  bool Found[4];
368335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  Found[0] = Arch != UnknownArch;
369335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  Found[1] = Vendor != UnknownVendor;
370335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  Found[2] = OS != UnknownOS;
3715754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  Found[3] = Environment != UnknownEnvironment;
372335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
373335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // If they are not there already, permute the components into their canonical
374335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // positions by seeing if they parse as a valid architecture, and if so moving
375335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // the component to the architecture position etc.
3765754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
377335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    if (Found[Pos])
378335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      continue; // Already in the canonical position.
379335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
380335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
381335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // Do not reparse any components that already matched.
3825754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands      if (Idx < array_lengthof(Found) && Found[Idx])
383335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        continue;
384335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
385335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // Does this component parse as valid for the target position?
386335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      bool Valid = false;
387335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      StringRef Comp = Components[Idx];
388335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      switch (Pos) {
389858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("unexpected component type!");
390335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      case 0:
3914fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth        Arch = parseArch(Comp);
392335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        Valid = Arch != UnknownArch;
393335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        break;
394335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      case 1:
3954fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth        Vendor = parseVendor(Comp);
396335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        Valid = Vendor != UnknownVendor;
397335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        break;
398335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      case 2:
3994fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth        OS = parseOS(Comp);
400ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands        Valid = OS != UnknownOS;
401335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        break;
4025754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands      case 3:
4034fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth        Environment = parseEnvironment(Comp);
4045754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands        Valid = Environment != UnknownEnvironment;
4055754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands        break;
406335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      }
407335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      if (!Valid)
408335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        continue; // Nope, try the next component.
409335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
410335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // Move the component to the target position, pushing any non-fixed
411335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // components that are in the way to the right.  This tends to give
412335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // good results in the common cases of a forgotten vendor component
413335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      // or a wrongly positioned environment.
414335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      if (Pos < Idx) {
415335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Insert left, pushing the existing components to the right.  For
416335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // example, a-b-i386 -> i386-a-b when moving i386 to the front.
417335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        StringRef CurrentComponent(""); // The empty component.
418335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Replace the component we are moving with an empty component.
419335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        std::swap(CurrentComponent, Components[Idx]);
420335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Insert the component being moved at Pos, displacing any existing
421335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // components to the right.
422335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
423335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Skip over any fixed components.
424c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth          while (i < array_lengthof(Found) && Found[i])
425c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth            ++i;
426335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Place the component at the new position, getting the component
427335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // that was at this position - it will be moved right.
428335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          std::swap(CurrentComponent, Components[i]);
429335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        }
430335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      } else if (Pos > Idx) {
431335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // Push right by inserting empty components until the component at Idx
432335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // reaches the target position Pos.  For example, pc-a -> -pc-a when
433335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        // moving pc to the second position.
434335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        do {
435335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Insert one empty component at Idx.
436335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          StringRef CurrentComponent(""); // The empty component.
437ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands          for (unsigned i = Idx; i < Components.size();) {
438335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            // Place the component at the new position, getting the component
439335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            // that was at this position - it will be moved right.
440335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            std::swap(CurrentComponent, Components[i]);
441335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            // If it was placed on top of an empty component then we are done.
442335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            if (CurrentComponent.empty())
443335db223926931db204bf54d4accac6677b8e6b1Duncan Sands              break;
444ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands            // Advance to the next component, skipping any fixed components.
44515ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson            while (++i < array_lengthof(Found) && Found[i])
44615ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson              ;
447335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          }
448335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // The last component was pushed off the end - append it.
449335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          if (!CurrentComponent.empty())
450335db223926931db204bf54d4accac6677b8e6b1Duncan Sands            Components.push_back(CurrentComponent);
451335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
452335db223926931db204bf54d4accac6677b8e6b1Duncan Sands          // Advance Idx to the component's new position.
453c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth          while (++Idx < array_lengthof(Found) && Found[Idx])
454c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth            ;
455335db223926931db204bf54d4accac6677b8e6b1Duncan Sands        } while (Idx < Pos); // Add more until the final position is reached.
456335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      }
457335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      assert(Pos < Components.size() && Components[Pos] == Comp &&
458335db223926931db204bf54d4accac6677b8e6b1Duncan Sands             "Component moved wrong!");
459335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      Found[Pos] = true;
460335db223926931db204bf54d4accac6677b8e6b1Duncan Sands      break;
461335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    }
462335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  }
463335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
464335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Special case logic goes here.  At this point Arch, Vendor and OS have the
465335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // correct values for the computed components.
466335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
467335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  // Stick the corrected components back together to form the normalized string.
468335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  std::string Normalized;
469335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  for (unsigned i = 0, e = Components.size(); i != e; ++i) {
470335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    if (i) Normalized += '-';
471335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    Normalized += Components[i];
472335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  }
473335db223926931db204bf54d4accac6677b8e6b1Duncan Sands  return Normalized;
474335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
475335db223926931db204bf54d4accac6677b8e6b1Duncan Sands
476a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getArchName() const {
477a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return StringRef(Data).split('-').first;           // Isolate first component
47823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
47923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
480a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getVendorName() const {
481a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
482a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').first;                       // Isolate second component
48323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
48423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
485a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSName() const {
486a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
487a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Tmp = Tmp.split('-').second;                       // Strip second component
488a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').first;                       // Isolate third component
48923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
49023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
491a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getEnvironmentName() const {
492a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
493a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Tmp = Tmp.split('-').second;                       // Strip second component
494a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').second;                      // Strip third component
49523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
49623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
497a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSAndEnvironmentName() const {
498a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
499a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').second;                      // Strip second component
50023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
50123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
502dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnerstatic unsigned EatNumber(StringRef &Str) {
503dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
504087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  unsigned Result = 0;
505e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
506087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  do {
507087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    // Consume the leading digit.
508dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    Result = Result*10 + (Str[0] - '0');
509087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar
510dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    // Eat the digit.
511dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    Str = Str.substr(1);
512087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
513e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
514dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  return Result;
515dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner}
516dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
517087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbarvoid Triple::getOSVersion(unsigned &Major, unsigned &Minor,
518087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar                          unsigned &Micro) const {
519dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  StringRef OSName = getOSName();
520dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
521087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  // Assume that the OS portion of the triple starts with the canonical name.
522087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  StringRef OSTypeName = getOSTypeName(getOS());
523087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  if (OSName.startswith(OSTypeName))
524087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    OSName = OSName.substr(OSTypeName.size());
525e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
526087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  // Any unset version defaults to 0.
527087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  Major = Minor = Micro = 0;
528e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
529087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  // Parse up to three components.
530087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  unsigned *Components[3] = { &Major, &Minor, &Micro };
531087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  for (unsigned i = 0; i != 3; ++i) {
532087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
533087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar      break;
534e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
535087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    // Consume the leading number.
536087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    *Components[i] = EatNumber(OSName);
537dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
538087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    // Consume the separator, if present.
539087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar    if (OSName.startswith("."))
540087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar      OSName = OSName.substr(1);
541087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar  }
542dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner}
543dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
544bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilsonbool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
545bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson                              unsigned &Micro) const {
546bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  getOSVersion(Major, Minor, Micro);
547bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson
548bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  switch (getOS()) {
549858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  default: llvm_unreachable("unexpected OS for Darwin triple");
550bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  case Darwin:
551bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Default to darwin8, i.e., MacOSX 10.4.
552bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major == 0)
553bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      Major = 8;
554bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Darwin version numbers are skewed from OS X versions.
555bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major < 4)
556bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      return false;
557bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Micro = 0;
558bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Minor = Major - 4;
559bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Major = 10;
560bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    break;
561bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  case MacOSX:
562bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Default to 10.4.
563bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major == 0) {
564bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      Major = 10;
565bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      Minor = 4;
566bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    }
567bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    if (Major != 10)
568bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson      return false;
569bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    break;
570bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  case IOS:
571bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // Ignore the version from the triple.  This is only handled because the
572bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // the clang driver combines OS X and IOS support into a common Darwin
573bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // toolchain that wants to know the OS X version number even when targeting
574bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    // IOS.
575bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Major = 10;
576bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Minor = 4;
577bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    Micro = 0;
578bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson    break;
579bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  }
580bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson  return true;
581bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson}
582bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson
583ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosiervoid Triple::getiOSVersion(unsigned &Major, unsigned &Minor,
584ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier                           unsigned &Micro) const {
585ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier  switch (getOS()) {
586ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier  default: llvm_unreachable("unexpected OS for Darwin triple");
587ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier  case Darwin:
588ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier  case MacOSX:
589ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    // Ignore the version from the triple.  This is only handled because the
590ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    // the clang driver combines OS X and IOS support into a common Darwin
591ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    // toolchain that wants to know the iOS version number even when targeting
592ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    // OS X.
593537c2f5b2ae373a602b88789007ea75196795775Chad Rosier    Major = 3;
594ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    Minor = 0;
595ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    Micro = 0;
59626bbdeed6c50c57c4ab02a14edfea876dc71e3f4Chad Rosier    break;
597ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier  case IOS:
598ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    getOSVersion(Major, Minor, Micro);
599537c2f5b2ae373a602b88789007ea75196795775Chad Rosier    // Default to 3.0.
600537c2f5b2ae373a602b88789007ea75196795775Chad Rosier    if (Major == 0)
601537c2f5b2ae373a602b88789007ea75196795775Chad Rosier      Major = 3;
602ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier    break;
603ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier  }
604ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier}
605ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier
606a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setTriple(const Twine &Str) {
607124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth  *this = Triple(Str);
60823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
60923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
61023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) {
61123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setArchName(getArchTypeName(Kind));
61223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
61323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
61423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) {
61523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setVendorName(getVendorTypeName(Kind));
61623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
61723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
61823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) {
61923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setOSName(getOSTypeName(Kind));
62023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
62123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6225754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsvoid Triple::setEnvironment(EnvironmentType Kind) {
6235754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  setEnvironmentName(getEnvironmentTypeName(Kind));
6245754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
6255754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
6262928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setArchName(StringRef Str) {
6270b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  // Work around a miscompilation bug for Twines in gcc 4.0.3.
6280b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  SmallString<64> Triple;
6290b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += Str;
6300b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += "-";
6310b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += getVendorName();
6320b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += "-";
6330b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  Triple += getOSAndEnvironmentName();
6340b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin  setTriple(Triple.str());
63523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
63623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6372928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setVendorName(StringRef Str) {
63823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
63923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
64023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6412928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSName(StringRef Str) {
64223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (hasEnvironment())
64323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
64423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar              "-" + getEnvironmentName());
64523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
64623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
64723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
64823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6492928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setEnvironmentName(StringRef Str) {
6502928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
65123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar            "-" + Str);
65223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
65323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6542928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSAndEnvironmentName(StringRef Str) {
65523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
65623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
6576f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6586f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthstatic unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
6596f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  switch (Arch) {
6606f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::UnknownArch:
6616f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 0;
6626f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6636f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::msp430:
6646f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 16;
6656f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6666f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::amdil:
6676f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::arm:
6686f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::hexagon:
6696f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::le32:
6706f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mblaze:
6716f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mips:
6726f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mipsel:
67349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case llvm::Triple::nvptx:
6746f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::ppc:
6757415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov  case llvm::Triple::r600:
6766f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::sparc:
6776f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::tce:
6786f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::thumb:
6796f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::x86:
6806f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::xcore:
681ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case llvm::Triple::spir:
6826f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 32;
6836f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
68472062f5744557e270a38192554c3126ea5f97434Tim Northover  case llvm::Triple::aarch64:
6856f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mips64:
6866f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::mips64el:
68749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case llvm::Triple::nvptx64:
6886f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::ppc64:
6896f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::sparcv9:
6906f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  case llvm::Triple::x86_64:
691ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case llvm::Triple::spir64:
6926f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth    return 64;
6936f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  }
6946f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  llvm_unreachable("Invalid architecture value");
6956f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
6966f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
6976f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch64Bit() const {
6986f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  return getArchPointerBitWidth(getArch()) == 64;
6996f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
7006f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
7016f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch32Bit() const {
7026f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  return getArchPointerBitWidth(getArch()) == 32;
7036f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
7046f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth
7056f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch16Bit() const {
7066f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth  return getArchPointerBitWidth(getArch()) == 16;
7076f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth}
7087d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7097d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get32BitArchVariant() const {
7107d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  Triple T(*this);
7117d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  switch (getArch()) {
7127d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::UnknownArch:
71372062f5744557e270a38192554c3126ea5f97434Tim Northover  case Triple::aarch64:
7147d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::msp430:
7157d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    T.setArch(UnknownArch);
7167d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7177d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7187d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::amdil:
719e53d6051b7e173722351a5647bfd71eebee3d837Micah Villmow  case Triple::spir:
7207d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::arm:
7217d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::hexagon:
7227d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::le32:
7237d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mblaze:
7247d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips:
7257d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mipsel:
72649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case Triple::nvptx:
7277d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc:
7287415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov  case Triple::r600:
7297d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparc:
7307d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::tce:
7317d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::thumb:
7327d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86:
7337d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::xcore:
7347d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    // Already 32-bit.
7357d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7367d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7377d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64:    T.setArch(Triple::mips);    break;
7387d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64el:  T.setArch(Triple::mipsel);  break;
73949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case Triple::nvptx64:   T.setArch(Triple::nvptx);   break;
7407d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc64:     T.setArch(Triple::ppc);   break;
7417d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparcv9:   T.setArch(Triple::sparc);   break;
7427d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86_64:    T.setArch(Triple::x86);     break;
743ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case Triple::spir64:    T.setArch(Triple::spir);    break;
7447d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  }
7457d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  return T;
7467d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth}
7477d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7487d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get64BitArchVariant() const {
7497d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  Triple T(*this);
7507d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  switch (getArch()) {
7517d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::UnknownArch:
7527d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::amdil:
7537d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::arm:
7547d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::hexagon:
7557d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::le32:
7567d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mblaze:
7577d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::msp430:
7587415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov  case Triple::r600:
7597d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::tce:
7607d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::thumb:
7617d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::xcore:
7627d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    T.setArch(UnknownArch);
7637d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7647d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
76572062f5744557e270a38192554c3126ea5f97434Tim Northover  case Triple::aarch64:
766ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case Triple::spir64:
7677d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64:
7687d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips64el:
76949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case Triple::nvptx64:
7707d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc64:
7717d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparcv9:
7727d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86_64:
7737d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    // Already 64-bit.
7747d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth    break;
7757d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth
7767d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mips:    T.setArch(Triple::mips64);    break;
7777d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::mipsel:  T.setArch(Triple::mips64el);  break;
77849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case Triple::nvptx:   T.setArch(Triple::nvptx64);   break;
7797d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::ppc:     T.setArch(Triple::ppc64);     break;
7807d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::sparc:   T.setArch(Triple::sparcv9);   break;
7817d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  case Triple::x86:     T.setArch(Triple::x86_64);    break;
782ac39a035351a20928e087617e412aa6ce510181fGuy Benyei  case Triple::spir:    T.setArch(Triple::spir64);    break;
7837d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  }
7847d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth  return T;
7857d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth}
786