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"; 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"; 41e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx32: return "ptx32"; 42e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx64: return "ptx64"; 4338fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin case le32: return "le32"; 4405d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser case amdil: return "amdil"; 4523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 4623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 474d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid ArchType!"); 4823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 4923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 50688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbarconst char *Triple::getArchTypePrefix(ArchType Kind) { 51688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar switch (Kind) { 52688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar default: 53688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar return 0; 54688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 55688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case arm: 56688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case thumb: return "arm"; 57688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 58688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case cellspu: return "spu"; 59688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 60688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case ppc64: 61688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case ppc: return "ppc"; 62688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 63a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck case mblaze: return "mblaze"; 64a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck 65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case hexagon: return "hexagon"; 66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 677415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case r600: return "r600"; 687415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov 6987c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner case sparcv9: 70688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case sparc: return "sparc"; 71688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 72688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case x86: 73688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case x86_64: return "x86"; 74f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 75688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case xcore: return "xcore"; 76f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 77e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx32: return "ptx"; 78e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx64: return "ptx"; 7938fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin case le32: return "le32"; 8005d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser case amdil: return "amdil"; 81688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar } 82688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar} 83688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 8423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) { 8523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 8623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownVendor: return "unknown"; 8723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 8823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Apple: return "apple"; 8956ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner case PC: return "pc"; 906046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson case SCEI: return "scei"; 91a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel case BGP: return "bgp"; 92a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel case BGQ: return "bgq"; 9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 9423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 954d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid VendorType!"); 9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 9723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 9823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) { 9923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 10023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownOS: return "unknown"; 10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 102852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands case AuroraUX: return "auroraux"; 1036337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case Cygwin: return "cygwin"; 10423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Darwin: return "darwin"; 1057eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar case DragonFly: return "dragonfly"; 10623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case FreeBSD: return "freebsd"; 1070dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar case IOS: return "ios"; 108652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands case KFreeBSD: return "kfreebsd"; 10923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Linux: return "linux"; 110cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan case Lv2: return "lv2"; 1111af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar case MacOSX: return "macosx"; 1126337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case MinGW32: return "mingw32"; 113b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner case NetBSD: return "netbsd"; 114cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands case OpenBSD: return "openbsd"; 115fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar case Solaris: return "solaris"; 1166337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case Win32: return "win32"; 117a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner case Haiku: return "haiku"; 11829269d03af6dc3feb69d0230831a059f39c03700Chris Lattner case Minix: return "minix"; 1196ced1d12dd7ee18d65a6df6e66c9662753a5876dDouglas Gregor case RTEMS: return "rtems"; 120fb23462889ff2dcd016a4b4169ebce94a878218eIvan Krasin case NativeClient: return "nacl"; 121a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel case CNK: return "cnk"; 12223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 12323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1244d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid OSType"); 12523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 12623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1275754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsconst char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { 1285754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands switch (Kind) { 1295754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands case UnknownEnvironment: return "unknown"; 130859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case GNU: return "gnu"; 1318887a0f34152b63a84e759b76694d6928d01b4eeRafael Espindola case GNUEABIHF: return "gnueabihf"; 132859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case GNUEABI: return "gnueabi"; 133859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case EABI: return "eabi"; 1342bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng case MachO: return "macho"; 135fd553c2cb54ee01d56f5d80d70a5d52220286fccChandler Carruth case ANDROIDEABI: return "androideabi"; 1365754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands } 1375754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 1384d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid EnvironmentType!"); 1395754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 1405754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 1412928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 14206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth return StringSwitch<Triple::ArchType>(Name) 14306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("arm", arm) 14406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("cellspu", cellspu) 14506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mips", mips) 14606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mipsel", mipsel) 14706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mips64", mips64) 14806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mips64el", mips64el) 14906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("msp430", msp430) 15006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc64", ppc64) 15106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc32", ppc) 15206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc", ppc) 15306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mblaze", mblaze) 1547415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", r600) 15506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("hexagon", hexagon) 15606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("sparc", sparc) 15706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("sparcv9", sparcv9) 15806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("tce", tce) 15906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("thumb", thumb) 16006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86", x86) 16106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86-64", x86_64) 16206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("xcore", xcore) 16306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ptx32", ptx32) 16406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ptx64", ptx64) 16506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("le32", le32) 16606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("amdil", amdil) 16706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Default(UnknownArch); 1683c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar} 1693c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 1702928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) { 171baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 172baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // archs which Darwin doesn't use. 173baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 174baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // The matching this routine does is fairly pointless, since it is neither the 175baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // complete architecture list, nor a reasonable subset. The problem is that 176baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // historically the driver driver accepts this and also ties its -march= 177baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // handling to the architecture name, so we need to be careful before removing 178baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // support for it. 179baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 180ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar // This code must be kept in sync with Clang's Darwin specific argument 181ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar // translation. 182ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar 18306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth return StringSwitch<ArchType>(Str) 18406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", Triple::ppc) 18506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", Triple::ppc) 18606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc64", Triple::ppc64) 18706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("i386", "i486", "i486SX", "i586", "i686", Triple::x86) 18806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4", 18906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth Triple::x86) 19006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86_64", Triple::x86_64) 19106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth // This is derived from the driver driver. 19206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("arm", "armv4t", "armv5", "armv6", Triple::arm) 19306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", Triple::arm) 1947415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", Triple::r600) 19506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ptx32", Triple::ptx32) 19606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ptx64", Triple::ptx64) 19706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("amdil", Triple::amdil) 19806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Default(Triple::UnknownArch); 199baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar} 200baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 201bbdca3f68edce8b2cc409ed71d256b4dbb0c56adDuncan Sands// Returns architecture name that is understood by the target assembler. 20251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzovconst char *Triple::getArchNameForAssembler() { 203e1fe09f6826f158def69cff89f3ce4e67e199bb5Daniel Dunbar if (!isOSDarwin() && getVendor() != Triple::Apple) 20451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return NULL; 20551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov 20606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth return StringSwitch<const char*>(getArchName()) 20706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("i386", "i386") 20806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86_64", "x86_64") 20906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("powerpc", "ppc") 21006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("powerpc64", "ppc64") 21106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("mblaze", "microblaze", "mblaze") 21206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("arm", "arm") 21306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv4t", "thumbv4t", "armv4t") 21406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv5", "armv5e", "thumbv5", "thumbv5e", "armv5") 21506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv6", "thumbv6", "armv6") 21606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv7", "thumbv7", "armv7") 2177415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", "r600") 21806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ptx32", "ptx32") 21906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ptx64", "ptx64") 22006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("le32", "le32") 22106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("amdil", "amdil") 22206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Default(NULL); 22351cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov} 22451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov 2254fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::ArchType parseArch(StringRef ArchName) { 2264fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::ArchType>(ArchName) 2274fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("i386", "i486", "i586", "i686", Triple::x86) 2284fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth // FIXME: Do we need to support these? 2294fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("i786", "i886", "i986", Triple::x86) 2304fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("amd64", "x86_64", Triple::x86_64) 2314fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("powerpc", Triple::ppc) 2324fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("powerpc64", "ppu", Triple::ppc64) 2334fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("mblaze", Triple::mblaze) 2344fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("arm", "xscale", Triple::arm) 2350a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth // FIXME: It would be good to replace these with explicit names for all the 2360a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth // various suffixes supported. 2374fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("armv", Triple::arm) 2384fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("thumb", Triple::thumb) 2394fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("thumbv", Triple::thumb) 2404fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("spu", "cellspu", Triple::cellspu) 2414fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("msp430", Triple::msp430) 2424fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) 243fdf0dc9e0bb5c0b848286e6c96bfc9a390d26775Chandler Carruth .Cases("mipsel", "mipsallegrexel", Triple::mipsel) 2444fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("mips64", "mips64eb", Triple::mips64) 2454fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("mips64el", Triple::mips64el) 2467415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", Triple::r600) 2474fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("hexagon", Triple::hexagon) 2484fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("sparc", Triple::sparc) 2494fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("sparcv9", Triple::sparcv9) 2504fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("tce", Triple::tce) 2514fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("xcore", Triple::xcore) 2524fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("ptx32", Triple::ptx32) 2534fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("ptx64", Triple::ptx64) 2544fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("le32", Triple::le32) 2554fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("amdil", Triple::amdil) 2564fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownArch); 257335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 258651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar 2594fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::VendorType parseVendor(StringRef VendorName) { 2604fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::VendorType>(VendorName) 2614fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("apple", Triple::Apple) 2624fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("pc", Triple::PC) 2634fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("scei", Triple::SCEI) 264a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel .Case("bgp", Triple::BGP) 265a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel .Case("bgq", Triple::BGQ) 2664fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownVendor); 267335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 26823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 2694fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::OSType parseOS(StringRef OSName) { 2704fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::OSType>(OSName) 2714fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("auroraux", Triple::AuroraUX) 2724fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("cygwin", Triple::Cygwin) 2734fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("darwin", Triple::Darwin) 2744fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("dragonfly", Triple::DragonFly) 2754fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("freebsd", Triple::FreeBSD) 2764fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("ios", Triple::IOS) 2774fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("kfreebsd", Triple::KFreeBSD) 2784fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("linux", Triple::Linux) 2794fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("lv2", Triple::Lv2) 2804fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("macosx", Triple::MacOSX) 2814fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("mingw32", Triple::MinGW32) 2824fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("netbsd", Triple::NetBSD) 2834fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("openbsd", Triple::OpenBSD) 2844fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("solaris", Triple::Solaris) 2854fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("win32", Triple::Win32) 2864fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("haiku", Triple::Haiku) 2874fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("minix", Triple::Minix) 2884fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("rtems", Triple::RTEMS) 2894fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("nacl", Triple::NativeClient) 290a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel .StartsWith("cnk", Triple::CNK) 2914fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownOS); 292335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 293335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 2944fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { 2954fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::EnvironmentType>(EnvironmentName) 2964fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("eabi", Triple::EABI) 2974fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("gnueabihf", Triple::GNUEABIHF) 2984fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("gnueabi", Triple::GNUEABI) 2994fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("gnu", Triple::GNU) 3004fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("macho", Triple::MachO) 3014fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("androideabi", Triple::ANDROIDEABI) 3024fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownEnvironment); 3035754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 3045754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 305cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from the string representation provided. 306cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// 3070523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This stores the string representation and parses the various pieces into 3080523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// enum members. 309124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler CarruthTriple::Triple(const Twine &Str) 310124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth : Data(Str.str()), 3114fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch(parseArch(getArchName())), 3124fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor(parseVendor(getVendorName())), 3134fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS(parseOS(getOSName())), 3144fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment(parseEnvironment(getEnvironmentName())) { 315124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth} 316cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth 317cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture, 318cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, and OS. 319cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// 3200523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This joins each argument into a canonical string representation and parses 3210523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// them into enum members. It leaves the environment unknown and omits it from 3220523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// the string representation. 323cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr) 324cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()), 3254fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch(parseArch(ArchStr.str())), 3264fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor(parseVendor(VendorStr.str())), 3274fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS(parseOS(OSStr.str())), 328124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth Environment() { 329cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth} 330cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth 331cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture, 332cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, OS, and environment. 333cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// 3340523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This joins each argument into a canonical string representation and parses 3350523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// them into enum members. 336cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 337cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth const Twine &EnvironmentStr) 338cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') + 339cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth EnvironmentStr).str()), 3404fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch(parseArch(ArchStr.str())), 3414fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor(parseVendor(VendorStr.str())), 3424fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS(parseOS(OSStr.str())), 3434fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment(parseEnvironment(EnvironmentStr.str())) { 344cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth} 345cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth 346335db223926931db204bf54d4accac6677b8e6b1Duncan Sandsstd::string Triple::normalize(StringRef Str) { 347335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Parse into components. 348335db223926931db204bf54d4accac6677b8e6b1Duncan Sands SmallVector<StringRef, 4> Components; 349dac3d36584766a7c00972603598dcdff2f5314d5Chandler Carruth Str.split(Components, "-"); 350335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 351335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If the first component corresponds to a known architecture, preferentially 352335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // use it for the architecture. If the second component corresponds to a 353335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // known vendor, preferentially use it for the vendor, etc. This avoids silly 354335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // component movement when a component parses as (eg) both a valid arch and a 355335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // valid os. 356335db223926931db204bf54d4accac6677b8e6b1Duncan Sands ArchType Arch = UnknownArch; 357335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 0) 3584fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch = parseArch(Components[0]); 359335db223926931db204bf54d4accac6677b8e6b1Duncan Sands VendorType Vendor = UnknownVendor; 360335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 1) 3614fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor = parseVendor(Components[1]); 362335db223926931db204bf54d4accac6677b8e6b1Duncan Sands OSType OS = UnknownOS; 363335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 2) 3644fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS = parseOS(Components[2]); 3655754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands EnvironmentType Environment = UnknownEnvironment; 3665754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands if (Components.size() > 3) 3674fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment = parseEnvironment(Components[3]); 368335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 369335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Note which components are already in their final position. These will not 370335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // be moved. 3715754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands bool Found[4]; 372335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[0] = Arch != UnknownArch; 373335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[1] = Vendor != UnknownVendor; 374335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[2] = OS != UnknownOS; 3755754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Found[3] = Environment != UnknownEnvironment; 376335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 377335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If they are not there already, permute the components into their canonical 378335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // positions by seeing if they parse as a valid architecture, and if so moving 379335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // the component to the architecture position etc. 3805754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) { 381335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Found[Pos]) 382335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; // Already in the canonical position. 383335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 384335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 385335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Do not reparse any components that already matched. 3865754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands if (Idx < array_lengthof(Found) && Found[Idx]) 387335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; 388335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 389335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Does this component parse as valid for the target position? 390335db223926931db204bf54d4accac6677b8e6b1Duncan Sands bool Valid = false; 391335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef Comp = Components[Idx]; 392335db223926931db204bf54d4accac6677b8e6b1Duncan Sands switch (Pos) { 393858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("unexpected component type!"); 394335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 0: 3954fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch = parseArch(Comp); 396335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Valid = Arch != UnknownArch; 397335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 398335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 1: 3994fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor = parseVendor(Comp); 400335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Valid = Vendor != UnknownVendor; 401335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 402335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 2: 4034fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS = parseOS(Comp); 404ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands Valid = OS != UnknownOS; 405335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 4065754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands case 3: 4074fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment = parseEnvironment(Comp); 4085754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Valid = Environment != UnknownEnvironment; 4095754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands break; 410335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 411335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (!Valid) 412335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; // Nope, try the next component. 413335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 414335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Move the component to the target position, pushing any non-fixed 415335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // components that are in the way to the right. This tends to give 416335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // good results in the common cases of a forgotten vendor component 417335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // or a wrongly positioned environment. 418335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Pos < Idx) { 419335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert left, pushing the existing components to the right. For 420335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // example, a-b-i386 -> i386-a-b when moving i386 to the front. 421335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef CurrentComponent(""); // The empty component. 422335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Replace the component we are moving with an empty component. 423335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[Idx]); 424335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert the component being moved at Pos, displacing any existing 425335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // components to the right. 426335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 427335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Skip over any fixed components. 428c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth while (i < array_lengthof(Found) && Found[i]) 429c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth ++i; 430335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Place the component at the new position, getting the component 431335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // that was at this position - it will be moved right. 432335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[i]); 433335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 434335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } else if (Pos > Idx) { 435335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Push right by inserting empty components until the component at Idx 436335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // reaches the target position Pos. For example, pc-a -> -pc-a when 437335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // moving pc to the second position. 438335db223926931db204bf54d4accac6677b8e6b1Duncan Sands do { 439335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert one empty component at Idx. 440335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef CurrentComponent(""); // The empty component. 441ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands for (unsigned i = Idx; i < Components.size();) { 442335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Place the component at the new position, getting the component 443335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // that was at this position - it will be moved right. 444335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[i]); 445335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If it was placed on top of an empty component then we are done. 446335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (CurrentComponent.empty()) 447335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 448ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands // Advance to the next component, skipping any fixed components. 44915ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson while (++i < array_lengthof(Found) && Found[i]) 45015ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson ; 451335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 452335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // The last component was pushed off the end - append it. 453335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (!CurrentComponent.empty()) 454335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Components.push_back(CurrentComponent); 455335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 456335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Advance Idx to the component's new position. 457c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth while (++Idx < array_lengthof(Found) && Found[Idx]) 458c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth ; 459335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } while (Idx < Pos); // Add more until the final position is reached. 460335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 461335db223926931db204bf54d4accac6677b8e6b1Duncan Sands assert(Pos < Components.size() && Components[Pos] == Comp && 462335db223926931db204bf54d4accac6677b8e6b1Duncan Sands "Component moved wrong!"); 463335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[Pos] = true; 464335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 465335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 466335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 467335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 468335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Special case logic goes here. At this point Arch, Vendor and OS have the 469335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // correct values for the computed components. 470335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 471335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Stick the corrected components back together to form the normalized string. 472335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::string Normalized; 473335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned i = 0, e = Components.size(); i != e; ++i) { 474335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (i) Normalized += '-'; 475335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Normalized += Components[i]; 476335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 477335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Normalized; 478335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 479335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 480a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getArchName() const { 481a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return StringRef(Data).split('-').first; // Isolate first component 48223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 48323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 484a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getVendorName() const { 485a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 486a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').first; // Isolate second component 48723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 48823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 489a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSName() const { 490a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 491a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Tmp = Tmp.split('-').second; // Strip second component 492a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').first; // Isolate third component 49323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 49423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 495a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getEnvironmentName() const { 496a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 497a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Tmp = Tmp.split('-').second; // Strip second component 498a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').second; // Strip third component 49923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 50023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 501a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSAndEnvironmentName() const { 502a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 503a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').second; // Strip second component 50423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 50523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 506dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnerstatic unsigned EatNumber(StringRef &Str) { 507dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number"); 508087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned Result = 0; 509e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 510087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar do { 511087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the leading digit. 512dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner Result = Result*10 + (Str[0] - '0'); 513087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar 514dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner // Eat the digit. 515dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner Str = Str.substr(1); 516087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9'); 517e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 518dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner return Result; 519dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner} 520dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 521087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbarvoid Triple::getOSVersion(unsigned &Major, unsigned &Minor, 522087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned &Micro) const { 523dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner StringRef OSName = getOSName(); 524dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 525087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Assume that the OS portion of the triple starts with the canonical name. 526087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar StringRef OSTypeName = getOSTypeName(getOS()); 527087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.startswith(OSTypeName)) 528087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar OSName = OSName.substr(OSTypeName.size()); 529e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 530087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Any unset version defaults to 0. 531087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar Major = Minor = Micro = 0; 532e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 533087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Parse up to three components. 534087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned *Components[3] = { &Major, &Minor, &Micro }; 535087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar for (unsigned i = 0; i != 3; ++i) { 536087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9') 537087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar break; 538e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 539087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the leading number. 540087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar *Components[i] = EatNumber(OSName); 541dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 542087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the separator, if present. 543087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.startswith(".")) 544087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar OSName = OSName.substr(1); 545087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar } 546dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner} 547dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 548bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilsonbool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor, 549bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson unsigned &Micro) const { 550bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson getOSVersion(Major, Minor, Micro); 551bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson 552bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson switch (getOS()) { 553858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("unexpected OS for Darwin triple"); 554bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson case Darwin: 555bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Default to darwin8, i.e., MacOSX 10.4. 556bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major == 0) 557bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 8; 558bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Darwin version numbers are skewed from OS X versions. 559bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major < 4) 560bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson return false; 561bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Micro = 0; 562bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Minor = Major - 4; 563bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 10; 564bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson break; 565bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson case MacOSX: 566bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Default to 10.4. 567bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major == 0) { 568bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 10; 569bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Minor = 4; 570bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson } 571bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major != 10) 572bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson return false; 573bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson break; 574bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson case IOS: 575bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Ignore the version from the triple. This is only handled because the 576bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // the clang driver combines OS X and IOS support into a common Darwin 577bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // toolchain that wants to know the OS X version number even when targeting 578bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // IOS. 579bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 10; 580bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Minor = 4; 581bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Micro = 0; 582bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson break; 583bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson } 584bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson return true; 585bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson} 586bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson 587a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setTriple(const Twine &Str) { 588124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth *this = Triple(Str); 58923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 59023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 59123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) { 59223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setArchName(getArchTypeName(Kind)); 59323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 59423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 59523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) { 59623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setVendorName(getVendorTypeName(Kind)); 59723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 59823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 59923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) { 60023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setOSName(getOSTypeName(Kind)); 60123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 60223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6035754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsvoid Triple::setEnvironment(EnvironmentType Kind) { 6045754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands setEnvironmentName(getEnvironmentTypeName(Kind)); 6055754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 6065754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 6072928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setArchName(StringRef Str) { 6080b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin // Work around a miscompilation bug for Twines in gcc 4.0.3. 6090b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin SmallString<64> Triple; 6100b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += Str; 6110b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += "-"; 6120b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += getVendorName(); 6130b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += "-"; 6140b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += getOSAndEnvironmentName(); 6150b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin setTriple(Triple.str()); 61623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 61723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6182928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setVendorName(StringRef Str) { 61923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 62023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 62123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6222928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSName(StringRef Str) { 62323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (hasEnvironment()) 62423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 62523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + getEnvironmentName()); 62623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 62723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 62823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 62923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6302928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setEnvironmentName(StringRef Str) { 6312928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 63223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + Str); 63323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 63423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6352928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSAndEnvironmentName(StringRef Str) { 63623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 63723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 6386f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6396f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthstatic unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 6406f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth switch (Arch) { 6416f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::UnknownArch: 6426f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 0; 6436f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6446f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::msp430: 6456f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 16; 6466f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6476f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::amdil: 6486f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::arm: 6496f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::cellspu: 6506f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::hexagon: 6516f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::le32: 6526f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mblaze: 6536f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mips: 6546f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mipsel: 6556f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::ppc: 6566f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::ptx32: 6577415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case llvm::Triple::r600: 6586f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::sparc: 6596f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::tce: 6606f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::thumb: 6616f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::x86: 6626f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::xcore: 6636f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 32; 6646f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6656f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mips64: 6666f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mips64el: 6676f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::ppc64: 6686f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::ptx64: 6696f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::sparcv9: 6706f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::x86_64: 6716f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 64; 6726f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth } 6736f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth llvm_unreachable("Invalid architecture value"); 6746f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 6756f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6766f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch64Bit() const { 6776f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return getArchPointerBitWidth(getArch()) == 64; 6786f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 6796f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6806f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch32Bit() const { 6816f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return getArchPointerBitWidth(getArch()) == 32; 6826f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 6836f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6846f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch16Bit() const { 6856f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return getArchPointerBitWidth(getArch()) == 16; 6866f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 6877d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 6887d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get32BitArchVariant() const { 6897d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth Triple T(*this); 6907d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth switch (getArch()) { 6917d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::UnknownArch: 6927d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::msp430: 6937d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth T.setArch(UnknownArch); 6947d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 6957d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 6967d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::amdil: 6977d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::arm: 6987d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::cellspu: 6997d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::hexagon: 7007d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::le32: 7017d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mblaze: 7027d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips: 7037d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mipsel: 7047d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc: 7057d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ptx32: 7067415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case Triple::r600: 7077d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparc: 7087d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::tce: 7097d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::thumb: 7107d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86: 7117d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::xcore: 7127d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth // Already 32-bit. 7137d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7147d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7157d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64: T.setArch(Triple::mips); break; 7167d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64el: T.setArch(Triple::mipsel); break; 7177d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc64: T.setArch(Triple::ppc); break; 7187d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ptx64: T.setArch(Triple::ptx32); break; 7197d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparcv9: T.setArch(Triple::sparc); break; 7207d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86_64: T.setArch(Triple::x86); break; 7217d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth } 7227d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth return T; 7237d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth} 7247d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7257d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get64BitArchVariant() const { 7267d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth Triple T(*this); 7277d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth switch (getArch()) { 7287d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::UnknownArch: 7297d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::amdil: 7307d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::arm: 7317d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::cellspu: 7327d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::hexagon: 7337d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::le32: 7347d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mblaze: 7357d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::msp430: 7367415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case Triple::r600: 7377d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::tce: 7387d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::thumb: 7397d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::xcore: 7407d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth T.setArch(UnknownArch); 7417d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7427d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7437d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64: 7447d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64el: 7457d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc64: 7467d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ptx64: 7477d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparcv9: 7487d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86_64: 7497d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth // Already 64-bit. 7507d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7517d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7527d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips: T.setArch(Triple::mips64); break; 7537d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mipsel: T.setArch(Triple::mips64el); break; 7547d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc: T.setArch(Triple::ppc64); break; 7557d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ptx32: T.setArch(Triple::ptx64); break; 7567d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparc: T.setArch(Triple::sparcv9); break; 7577d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86: T.setArch(Triple::x86_64); break; 7587d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth } 7597d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth return T; 7607d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth} 761