Triple.cpp revision fb23462889ff2dcd016a4b4169ebce94a878218e
123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//===--- Triple.cpp - Target triple helper class --------------------------===//
223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//                     The LLVM Compiler Infrastructure
423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// This file is distributed under the University of Illinois Open Source
623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// License. See LICENSE.TXT for details.
723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//===----------------------------------------------------------------------===//
923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include "llvm/ADT/Triple.h"
110b22873adc26711e44a6f2e06eb0e97a01787594Jeffrey Yasskin#include "llvm/ADT/SmallString.h"
125754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands#include "llvm/ADT/STLExtras.h"
1370748756427c115b9344c7ce7759ff7041ce879bMikhail Glushenkov#include <cstring>
1423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarusing namespace llvm;
1523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getArchTypeName(ArchType Kind) {
1723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
1823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case InvalidArch: return "<invalid>";
1923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownArch: return "unknown";
20e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach
216337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case alpha:   return "alpha";
226337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case arm:     return "arm";
23d950941e138455ebcd7a5f55805dcb977892e3e3Jakob Stoklund Olesen  case bfin:    return "bfin";
246337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case cellspu: return "cellspu";
256337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case mips:    return "mips";
266337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case mipsel:  return "mipsel";
276337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case msp430:  return "msp430";
288c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case ppc64:   return "powerpc64";
298c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case ppc:     return "powerpc";
306337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case sparc:   return "sparc";
3187c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  case sparcv9: return "sparcv9";
326337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case systemz: return "s390x";
3374db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  case tce:     return "tce";
346337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case thumb:   return "thumb";
356337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86:     return "i386";
366337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86_64:  return "x86_64";
378c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case xcore:   return "xcore";
38a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  case mblaze:  return "mblaze";
39e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx32:   return "ptx32";
40e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx64:   return "ptx64";
4123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
4223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
4323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
4423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
4523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
46688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbarconst char *Triple::getArchTypePrefix(ArchType Kind) {
47688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  switch (Kind) {
48688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  default:
49688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar    return 0;
50688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
51688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case alpha:   return "alpha";
52688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
53688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case arm:
54688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case thumb:   return "arm";
55688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
56688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case bfin:    return "bfin";
57688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
58688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case cellspu: return "spu";
59688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
60688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case ppc64:
61688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case ppc:     return "ppc";
62688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
63a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  case mblaze:  return "mblaze";
64a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck
6587c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  case sparcv9:
66688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case sparc:   return "sparc";
67688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
68688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86:
69688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86_64:  return "x86";
70f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
71688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case xcore:   return "xcore";
72f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
73e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx32:   return "ptx";
74e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  case ptx64:   return "ptx";
75688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  }
76688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar}
77688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
7823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) {
7923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
8023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownVendor: return "unknown";
8123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
8223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Apple: return "apple";
8356ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner  case PC: return "pc";
846046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson  case SCEI: return "scei";
8523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
8623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
8723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
8823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
8923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
9023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) {
9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
9223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownOS: return "unknown";
9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
94852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  case AuroraUX: return "auroraux";
956337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Cygwin: return "cygwin";
9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Darwin: return "darwin";
977eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar  case DragonFly: return "dragonfly";
9823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case FreeBSD: return "freebsd";
990dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar  case IOS: return "ios";
100652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands  case KFreeBSD: return "kfreebsd";
10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Linux: return "linux";
102cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan  case Lv2: return "lv2";
1031af394766fe4e725d5af2fe82c2ad9cfcbc7dd34Daniel Dunbar  case MacOSX: return "macosx";
1046337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case MinGW32: return "mingw32";
105b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner  case NetBSD: return "netbsd";
106cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands  case OpenBSD: return "openbsd";
107e0fb75d5864c0eef0464b216ac46bc1642469508Edward O'Callaghan  case Psp: return "psp";
108fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  case Solaris: return "solaris";
1096337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Win32: return "win32";
110a43fc3452b4c5a853054b6b671eacbdd05039130Chris Lattner  case Haiku: return "haiku";
11129269d03af6dc3feb69d0230831a059f39c03700Chris Lattner  case Minix: return "minix";
1126ced1d12dd7ee18d65a6df6e66c9662753a5876dDouglas Gregor  case RTEMS: return "rtems";
113fb23462889ff2dcd016a4b4169ebce94a878218eIvan Krasin  case NativeClient: return "nacl";
11423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
11523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
11623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
11723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
11823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1195754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sandsconst char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
1205754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  switch (Kind) {
1215754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  case UnknownEnvironment: return "unknown";
122859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case GNU: return "gnu";
123859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case GNUEABI: return "gnueabi";
124859f8183639346378ed29d1e04a4b070ebc7e97fRenato Golin  case EABI: return "eabi";
1252bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng  case MachO: return "macho";
1265754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  }
1275754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
1285754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands  return "<invalid>";
1295754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands}
1305754a4525625a67a6c9b4f63512ea9db6997bf05Duncan Sands
1312928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
1323c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "alpha")
1333c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return alpha;
1343c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "arm")
1353c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return arm;
1363c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "bfin")
1373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return bfin;
1383c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "cellspu")
1393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return cellspu;
1403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "mips")
1413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return mips;
1423c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "mipsel")
1433c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return mipsel;
1443c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "msp430")
1453c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return msp430;
1463c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "ppc64")
1473c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return ppc64;
14812b2772578103952fb623b551fcaeb3cce069467NAKAMURA Takumi  if (Name == "ppc32")
14912b2772578103952fb623b551fcaeb3cce069467NAKAMURA Takumi    return ppc;
1503c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "ppc")
1513c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return ppc;
152a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  if (Name == "mblaze")
153a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck    return mblaze;
1543c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "sparc")
1553c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return sparc;
15687c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  if (Name == "sparcv9")
15787c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner    return sparcv9;
1583c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "systemz")
1593c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return systemz;
16074db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  if (Name == "tce")
16174db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman    return tce;
1623c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "thumb")
1633c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return thumb;
1643c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "x86")
1653c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return x86;
166b796c4fde4f558d3b15455ff9ac8fb6bf62b8033Chris Lattner  if (Name == "x86-64")
1673c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return x86_64;
1683c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "xcore")
1693c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return xcore;
170e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  if (Name == "ptx32")
171e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return ptx32;
172e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  if (Name == "ptx64")
173e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return ptx64;
1743c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
1753c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  return UnknownArch;
1763c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar}
1773c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
1782928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarTriple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) {
179baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
180baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // archs which Darwin doesn't use.
181baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
182baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // The matching this routine does is fairly pointless, since it is neither the
183baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // complete architecture list, nor a reasonable subset. The problem is that
184baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // historically the driver driver accepts this and also ties its -march=
185baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // handling to the architecture name, so we need to be careful before removing
186baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // support for it.
187baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
188ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar  // This code must be kept in sync with Clang's Darwin specific argument
189ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar  // translation.
190ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar
191baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "ppc" || Str == "ppc601" || Str == "ppc603" || Str == "ppc604" ||
192baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "ppc604e" || Str == "ppc750" || Str == "ppc7400" ||
193baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "ppc7450" || Str == "ppc970")
194baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::ppc;
195baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
196baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "ppc64")
197baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::ppc64;
198baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
199baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "i386" || Str == "i486" || Str == "i486SX" || Str == "pentium" ||
200baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "i586" || Str == "pentpro" || Str == "i686" || Str == "pentIIm3" ||
201baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "pentIIm5" || Str == "pentium4")
202baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::x86;
203baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
204baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "x86_64")
205baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::x86_64;
206baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
207baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // This is derived from the driver driver.
208baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "arm" || Str == "armv4t" || Str == "armv5" || Str == "xscale" ||
209efd7919618d59bd0e3fcf861cc0d1eacbbed0ac6Sean Callanan      Str == "armv6" || Str == "armv7" || Str == "armv7f" || Str == "armv7k" ||
210efd7919618d59bd0e3fcf861cc0d1eacbbed0ac6Sean Callanan      Str == "armv7s")
211baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::arm;
212baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
213e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  if (Str == "ptx32")
214e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return Triple::ptx32;
215e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  if (Str == "ptx64")
216e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return Triple::ptx64;
217f7a3c50183726c5bbb02bb08d97e65f1066a249fNick Lewycky
218baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  return Triple::UnknownArch;
219baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar}
220baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
221bbdca3f68edce8b2cc409ed71d256b4dbb0c56adDuncan Sands// Returns architecture name that is understood by the target assembler.
22251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzovconst char *Triple::getArchNameForAssembler() {
223e1fe09f6826f158def69cff89f3ce4e67e199bb5Daniel Dunbar  if (!isOSDarwin() && getVendor() != Triple::Apple)
22451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return NULL;
22551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov
22651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  StringRef Str = getArchName();
22751cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "i386")
22851cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "i386";
22951cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "x86_64")
23051cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "x86_64";
23151cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "powerpc")
23251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "ppc";
23351cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "powerpc64")
23451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "ppc64";
235a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  if (Str == "mblaze" || Str == "microblaze")
236a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck    return "mblaze";
23751cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "arm")
23851cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "arm";
23951cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "armv4t" || Str == "thumbv4t")
24051cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "armv4t";
241e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach  if (Str == "armv5" || Str == "armv5e" || Str == "thumbv5"
242e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach      || Str == "thumbv5e")
24351cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "armv5";
24451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "armv6" || Str == "thumbv6")
24551cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "armv6";
24651cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  if (Str == "armv7" || Str == "thumbv7")
24751cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov    return "armv7";
248e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  if (Str == "ptx32")
249e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return "ptx32";
250e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  if (Str == "ptx64")
251e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return "ptx64";
25251cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov  return NULL;
25351cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov}
25451cdac02c4125b8545728eb30ab5f54e437d6377Viktor Kutuzov
25523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
25623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
257335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::ArchType Triple::ParseArch(StringRef ArchName) {
258e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach  if (ArchName.size() == 4 && ArchName[0] == 'i' &&
259e509aa961c3f062359ced5d1809a95240124a052Jim Grosbach      ArchName[2] == '8' && ArchName[3] == '6' &&
2606337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar      ArchName[1] - '3' < 6) // i[3-9]86
261335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return x86;
26223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "amd64" || ArchName == "x86_64")
263335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return x86_64;
264b26bc42a2c62a4816647fd9cf4d5e0919bb18f37Daniel Dunbar  else if (ArchName == "bfin")
265335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return bfin;
26623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "powerpc")
267335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return ppc;
268cc9fa81fe1675b29fa813945c52abee692229143Edward O'Callaghan  else if ((ArchName == "powerpc64") || (ArchName == "ppu"))
269335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return ppc64;
270a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck  else if (ArchName == "mblaze")
271335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return mblaze;
2726337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "arm" ||
2732447389bac8b4fc1b1edb3240a408a92616f2ca2Daniel Dunbar           ArchName.startswith("armv") ||
2742447389bac8b4fc1b1edb3240a408a92616f2ca2Daniel Dunbar           ArchName == "xscale")
275335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return arm;
2766337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "thumb" ||
2776337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar           ArchName.startswith("thumbv"))
278335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return thumb;
2796337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName.startswith("alpha"))
280335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return alpha;
2816337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "spu" || ArchName == "cellspu")
282335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return cellspu;
2836337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "msp430")
284335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return msp430;
285f86b76ead71649c58d34e625416008b4fec95eb8Joerg Sonnenberger  else if (ArchName == "mips" || ArchName == "mipseb" ||
286f86b76ead71649c58d34e625416008b4fec95eb8Joerg Sonnenberger           ArchName == "mipsallegrex")
287335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return mips;
2886337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
2896337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar           ArchName == "psp")
290335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return mipsel;
2916337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "sparc")
292335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return sparc;
29387c06d617917f4a388fbe9db81198e13cde3e431Chris Lattner  else if (ArchName == "sparcv9")
294335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return sparcv9;
2956337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "s390x")
296335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return systemz;
29774db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  else if (ArchName == "tce")
298335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return tce;
299768f1dd48fbc1582213271f2698a0328d03d4d7eRichard Osborne  else if (ArchName == "xcore")
300335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return xcore;
301e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  else if (ArchName == "ptx32")
302e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return ptx32;
303e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski  else if (ArchName == "ptx64")
304e1fee48cd0d1e515f247fe3bceceb0f854623f73Justin Holewinski    return ptx64;
30523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
306335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return UnknownArch;
307335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
308651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
309335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::VendorType Triple::ParseVendor(StringRef VendorName) {
31023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (VendorName == "apple")
311335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return Apple;
31223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (VendorName == "pc")
313335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return PC;
3146046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson  else if (VendorName == "scei")
3156046cffbaf584b5d6bd7baf827794a5f91a07a9bJohn Thompson    return SCEI;
31623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
317335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return UnknownVendor;
318335db223926931db204bf54d4accac6677b8e6b1Duncan Sands}
31923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
320335db223926931db204bf54d4accac6677b8e6b1Duncan SandsTriple::OSType Triple::ParseOS(StringRef OSName) {
321a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  if (OSName.startswith("auroraux"))
322335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return AuroraUX;
3236337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (OSName.startswith("cygwin"))
324335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return Cygwin;
325a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("darwin"))
326335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return Darwin;
327a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("dragonfly"))
328335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return DragonFly;
329a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("freebsd"))
330335db223926931db204bf54d4accac6677b8e6b1Duncan Sands    return FreeBSD;
3310dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar  else if (OSName.startswith("ios"))
3320dde4c00ee3b3514fcbabb7bca6b1f1189c4c5b9Daniel Dunbar    return IOS;
333652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands  else if (OSName.startswith("kfreebsd"))
334652b48bf231521642c53221a7d10a0acf2030f48Duncan Sands    return KFreeBSD;
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