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