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"; 4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case nvptx: return "nvptx"; 4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case nvptx64: return "nvptx64"; 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 65d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer case mips: 66d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer case mipsel: 67d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer case mips64: 68d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer case mips64el:return "mips"; 69d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer 70d5dbc8c2bb2a7803c6bb458278728d419300dc91Benjamin Kramer case hexagon: return "hexagon"; 71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 727415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case r600: return "r600"; 737415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov 7487c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner case sparcv9: 75688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case sparc: return "sparc"; 76688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 77688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case x86: 78688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case x86_64: return "x86"; 79f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 80688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case xcore: return "xcore"; 81f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case nvptx: return "nvptx"; 8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case nvptx64: return "nvptx"; 8438fb2db6c9f64a59875d034e2a2cab27603c1884Ivan Krasin case le32: return "le32"; 8505d71380181a874cbe70bd2c30fa5eb71eb0d661Tobias Grosser case amdil: return "amdil"; 86688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar } 87688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar} 88688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 8923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) { 9023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownVendor: return "unknown"; 9223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Apple: return "apple"; 9456ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner case PC: return "pc"; 956046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson case SCEI: return "scei"; 96a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel case BGP: return "bgp"; 97a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel case BGQ: return "bgq"; 98d939cd68f40e6fa0ccd6bee6391374b66abd71a1Hal Finkel case Freescale: return "fsl"; 9923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 10023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1014d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid VendorType!"); 10223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 10323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 10423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) { 10523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 10623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownOS: return "unknown"; 10723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 108852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands case AuroraUX: return "auroraux"; 1096337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case Cygwin: return "cygwin"; 11023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Darwin: return "darwin"; 1117eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar case DragonFly: return "dragonfly"; 11223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case FreeBSD: return "freebsd"; 1130dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar case IOS: return "ios"; 114652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands case KFreeBSD: return "kfreebsd"; 11523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Linux: return "linux"; 116cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan case Lv2: return "lv2"; 1171af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar case MacOSX: return "macosx"; 1186337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case MinGW32: return "mingw32"; 119b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner case NetBSD: return "netbsd"; 120cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands case OpenBSD: return "openbsd"; 121fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar case Solaris: return "solaris"; 1226337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case Win32: return "win32"; 123a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner case Haiku: return "haiku"; 12429269d03af6dc3feb69d0230831a059f39c03700Chris Lattner case Minix: return "minix"; 1256ced1d12dd7ee18d65a6df6e66c9662753a5876dDouglas Gregor case RTEMS: return "rtems"; 126fb23462889ff2dcd016a4b4169ebce94a878218eIvan Krasin case NativeClient: return "nacl"; 127a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel case CNK: return "cnk"; 128b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher case Bitrig: return "bitrig"; 12923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 13023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1314d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid OSType"); 13223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 13323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1345754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsconst char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { 1355754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands switch (Kind) { 1365754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands case UnknownEnvironment: return "unknown"; 137859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case GNU: return "gnu"; 1388887a0f34152b63a84e759b76694d6928d01b4eeRafael Espindola case GNUEABIHF: return "gnueabihf"; 139859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case GNUEABI: return "gnueabi"; 140859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case EABI: return "eabi"; 1412bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng case MachO: return "macho"; 14243bf70986bb13c812e87ca959dd8f2dd9edf802cLogan Chien case Android: return "android"; 1435754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands } 1445754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 1454d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie llvm_unreachable("Invalid EnvironmentType!"); 1465754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 1475754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 1482928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 14906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth return StringSwitch<Triple::ArchType>(Name) 15006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("arm", arm) 15106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("cellspu", cellspu) 15206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mips", mips) 15306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mipsel", mipsel) 15406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mips64", mips64) 15506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mips64el", mips64el) 15606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("msp430", msp430) 15706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc64", ppc64) 15806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc32", ppc) 15906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc", ppc) 16006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("mblaze", mblaze) 1617415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", r600) 16206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("hexagon", hexagon) 16306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("sparc", sparc) 16406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("sparcv9", sparcv9) 16506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("tce", tce) 16606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("thumb", thumb) 16706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86", x86) 16806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86-64", x86_64) 16906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("xcore", xcore) 17049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx", nvptx) 17149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx64", nvptx64) 17206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("le32", le32) 17306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("amdil", amdil) 17406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Default(UnknownArch); 1753c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar} 1763c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 1772928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) { 178baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 179baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // archs which Darwin doesn't use. 180baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 181baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // The matching this routine does is fairly pointless, since it is neither the 182baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // complete architecture list, nor a reasonable subset. The problem is that 183baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // historically the driver driver accepts this and also ties its -march= 184baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // handling to the architecture name, so we need to be careful before removing 185baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // support for it. 186baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 187ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar // This code must be kept in sync with Clang's Darwin specific argument 188ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar // translation. 189ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar 19006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth return StringSwitch<ArchType>(Str) 19106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", Triple::ppc) 19206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", Triple::ppc) 19306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("ppc64", Triple::ppc64) 19406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("i386", "i486", "i486SX", "i586", "i686", Triple::x86) 19506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4", 19606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth Triple::x86) 19706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86_64", Triple::x86_64) 19806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth // This is derived from the driver driver. 19906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("arm", "armv4t", "armv5", "armv6", Triple::arm) 20006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", Triple::arm) 2017415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", Triple::r600) 20249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx", Triple::nvptx) 20349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx64", Triple::nvptx64) 20406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("amdil", Triple::amdil) 20506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Default(Triple::UnknownArch); 206baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar} 207baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 208bbdca3f68edce8b2cc409ed71d256b4dbb0c56adDuncan Sands// Returns architecture name that is understood by the target assembler. 20951cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzovconst char *Triple::getArchNameForAssembler() { 210e1fe09f6826f158def69cff89f3ce4e67e199bb5Daniel Dunbar if (!isOSDarwin() && getVendor() != Triple::Apple) 21151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return NULL; 21251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov 21306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth return StringSwitch<const char*>(getArchName()) 21406accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("i386", "i386") 21506accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("x86_64", "x86_64") 21606accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("powerpc", "ppc") 21706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("powerpc64", "ppc64") 21806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("mblaze", "microblaze", "mblaze") 21906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("arm", "arm") 22006accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv4t", "thumbv4t", "armv4t") 22106accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv5", "armv5e", "thumbv5", "thumbv5e", "armv5") 22206accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv6", "thumbv6", "armv6") 22306accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Cases("armv7", "thumbv7", "armv7") 2247415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", "r600") 22549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx", "nvptx") 22649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx64", "nvptx64") 22706accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("le32", "le32") 22806accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Case("amdil", "amdil") 22906accdade89fbfb0eb6c0aebc6c78264bf48fe54Chandler Carruth .Default(NULL); 23051cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov} 23151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov 2324fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::ArchType parseArch(StringRef ArchName) { 2334fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::ArchType>(ArchName) 2344fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("i386", "i486", "i586", "i686", Triple::x86) 2354fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth // FIXME: Do we need to support these? 2364fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("i786", "i886", "i986", Triple::x86) 2374fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("amd64", "x86_64", Triple::x86_64) 2384fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("powerpc", Triple::ppc) 2394fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("powerpc64", "ppu", Triple::ppc64) 2404fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("mblaze", Triple::mblaze) 2414fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("arm", "xscale", Triple::arm) 2420a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth // FIXME: It would be good to replace these with explicit names for all the 2430a85771de8abb4bb25f655f13a1ae429cd99e299Chandler Carruth // various suffixes supported. 2444fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("armv", Triple::arm) 2454fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("thumb", Triple::thumb) 2464fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("thumbv", Triple::thumb) 2474fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("spu", "cellspu", Triple::cellspu) 2484fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("msp430", Triple::msp430) 2494fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) 250fdf0dc9e0bb5c0b848286e6c96bfc9a390d26775Chandler Carruth .Cases("mipsel", "mipsallegrexel", Triple::mipsel) 2514fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Cases("mips64", "mips64eb", Triple::mips64) 2524fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("mips64el", Triple::mips64el) 2537415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov .Case("r600", Triple::r600) 2544fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("hexagon", Triple::hexagon) 2554fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("sparc", Triple::sparc) 2564fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("sparcv9", Triple::sparcv9) 2574fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("tce", Triple::tce) 2584fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("xcore", Triple::xcore) 25949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx", Triple::nvptx) 26049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski .Case("nvptx64", Triple::nvptx64) 2614fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("le32", Triple::le32) 2624fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("amdil", Triple::amdil) 2634fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownArch); 264335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 265651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar 2664fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::VendorType parseVendor(StringRef VendorName) { 2674fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::VendorType>(VendorName) 2684fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("apple", Triple::Apple) 2694fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("pc", Triple::PC) 2704fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Case("scei", Triple::SCEI) 271a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel .Case("bgp", Triple::BGP) 272a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel .Case("bgq", Triple::BGQ) 273d939cd68f40e6fa0ccd6bee6391374b66abd71a1Hal Finkel .Case("fsl", Triple::Freescale) 2744fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownVendor); 275335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 27623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 2774fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::OSType parseOS(StringRef OSName) { 2784fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::OSType>(OSName) 2794fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("auroraux", Triple::AuroraUX) 2804fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("cygwin", Triple::Cygwin) 2814fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("darwin", Triple::Darwin) 2824fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("dragonfly", Triple::DragonFly) 2834fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("freebsd", Triple::FreeBSD) 2844fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("ios", Triple::IOS) 2854fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("kfreebsd", Triple::KFreeBSD) 2864fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("linux", Triple::Linux) 2874fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("lv2", Triple::Lv2) 2884fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("macosx", Triple::MacOSX) 2894fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("mingw32", Triple::MinGW32) 2904fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("netbsd", Triple::NetBSD) 2914fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("openbsd", Triple::OpenBSD) 2924fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("solaris", Triple::Solaris) 2934fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("win32", Triple::Win32) 2944fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("haiku", Triple::Haiku) 2954fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("minix", Triple::Minix) 2964fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("rtems", Triple::RTEMS) 2974fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("nacl", Triple::NativeClient) 298a47406c442a81aaf368b6e1a9b31d1730975a717Hal Finkel .StartsWith("cnk", Triple::CNK) 299b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher .StartsWith("bitrig", Triple::Bitrig) 3004fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownOS); 301335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 302335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 3034fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruthstatic Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { 3044fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth return StringSwitch<Triple::EnvironmentType>(EnvironmentName) 3054fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("eabi", Triple::EABI) 3064fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("gnueabihf", Triple::GNUEABIHF) 3074fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("gnueabi", Triple::GNUEABI) 3084fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("gnu", Triple::GNU) 3094fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .StartsWith("macho", Triple::MachO) 31043bf70986bb13c812e87ca959dd8f2dd9edf802cLogan Chien .StartsWith("android", Triple::Android) 3114fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth .Default(Triple::UnknownEnvironment); 3125754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 3135754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 314cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from the string representation provided. 315cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// 3160523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This stores the string representation and parses the various pieces into 3170523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// enum members. 318124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler CarruthTriple::Triple(const Twine &Str) 319124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth : Data(Str.str()), 3204fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch(parseArch(getArchName())), 3214fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor(parseVendor(getVendorName())), 3224fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS(parseOS(getOSName())), 3234fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment(parseEnvironment(getEnvironmentName())) { 324124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth} 325cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth 326cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture, 327cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, and OS. 328cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// 3290523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This joins each argument into a canonical string representation and parses 3300523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// them into enum members. It leaves the environment unknown and omits it from 3310523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// the string representation. 332cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr) 333cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()), 3344fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch(parseArch(ArchStr.str())), 3354fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor(parseVendor(VendorStr.str())), 3364fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS(parseOS(OSStr.str())), 337124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth Environment() { 338cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth} 339cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth 340cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// \brief Construct a triple from string representations of the architecture, 341cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// vendor, OS, and environment. 342cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth/// 3430523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// This joins each argument into a canonical string representation and parses 3440523f41841d0860b2e175a4b20d1ecefd7295c4aChandler Carruth/// them into enum members. 345cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler CarruthTriple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 346cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth const Twine &EnvironmentStr) 347cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') + 348cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth EnvironmentStr).str()), 3494fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch(parseArch(ArchStr.str())), 3504fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor(parseVendor(VendorStr.str())), 3514fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS(parseOS(OSStr.str())), 3524fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment(parseEnvironment(EnvironmentStr.str())) { 353cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth} 354cceb8f44a0ca3a9c57ab3a7f4947b2abda531cefChandler Carruth 355335db223926931db204bf54d4accac6677b8e6b1Duncan Sandsstd::string Triple::normalize(StringRef Str) { 356335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Parse into components. 357335db223926931db204bf54d4accac6677b8e6b1Duncan Sands SmallVector<StringRef, 4> Components; 358dac3d36584766a7c00972603598dcdff2f5314d5Chandler Carruth Str.split(Components, "-"); 359335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 360335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If the first component corresponds to a known architecture, preferentially 361335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // use it for the architecture. If the second component corresponds to a 362335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // known vendor, preferentially use it for the vendor, etc. This avoids silly 363335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // component movement when a component parses as (eg) both a valid arch and a 364335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // valid os. 365335db223926931db204bf54d4accac6677b8e6b1Duncan Sands ArchType Arch = UnknownArch; 366335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 0) 3674fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch = parseArch(Components[0]); 368335db223926931db204bf54d4accac6677b8e6b1Duncan Sands VendorType Vendor = UnknownVendor; 369335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 1) 3704fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor = parseVendor(Components[1]); 371335db223926931db204bf54d4accac6677b8e6b1Duncan Sands OSType OS = UnknownOS; 372335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 2) 3734fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS = parseOS(Components[2]); 3745754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands EnvironmentType Environment = UnknownEnvironment; 3755754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands if (Components.size() > 3) 3764fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment = parseEnvironment(Components[3]); 377335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 378335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Note which components are already in their final position. These will not 379335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // be moved. 3805754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands bool Found[4]; 381335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[0] = Arch != UnknownArch; 382335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[1] = Vendor != UnknownVendor; 383335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[2] = OS != UnknownOS; 3845754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Found[3] = Environment != UnknownEnvironment; 385335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 386335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If they are not there already, permute the components into their canonical 387335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // positions by seeing if they parse as a valid architecture, and if so moving 388335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // the component to the architecture position etc. 3895754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) { 390335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Found[Pos]) 391335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; // Already in the canonical position. 392335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 393335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 394335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Do not reparse any components that already matched. 3955754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands if (Idx < array_lengthof(Found) && Found[Idx]) 396335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; 397335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 398335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Does this component parse as valid for the target position? 399335db223926931db204bf54d4accac6677b8e6b1Duncan Sands bool Valid = false; 400335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef Comp = Components[Idx]; 401335db223926931db204bf54d4accac6677b8e6b1Duncan Sands switch (Pos) { 402858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("unexpected component type!"); 403335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 0: 4044fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Arch = parseArch(Comp); 405335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Valid = Arch != UnknownArch; 406335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 407335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 1: 4084fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Vendor = parseVendor(Comp); 409335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Valid = Vendor != UnknownVendor; 410335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 411335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 2: 4124fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth OS = parseOS(Comp); 413ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands Valid = OS != UnknownOS; 414335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 4155754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands case 3: 4164fbf6581514a494c15b82ce2f9b6f79b24216c6fChandler Carruth Environment = parseEnvironment(Comp); 4175754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Valid = Environment != UnknownEnvironment; 4185754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands break; 419335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 420335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (!Valid) 421335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; // Nope, try the next component. 422335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 423335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Move the component to the target position, pushing any non-fixed 424335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // components that are in the way to the right. This tends to give 425335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // good results in the common cases of a forgotten vendor component 426335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // or a wrongly positioned environment. 427335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Pos < Idx) { 428335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert left, pushing the existing components to the right. For 429335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // example, a-b-i386 -> i386-a-b when moving i386 to the front. 430335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef CurrentComponent(""); // The empty component. 431335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Replace the component we are moving with an empty component. 432335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[Idx]); 433335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert the component being moved at Pos, displacing any existing 434335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // components to the right. 435335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 436335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Skip over any fixed components. 437c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth while (i < array_lengthof(Found) && Found[i]) 438c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth ++i; 439335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Place the component at the new position, getting the component 440335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // that was at this position - it will be moved right. 441335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[i]); 442335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 443335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } else if (Pos > Idx) { 444335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Push right by inserting empty components until the component at Idx 445335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // reaches the target position Pos. For example, pc-a -> -pc-a when 446335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // moving pc to the second position. 447335db223926931db204bf54d4accac6677b8e6b1Duncan Sands do { 448335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert one empty component at Idx. 449335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef CurrentComponent(""); // The empty component. 450ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands for (unsigned i = Idx; i < Components.size();) { 451335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Place the component at the new position, getting the component 452335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // that was at this position - it will be moved right. 453335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[i]); 454335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If it was placed on top of an empty component then we are done. 455335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (CurrentComponent.empty()) 456335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 457ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands // Advance to the next component, skipping any fixed components. 45815ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson while (++i < array_lengthof(Found) && Found[i]) 45915ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson ; 460335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 461335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // The last component was pushed off the end - append it. 462335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (!CurrentComponent.empty()) 463335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Components.push_back(CurrentComponent); 464335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 465335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Advance Idx to the component's new position. 466c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth while (++Idx < array_lengthof(Found) && Found[Idx]) 467c5f18d34c37e947fcda67cf160f2307f5de8e7e8Chandler Carruth ; 468335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } while (Idx < Pos); // Add more until the final position is reached. 469335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 470335db223926931db204bf54d4accac6677b8e6b1Duncan Sands assert(Pos < Components.size() && Components[Pos] == Comp && 471335db223926931db204bf54d4accac6677b8e6b1Duncan Sands "Component moved wrong!"); 472335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[Pos] = true; 473335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 474335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 475335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 476335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 477335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Special case logic goes here. At this point Arch, Vendor and OS have the 478335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // correct values for the computed components. 479335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 480335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Stick the corrected components back together to form the normalized string. 481335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::string Normalized; 482335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned i = 0, e = Components.size(); i != e; ++i) { 483335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (i) Normalized += '-'; 484335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Normalized += Components[i]; 485335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 486335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Normalized; 487335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 488335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 489a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getArchName() const { 490a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return StringRef(Data).split('-').first; // Isolate first component 49123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 49223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 493a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getVendorName() const { 494a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 495a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').first; // Isolate second component 49623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 49723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 498a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSName() const { 499a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 500a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Tmp = Tmp.split('-').second; // Strip second component 501a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').first; // Isolate third component 50223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 50323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 504a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getEnvironmentName() const { 505a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 506a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Tmp = Tmp.split('-').second; // Strip second component 507a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').second; // Strip third component 50823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 50923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 510a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSAndEnvironmentName() const { 511a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 512a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').second; // Strip second component 51323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 51423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 515dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnerstatic unsigned EatNumber(StringRef &Str) { 516dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number"); 517087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned Result = 0; 518e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 519087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar do { 520087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the leading digit. 521dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner Result = Result*10 + (Str[0] - '0'); 522087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar 523dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner // Eat the digit. 524dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner Str = Str.substr(1); 525087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9'); 526e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 527dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner return Result; 528dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner} 529dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 530087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbarvoid Triple::getOSVersion(unsigned &Major, unsigned &Minor, 531087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned &Micro) const { 532dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner StringRef OSName = getOSName(); 533dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 534087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Assume that the OS portion of the triple starts with the canonical name. 535087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar StringRef OSTypeName = getOSTypeName(getOS()); 536087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.startswith(OSTypeName)) 537087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar OSName = OSName.substr(OSTypeName.size()); 538e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 539087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Any unset version defaults to 0. 540087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar Major = Minor = Micro = 0; 541e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 542087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Parse up to three components. 543087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned *Components[3] = { &Major, &Minor, &Micro }; 544087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar for (unsigned i = 0; i != 3; ++i) { 545087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9') 546087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar break; 547e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 548087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the leading number. 549087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar *Components[i] = EatNumber(OSName); 550dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 551087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the separator, if present. 552087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.startswith(".")) 553087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar OSName = OSName.substr(1); 554087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar } 555dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner} 556dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 557bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilsonbool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor, 558bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson unsigned &Micro) const { 559bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson getOSVersion(Major, Minor, Micro); 560bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson 561bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson switch (getOS()) { 562858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("unexpected OS for Darwin triple"); 563bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson case Darwin: 564bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Default to darwin8, i.e., MacOSX 10.4. 565bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major == 0) 566bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 8; 567bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Darwin version numbers are skewed from OS X versions. 568bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major < 4) 569bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson return false; 570bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Micro = 0; 571bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Minor = Major - 4; 572bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 10; 573bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson break; 574bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson case MacOSX: 575bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Default to 10.4. 576bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major == 0) { 577bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 10; 578bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Minor = 4; 579bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson } 580bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson if (Major != 10) 581bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson return false; 582bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson break; 583bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson case IOS: 584bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // Ignore the version from the triple. This is only handled because the 585bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // the clang driver combines OS X and IOS support into a common Darwin 586bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // toolchain that wants to know the OS X version number even when targeting 587bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson // IOS. 588bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Major = 10; 589bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Minor = 4; 590bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson Micro = 0; 591bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson break; 592bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson } 593bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson return true; 594bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson} 595bda59fdd71033a8ddfa30ec4b514753017f3da5cBob Wilson 596ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosiervoid Triple::getiOSVersion(unsigned &Major, unsigned &Minor, 597ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier unsigned &Micro) const { 598ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier switch (getOS()) { 599ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier default: llvm_unreachable("unexpected OS for Darwin triple"); 600ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier case Darwin: 601ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier case MacOSX: 602ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier // Ignore the version from the triple. This is only handled because the 603ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier // the clang driver combines OS X and IOS support into a common Darwin 604ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier // toolchain that wants to know the iOS version number even when targeting 605ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier // OS X. 606537c2f5b2ae373a602b88789007ea75196795775Chad Rosier Major = 3; 607ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier Minor = 0; 608ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier Micro = 0; 60926bbdeed6c50c57c4ab02a14edfea876dc71e3f4Chad Rosier break; 610ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier case IOS: 611ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier getOSVersion(Major, Minor, Micro); 612537c2f5b2ae373a602b88789007ea75196795775Chad Rosier // Default to 3.0. 613537c2f5b2ae373a602b88789007ea75196795775Chad Rosier if (Major == 0) 614537c2f5b2ae373a602b88789007ea75196795775Chad Rosier Major = 3; 615ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier break; 616ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier } 617ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier} 618ecee47eab409f6a6fada7ace3d9bee0a0146ac3fChad Rosier 619a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setTriple(const Twine &Str) { 620124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth *this = Triple(Str); 62123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 62223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 62323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) { 62423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setArchName(getArchTypeName(Kind)); 62523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 62623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 62723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) { 62823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setVendorName(getVendorTypeName(Kind)); 62923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 63023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 63123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) { 63223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setOSName(getOSTypeName(Kind)); 63323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 63423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6355754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsvoid Triple::setEnvironment(EnvironmentType Kind) { 6365754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands setEnvironmentName(getEnvironmentTypeName(Kind)); 6375754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 6385754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 6392928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setArchName(StringRef Str) { 6400b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin // Work around a miscompilation bug for Twines in gcc 4.0.3. 6410b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin SmallString<64> Triple; 6420b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += Str; 6430b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += "-"; 6440b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += getVendorName(); 6450b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += "-"; 6460b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += getOSAndEnvironmentName(); 6470b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin setTriple(Triple.str()); 64823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 64923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6502928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setVendorName(StringRef Str) { 65123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 65223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 65323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6542928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSName(StringRef Str) { 65523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (hasEnvironment()) 65623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 65723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + getEnvironmentName()); 65823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 65923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 66023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 66123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6622928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setEnvironmentName(StringRef Str) { 6632928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 66423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + Str); 66523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 66623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6672928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSAndEnvironmentName(StringRef Str) { 66823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 66923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 6706f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6716f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthstatic unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 6726f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth switch (Arch) { 6736f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::UnknownArch: 6746f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 0; 6756f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6766f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::msp430: 6776f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 16; 6786f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6796f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::amdil: 6806f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::arm: 6816f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::cellspu: 6826f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::hexagon: 6836f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::le32: 6846f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mblaze: 6856f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mips: 6866f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mipsel: 68749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case llvm::Triple::nvptx: 6886f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::ppc: 6897415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case llvm::Triple::r600: 6906f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::sparc: 6916f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::tce: 6926f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::thumb: 6936f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::x86: 6946f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::xcore: 6956f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 32; 6966f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 6976f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mips64: 6986f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::mips64el: 69949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case llvm::Triple::nvptx64: 7006f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::ppc64: 7016f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::sparcv9: 7026f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth case llvm::Triple::x86_64: 7036f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return 64; 7046f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth } 7056f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth llvm_unreachable("Invalid architecture value"); 7066f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 7076f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 7086f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch64Bit() const { 7096f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return getArchPointerBitWidth(getArch()) == 64; 7106f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 7116f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 7126f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch32Bit() const { 7136f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return getArchPointerBitWidth(getArch()) == 32; 7146f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 7156f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth 7166f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruthbool Triple::isArch16Bit() const { 7176f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth return getArchPointerBitWidth(getArch()) == 16; 7186f72ac4799a1a20c07cd96cc994dd6394ebff9a2Chandler Carruth} 7197d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7207d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get32BitArchVariant() const { 7217d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth Triple T(*this); 7227d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth switch (getArch()) { 7237d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::UnknownArch: 7247d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::msp430: 7257d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth T.setArch(UnknownArch); 7267d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7277d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7287d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::amdil: 7297d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::arm: 7307d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::cellspu: 7317d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::hexagon: 7327d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::le32: 7337d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mblaze: 7347d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips: 7357d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mipsel: 73649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case Triple::nvptx: 7377d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc: 7387415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case Triple::r600: 7397d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparc: 7407d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::tce: 7417d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::thumb: 7427d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86: 7437d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::xcore: 7447d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth // Already 32-bit. 7457d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7467d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7477d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64: T.setArch(Triple::mips); break; 7487d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64el: T.setArch(Triple::mipsel); break; 74949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case Triple::nvptx64: T.setArch(Triple::nvptx); break; 7507d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc64: T.setArch(Triple::ppc); break; 7517d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparcv9: T.setArch(Triple::sparc); break; 7527d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86_64: T.setArch(Triple::x86); break; 7537d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth } 7547d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth return T; 7557d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth} 7567d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7577d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler CarruthTriple Triple::get64BitArchVariant() const { 7587d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth Triple T(*this); 7597d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth switch (getArch()) { 7607d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::UnknownArch: 7617d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::amdil: 7627d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::arm: 7637d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::cellspu: 7647d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::hexagon: 7657d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::le32: 7667d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mblaze: 7677d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::msp430: 7687415659bf8b8523ab8b706caa461984a199dc3c8Anton Korobeynikov case Triple::r600: 7697d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::tce: 7707d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::thumb: 7717d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::xcore: 7727d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth T.setArch(UnknownArch); 7737d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7747d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7757d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64: 7767d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips64el: 77749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case Triple::nvptx64: 7787d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc64: 7797d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparcv9: 7807d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86_64: 7817d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth // Already 64-bit. 7827d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth break; 7837d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth 7847d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mips: T.setArch(Triple::mips64); break; 7857d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::mipsel: T.setArch(Triple::mips64el); break; 78649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski case Triple::nvptx: T.setArch(Triple::nvptx64); break; 7877d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::ppc: T.setArch(Triple::ppc64); break; 7887d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::sparc: T.setArch(Triple::sparcv9); break; 7897d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth case Triple::x86: T.setArch(Triple::x86_64); break; 7907d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth } 7917d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth return T; 7927d5a289f2d7d75c29df4c17856ab54dd28dec508Chandler Carruth} 793