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