Triple.cpp revision 12b2772578103952fb623b551fcaeb3cce069467
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" 11a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar 120b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin#include "llvm/ADT/SmallString.h" 135754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands#include "llvm/ADT/STLExtras.h" 14a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar#include "llvm/ADT/Twine.h" 1523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include <cassert> 1670748756427c115b9344c7ce7759ff7041ce879bMikhail Glushenkov#include <cstring> 1723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarusing namespace llvm; 1823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 2023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 2123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getArchTypeName(ArchType Kind) { 2223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 2323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case InvalidArch: return "<invalid>"; 2423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownArch: return "unknown"; 25e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 266337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case alpha: return "alpha"; 276337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case arm: return "arm"; 28d950941e138455ebcd7a5f55805dcb977892e3e3Jakob Stoklund Olesen case bfin: return "bfin"; 296337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case cellspu: return "cellspu"; 306337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case mips: return "mips"; 316337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case mipsel: return "mipsel"; 326337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case msp430: return "msp430"; 338c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar case ppc64: return "powerpc64"; 348c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar case ppc: return "powerpc"; 356337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case sparc: return "sparc"; 3687c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner case sparcv9: return "sparcv9"; 376337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case systemz: return "s390x"; 3874db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman case tce: return "tce"; 396337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case thumb: return "thumb"; 406337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case x86: return "i386"; 416337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case x86_64: return "x86_64"; 428c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar case xcore: return "xcore"; 43a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck case mblaze: return "mblaze"; 44e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx32: return "ptx32"; 45e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx64: return "ptx64"; 4623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 4723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 4823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return "<invalid>"; 4923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 5023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 51688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbarconst char *Triple::getArchTypePrefix(ArchType Kind) { 52688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar switch (Kind) { 53688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar default: 54688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar return 0; 55688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 56688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case alpha: return "alpha"; 57688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 58688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case arm: 59688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case thumb: return "arm"; 60688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 61688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case bfin: return "bfin"; 62688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 63688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case cellspu: return "spu"; 64688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 65688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case ppc64: 66688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case ppc: return "ppc"; 67688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 68a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck case mblaze: return "mblaze"; 69a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck 7087c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner case sparcv9: 71688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case sparc: return "sparc"; 72688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 73688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case x86: 74688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case x86_64: return "x86"; 75f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 76688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar case xcore: return "xcore"; 77f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 78e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx32: return "ptx"; 79e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski case ptx64: return "ptx"; 80688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar } 81688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar} 82688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar 8323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) { 8423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 8523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownVendor: return "unknown"; 8623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 8723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Apple: return "apple"; 8856ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner case PC: return "pc"; 896046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson case SCEI: return "scei"; 9023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 9223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return "<invalid>"; 9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 9423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 9523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) { 9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 9723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownOS: return "unknown"; 9823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 99852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands case AuroraUX: return "auroraux"; 1006337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case Cygwin: return "cygwin"; 10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Darwin: return "darwin"; 1027eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar case DragonFly: return "dragonfly"; 10323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case FreeBSD: return "freebsd"; 1040dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar case IOS: return "ios"; 10523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Linux: return "linux"; 106cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan case Lv2: return "lv2"; 1071af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar case MacOSX: return "macosx"; 1086337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case MinGW32: return "mingw32"; 109b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner case NetBSD: return "netbsd"; 110cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands case OpenBSD: return "openbsd"; 111e0fb75d5864c0eef0464b216ac46bc1642469508Edward O'Callaghan case Psp: return "psp"; 112fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar case Solaris: return "solaris"; 1136337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar case Win32: return "win32"; 114a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner case Haiku: return "haiku"; 11529269d03af6dc3feb69d0230831a059f39c03700Chris Lattner case Minix: return "minix"; 1166ced1d12dd7ee18d65a6df6e66c9662753a5876dDouglas Gregor case RTEMS: return "rtems"; 11723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 11823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 11923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return "<invalid>"; 12023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 12123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1225754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsconst char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { 1235754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands switch (Kind) { 1245754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands case UnknownEnvironment: return "unknown"; 125859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case GNU: return "gnu"; 126859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case GNUEABI: return "gnueabi"; 127859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin case EABI: return "eabi"; 1282bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng case MachO: return "macho"; 1295754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands } 1305754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 1315754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands return "<invalid>"; 1325754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 1335754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 1342928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 1353c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "alpha") 1363c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return alpha; 1373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "arm") 1383c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return arm; 1393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "bfin") 1403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return bfin; 1413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "cellspu") 1423c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return cellspu; 1433c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "mips") 1443c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return mips; 1453c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "mipsel") 1463c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return mipsel; 1473c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "msp430") 1483c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return msp430; 1493c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "ppc64") 1503c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return ppc64; 15112b2772578103952fb623b551fcaeb3cce069467NAKAMURA Takumi if (Name == "ppc32") 15212b2772578103952fb623b551fcaeb3cce069467NAKAMURA Takumi return ppc; 1533c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "ppc") 1543c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return ppc; 155a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck if (Name == "mblaze") 156a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck return mblaze; 1573c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "sparc") 1583c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return sparc; 15987c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner if (Name == "sparcv9") 16087c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner return sparcv9; 1613c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "systemz") 1623c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return systemz; 16374db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman if (Name == "tce") 16474db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman return tce; 1653c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "thumb") 1663c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return thumb; 1673c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "x86") 1683c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return x86; 169b796c4fde4f558d3b15455ff9ac8fb6bf62b8033Chris Lattner if (Name == "x86-64") 1703c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return x86_64; 1713c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Name == "xcore") 1723c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return xcore; 173e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski if (Name == "ptx32") 174e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return ptx32; 175e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski if (Name == "ptx64") 176e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return ptx64; 1773c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 1783c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar return UnknownArch; 1793c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar} 1803c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 1812928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) { 182baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 183baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // archs which Darwin doesn't use. 184baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 185baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // The matching this routine does is fairly pointless, since it is neither the 186baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // complete architecture list, nor a reasonable subset. The problem is that 187baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // historically the driver driver accepts this and also ties its -march= 188baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // handling to the architecture name, so we need to be careful before removing 189baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // support for it. 190baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 191ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar // This code must be kept in sync with Clang's Darwin specific argument 192ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar // translation. 193ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar 194baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar if (Str == "ppc" || Str == "ppc601" || Str == "ppc603" || Str == "ppc604" || 195baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar Str == "ppc604e" || Str == "ppc750" || Str == "ppc7400" || 196baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar Str == "ppc7450" || Str == "ppc970") 197baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar return Triple::ppc; 198baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 199baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar if (Str == "ppc64") 200baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar return Triple::ppc64; 201baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 202baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar if (Str == "i386" || Str == "i486" || Str == "i486SX" || Str == "pentium" || 203baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar Str == "i586" || Str == "pentpro" || Str == "i686" || Str == "pentIIm3" || 204baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar Str == "pentIIm5" || Str == "pentium4") 205baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar return Triple::x86; 206baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 207baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar if (Str == "x86_64") 208baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar return Triple::x86_64; 209baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 210baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar // This is derived from the driver driver. 211baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar if (Str == "arm" || Str == "armv4t" || Str == "armv5" || Str == "xscale" || 212baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar Str == "armv6" || Str == "armv7") 213baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar return Triple::arm; 214baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 215e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski if (Str == "ptx32") 216e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return Triple::ptx32; 217e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski if (Str == "ptx64") 218e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return Triple::ptx64; 219f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky 220baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar return Triple::UnknownArch; 221baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar} 222baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar 223bbdca3f68edce8b2cc409ed71d256b4dbb0c56adDuncan Sands// Returns architecture name that is understood by the target assembler. 22451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzovconst char *Triple::getArchNameForAssembler() { 225e1fe09f6826f158def69cff89f3ce4e67e199bb5Daniel Dunbar if (!isOSDarwin() && getVendor() != Triple::Apple) 22651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return NULL; 22751cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov 22851cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov StringRef Str = getArchName(); 22951cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "i386") 23051cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "i386"; 23151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "x86_64") 23251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "x86_64"; 23351cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "powerpc") 23451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "ppc"; 23551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "powerpc64") 23651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "ppc64"; 237a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck if (Str == "mblaze" || Str == "microblaze") 238a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck return "mblaze"; 23951cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "arm") 24051cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "arm"; 24151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "armv4t" || Str == "thumbv4t") 24251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "armv4t"; 243e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach if (Str == "armv5" || Str == "armv5e" || Str == "thumbv5" 244e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach || Str == "thumbv5e") 24551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "armv5"; 24651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "armv6" || Str == "thumbv6") 24751cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "armv6"; 24851cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov if (Str == "armv7" || Str == "thumbv7") 24951cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return "armv7"; 250e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski if (Str == "ptx32") 251e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return "ptx32"; 252e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski if (Str == "ptx64") 253e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return "ptx64"; 25451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov return NULL; 25551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov} 25651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov 25723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 25823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 259335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::ArchType Triple::ParseArch(StringRef ArchName) { 260e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach if (ArchName.size() == 4 && ArchName[0] == 'i' && 261e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach ArchName[2] == '8' && ArchName[3] == '6' && 2626337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar ArchName[1] - '3' < 6) // i[3-9]86 263335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return x86; 26423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (ArchName == "amd64" || ArchName == "x86_64") 265335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return x86_64; 266b26bc42a2c62a4816647fd9cf4d5e0919bb18f37Daniel Dunbar else if (ArchName == "bfin") 267335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return bfin; 26823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (ArchName == "powerpc") 269335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return ppc; 270cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan else if ((ArchName == "powerpc64") || (ArchName == "ppu")) 271335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return ppc64; 272a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck else if (ArchName == "mblaze") 273335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return mblaze; 2746337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "arm" || 2752447389bac8b4fc1b1edb3240a408a92616f2ca2Daniel Dunbar ArchName.startswith("armv") || 2762447389bac8b4fc1b1edb3240a408a92616f2ca2Daniel Dunbar ArchName == "xscale") 277335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return arm; 2786337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "thumb" || 2796337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar ArchName.startswith("thumbv")) 280335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return thumb; 2816337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName.startswith("alpha")) 282335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return alpha; 2836337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "spu" || ArchName == "cellspu") 284335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return cellspu; 2856337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "msp430") 286335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return msp430; 287f86b76ead71649c58d34e625416008b4fec95eb8Joerg Sonnenberger else if (ArchName == "mips" || ArchName == "mipseb" || 288f86b76ead71649c58d34e625416008b4fec95eb8Joerg Sonnenberger ArchName == "mipsallegrex") 289335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return mips; 2906337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" || 2916337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar ArchName == "psp") 292335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return mipsel; 2936337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "sparc") 294335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return sparc; 29587c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner else if (ArchName == "sparcv9") 296335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return sparcv9; 2976337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (ArchName == "s390x") 298335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return systemz; 29974db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman else if (ArchName == "tce") 300335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return tce; 301768f1dd48fbc1582213271f2698a0328d03d4d7eRichard Osborne else if (ArchName == "xcore") 302335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return xcore; 303e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski else if (ArchName == "ptx32") 304e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return ptx32; 305e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski else if (ArchName == "ptx64") 306e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski return ptx64; 30723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 308335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return UnknownArch; 309335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 310651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar 311335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::VendorType Triple::ParseVendor(StringRef VendorName) { 31223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (VendorName == "apple") 313335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Apple; 31423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (VendorName == "pc") 315335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return PC; 3166046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson else if (VendorName == "scei") 3176046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson return SCEI; 31823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 319335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return UnknownVendor; 320335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 32123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 322335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::OSType Triple::ParseOS(StringRef OSName) { 323a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar if (OSName.startswith("auroraux")) 324335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return AuroraUX; 3256337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (OSName.startswith("cygwin")) 326335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Cygwin; 327a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar else if (OSName.startswith("darwin")) 328335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Darwin; 329a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar else if (OSName.startswith("dragonfly")) 330335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return DragonFly; 331a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar else if (OSName.startswith("freebsd")) 332335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return FreeBSD; 3330dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar else if (OSName.startswith("ios")) 3340dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar return IOS; 335a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar else if (OSName.startswith("linux")) 336335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Linux; 337cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan else if (OSName.startswith("lv2")) 338335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Lv2; 3391af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar else if (OSName.startswith("macosx")) 3401af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar return MacOSX; 3416337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (OSName.startswith("mingw32")) 342335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return MinGW32; 343a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar else if (OSName.startswith("netbsd")) 344335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return NetBSD; 345a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar else if (OSName.startswith("openbsd")) 346335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return OpenBSD; 347e0fb75d5864c0eef0464b216ac46bc1642469508Edward O'Callaghan else if (OSName.startswith("psp")) 348335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Psp; 349fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar else if (OSName.startswith("solaris")) 350335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Solaris; 3516337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar else if (OSName.startswith("win32")) 352335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Win32; 353a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner else if (OSName.startswith("haiku")) 354335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Haiku; 35529269d03af6dc3feb69d0230831a059f39c03700Chris Lattner else if (OSName.startswith("minix")) 356335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Minix; 357b0e77a228f03e88bf2c5a1b3ccfb829c43ae0732Eli Friedman else if (OSName.startswith("rtems")) 358b0e77a228f03e88bf2c5a1b3ccfb829c43ae0732Eli Friedman return RTEMS; 35923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 360335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return UnknownOS; 361335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 362335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 3635754a4525625a67a6c9b4f63512ea9db6997bf05Duncan SandsTriple::EnvironmentType Triple::ParseEnvironment(StringRef EnvironmentName) { 364859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin if (EnvironmentName.startswith("eabi")) 365859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin return EABI; 366859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin else if (EnvironmentName.startswith("gnueabi")) 367859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin return GNUEABI; 368859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin else if (EnvironmentName.startswith("gnu")) 369859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin return GNU; 3702bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng else if (EnvironmentName.startswith("macho")) 3712bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng return MachO; 372859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin else 373859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin return UnknownEnvironment; 3745754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 3755754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 376335db223926931db204bf54d4accac6677b8e6b1Duncan Sandsvoid Triple::Parse() const { 377335db223926931db204bf54d4accac6677b8e6b1Duncan Sands assert(!isInitialized() && "Invalid parse call."); 378335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 379335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Arch = ParseArch(getArchName()); 380335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Vendor = ParseVendor(getVendorName()); 381335db223926931db204bf54d4accac6677b8e6b1Duncan Sands OS = ParseOS(getOSName()); 382ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands Environment = ParseEnvironment(getEnvironmentName()); 383335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 38423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar assert(isInitialized() && "Failed to initialize!"); 38523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 38623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 387335db223926931db204bf54d4accac6677b8e6b1Duncan Sandsstd::string Triple::normalize(StringRef Str) { 388335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Parse into components. 389335db223926931db204bf54d4accac6677b8e6b1Duncan Sands SmallVector<StringRef, 4> Components; 390335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (size_t First = 0, Last = 0; Last != StringRef::npos; First = Last + 1) { 391335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Last = Str.find('-', First); 392335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Components.push_back(Str.slice(First, Last)); 393335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 394335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 395335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If the first component corresponds to a known architecture, preferentially 396335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // use it for the architecture. If the second component corresponds to a 397335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // known vendor, preferentially use it for the vendor, etc. This avoids silly 398335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // component movement when a component parses as (eg) both a valid arch and a 399335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // valid os. 400335db223926931db204bf54d4accac6677b8e6b1Duncan Sands ArchType Arch = UnknownArch; 401335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 0) 402335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Arch = ParseArch(Components[0]); 403335db223926931db204bf54d4accac6677b8e6b1Duncan Sands VendorType Vendor = UnknownVendor; 404335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 1) 405335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Vendor = ParseVendor(Components[1]); 406335db223926931db204bf54d4accac6677b8e6b1Duncan Sands OSType OS = UnknownOS; 407335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Components.size() > 2) 408335db223926931db204bf54d4accac6677b8e6b1Duncan Sands OS = ParseOS(Components[2]); 4095754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands EnvironmentType Environment = UnknownEnvironment; 4105754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands if (Components.size() > 3) 4115754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Environment = ParseEnvironment(Components[3]); 412335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 413335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Note which components are already in their final position. These will not 414335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // be moved. 4155754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands bool Found[4]; 416335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[0] = Arch != UnknownArch; 417335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[1] = Vendor != UnknownVendor; 418335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[2] = OS != UnknownOS; 4195754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Found[3] = Environment != UnknownEnvironment; 420335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 421335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If they are not there already, permute the components into their canonical 422335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // positions by seeing if they parse as a valid architecture, and if so moving 423335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // the component to the architecture position etc. 4245754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) { 425335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Found[Pos]) 426335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; // Already in the canonical position. 427335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 428335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 429335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Do not reparse any components that already matched. 4305754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands if (Idx < array_lengthof(Found) && Found[Idx]) 431335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; 432335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 433335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Does this component parse as valid for the target position? 434335db223926931db204bf54d4accac6677b8e6b1Duncan Sands bool Valid = false; 435335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef Comp = Components[Idx]; 436335db223926931db204bf54d4accac6677b8e6b1Duncan Sands switch (Pos) { 437335db223926931db204bf54d4accac6677b8e6b1Duncan Sands default: 438335db223926931db204bf54d4accac6677b8e6b1Duncan Sands assert(false && "unexpected component type!"); 439335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 0: 440335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Arch = ParseArch(Comp); 441335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Valid = Arch != UnknownArch; 442335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 443335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 1: 444335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Vendor = ParseVendor(Comp); 445335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Valid = Vendor != UnknownVendor; 446335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 447335db223926931db204bf54d4accac6677b8e6b1Duncan Sands case 2: 448335db223926931db204bf54d4accac6677b8e6b1Duncan Sands OS = ParseOS(Comp); 449ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands Valid = OS != UnknownOS; 450335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 4515754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands case 3: 4525754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Environment = ParseEnvironment(Comp); 4535754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands Valid = Environment != UnknownEnvironment; 4545754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands break; 455335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 456335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (!Valid) 457335db223926931db204bf54d4accac6677b8e6b1Duncan Sands continue; // Nope, try the next component. 458335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 459335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Move the component to the target position, pushing any non-fixed 460335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // components that are in the way to the right. This tends to give 461335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // good results in the common cases of a forgotten vendor component 462335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // or a wrongly positioned environment. 463335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (Pos < Idx) { 464335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert left, pushing the existing components to the right. For 465335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // example, a-b-i386 -> i386-a-b when moving i386 to the front. 466335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef CurrentComponent(""); // The empty component. 467335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Replace the component we are moving with an empty component. 468335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[Idx]); 469335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert the component being moved at Pos, displacing any existing 470335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // components to the right. 471335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 472335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Skip over any fixed components. 4735754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands while (i < array_lengthof(Found) && Found[i]) ++i; 474335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Place the component at the new position, getting the component 475335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // that was at this position - it will be moved right. 476335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[i]); 477335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 478335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } else if (Pos > Idx) { 479335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Push right by inserting empty components until the component at Idx 480335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // reaches the target position Pos. For example, pc-a -> -pc-a when 481335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // moving pc to the second position. 482335db223926931db204bf54d4accac6677b8e6b1Duncan Sands do { 483335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Insert one empty component at Idx. 484335db223926931db204bf54d4accac6677b8e6b1Duncan Sands StringRef CurrentComponent(""); // The empty component. 485ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands for (unsigned i = Idx; i < Components.size();) { 486335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Place the component at the new position, getting the component 487335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // that was at this position - it will be moved right. 488335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::swap(CurrentComponent, Components[i]); 489335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // If it was placed on top of an empty component then we are done. 490335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (CurrentComponent.empty()) 491335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 492ae200c60c31666da81a8550172de03a9f417ba1bDuncan Sands // Advance to the next component, skipping any fixed components. 49315ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson while (++i < array_lengthof(Found) && Found[i]) 49415ec695e8ab1497b55a0bf212de663a63c6d8e32Anders Carlsson ; 495335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 496335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // The last component was pushed off the end - append it. 497335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (!CurrentComponent.empty()) 498335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Components.push_back(CurrentComponent); 499335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 500335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Advance Idx to the component's new position. 5015754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands while (++Idx < array_lengthof(Found) && Found[Idx]) {} 502335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } while (Idx < Pos); // Add more until the final position is reached. 503335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 504335db223926931db204bf54d4accac6677b8e6b1Duncan Sands assert(Pos < Components.size() && Components[Pos] == Comp && 505335db223926931db204bf54d4accac6677b8e6b1Duncan Sands "Component moved wrong!"); 506335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Found[Pos] = true; 507335db223926931db204bf54d4accac6677b8e6b1Duncan Sands break; 508335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 509335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 510335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 511335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Special case logic goes here. At this point Arch, Vendor and OS have the 512335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // correct values for the computed components. 513335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 514335db223926931db204bf54d4accac6677b8e6b1Duncan Sands // Stick the corrected components back together to form the normalized string. 515335db223926931db204bf54d4accac6677b8e6b1Duncan Sands std::string Normalized; 516335db223926931db204bf54d4accac6677b8e6b1Duncan Sands for (unsigned i = 0, e = Components.size(); i != e; ++i) { 517335db223926931db204bf54d4accac6677b8e6b1Duncan Sands if (i) Normalized += '-'; 518335db223926931db204bf54d4accac6677b8e6b1Duncan Sands Normalized += Components[i]; 519335db223926931db204bf54d4accac6677b8e6b1Duncan Sands } 520335db223926931db204bf54d4accac6677b8e6b1Duncan Sands return Normalized; 521335db223926931db204bf54d4accac6677b8e6b1Duncan Sands} 522335db223926931db204bf54d4accac6677b8e6b1Duncan Sands 523a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getArchName() const { 524a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return StringRef(Data).split('-').first; // Isolate first component 52523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 52623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 527a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getVendorName() const { 528a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 529a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').first; // Isolate second component 53023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 53123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 532a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSName() const { 533a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 534a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Tmp = Tmp.split('-').second; // Strip second component 535a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').first; // Isolate third component 53623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 53723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 538a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getEnvironmentName() const { 539a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 540a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Tmp = Tmp.split('-').second; // Strip second component 541a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').second; // Strip third component 54223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 54323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 544a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSAndEnvironmentName() const { 545a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 546a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar return Tmp.split('-').second; // Strip second component 54723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 54823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 549dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnerstatic unsigned EatNumber(StringRef &Str) { 550dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number"); 551087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned Result = 0; 552e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 553087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar do { 554087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the leading digit. 555dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner Result = Result*10 + (Str[0] - '0'); 556087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar 557dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner // Eat the digit. 558dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner Str = Str.substr(1); 559087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9'); 560e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 561dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner return Result; 562dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner} 563dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 564087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbarvoid Triple::getOSVersion(unsigned &Major, unsigned &Minor, 565087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned &Micro) const { 566dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner StringRef OSName = getOSName(); 567dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 568087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Assume that the OS portion of the triple starts with the canonical name. 569087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar StringRef OSTypeName = getOSTypeName(getOS()); 570087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.startswith(OSTypeName)) 571087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar OSName = OSName.substr(OSTypeName.size()); 572e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 573087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Any unset version defaults to 0. 574087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar Major = Minor = Micro = 0; 575e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 576087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Parse up to three components. 577087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar unsigned *Components[3] = { &Major, &Minor, &Micro }; 578087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar for (unsigned i = 0; i != 3; ++i) { 579087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9') 580087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar break; 581e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach 582087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the leading number. 583087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar *Components[i] = EatNumber(OSName); 584dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 585087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar // Consume the separator, if present. 586087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar if (OSName.startswith(".")) 587087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar OSName = OSName.substr(1); 588087d6a59adef985e307ae4dcce670aa87d7b52beDaniel Dunbar } 589dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner} 590dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner 591a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setTriple(const Twine &Str) { 592a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar Data = Str.str(); 59323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = InvalidArch; 59423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 59523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 59623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) { 59723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setArchName(getArchTypeName(Kind)); 59823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 59923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 60023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) { 60123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setVendorName(getVendorTypeName(Kind)); 60223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 60323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 60423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) { 60523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setOSName(getOSTypeName(Kind)); 60623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 60723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6085754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsvoid Triple::setEnvironment(EnvironmentType Kind) { 6095754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands setEnvironmentName(getEnvironmentTypeName(Kind)); 6105754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands} 6115754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands 6122928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setArchName(StringRef Str) { 6130b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin // Work around a miscompilation bug for Twines in gcc 4.0.3. 6140b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin SmallString<64> Triple; 6150b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += Str; 6160b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += "-"; 6170b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += getVendorName(); 6180b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += "-"; 6190b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin Triple += getOSAndEnvironmentName(); 6200b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin setTriple(Triple.str()); 62123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 62223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6232928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setVendorName(StringRef Str) { 62423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 62523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 62623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6272928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSName(StringRef Str) { 62823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (hasEnvironment()) 62923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 63023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + getEnvironmentName()); 63123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 63223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 63323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 63423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6352928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setEnvironmentName(StringRef Str) { 6362928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 63723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + Str); 63823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 63923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6402928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarvoid Triple::setOSAndEnvironmentName(StringRef Str) { 64123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 64223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 643