Triple.cpp revision ed6878842bcfb0a923834ad95fb33a2c2507fbe7
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
12a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar#include "llvm/ADT/Twine.h"
1323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include <cassert>
1470748756427c115b9344c7ce7759ff7041ce879bMikhail Glushenkov#include <cstring>
1523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarusing namespace llvm;
1623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
1823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getArchTypeName(ArchType Kind) {
2023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
2123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case InvalidArch: return "<invalid>";
2223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownArch: return "unknown";
236337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar
246337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case alpha:   return "alpha";
256337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case arm:     return "arm";
26d950941e138455ebcd7a5f55805dcb977892e3e3Jakob Stoklund Olesen  case bfin:    return "bfin";
276337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case cellspu: return "cellspu";
286337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case mips:    return "mips";
296337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case mipsel:  return "mipsel";
306337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case msp430:  return "msp430";
31fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  case pic16:   return "pic16";
328c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case ppc64:   return "powerpc64";
338c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case ppc:     return "powerpc";
346337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case sparc:   return "sparc";
356337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case systemz: return "s390x";
3674db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  case tce:     return "tce";
376337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case thumb:   return "thumb";
386337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86:     return "i386";
396337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case x86_64:  return "x86_64";
408c2f1d7e44d214bc2242a8c6faa4b624b3876540Daniel Dunbar  case xcore:   return "xcore";
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
63688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case sparc:   return "sparc";
64688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
65688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86:
66688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case x86_64:  return "x86";
67688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  case xcore:   return "xcore";
68688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar  }
69688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar}
70688b55b436b4a3a036f0827dc484b5f219ace1a3Daniel Dunbar
7123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) {
7223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
7323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownVendor: return "unknown";
7423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
7523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Apple: return "apple";
7656ce0f415cdf42d5c401035e2336c15e9031f03dChris Lattner  case PC: return "pc";
7723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
7823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
7923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
8023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
8123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
8223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) {
8323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
8423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownOS: return "unknown";
8523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
86852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  case AuroraUX: return "auroraux";
876337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Cygwin: return "cygwin";
8823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Darwin: return "darwin";
897eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar  case DragonFly: return "dragonfly";
9023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case FreeBSD: return "freebsd";
9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Linux: return "linux";
926337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case MinGW32: return "mingw32";
938e6208304bb1a885bc5970c090c97eaebf8a15f8Chris Lattner  case MinGW64: return "mingw64";
94b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner  case NetBSD: return "netbsd";
95cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands  case OpenBSD: return "openbsd";
96fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  case Solaris: return "solaris";
976337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  case Win32: return "win32";
9823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
9923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
10023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
10223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1033c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel DunbarTriple::ArchType Triple::getArchTypeForLLVMName(const StringRef &Name) {
1043c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "alpha")
1053c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return alpha;
1063c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "arm")
1073c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return arm;
1083c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "bfin")
1093c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return bfin;
1103c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "cellspu")
1113c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return cellspu;
1123c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "mips")
1133c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return mips;
1143c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "mipsel")
1153c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return mipsel;
1163c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "msp430")
1173c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return msp430;
118fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  if (Name == "pic16")
119fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar    return pic16;
1203c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "ppc64")
1213c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return ppc64;
1223c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "ppc")
1233c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return ppc;
1243c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "sparc")
1253c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return sparc;
1263c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "systemz")
1273c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return systemz;
12874db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  if (Name == "tce")
12974db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman    return tce;
1303c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "thumb")
1313c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return thumb;
1323c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "x86")
1333c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return x86;
134b796c4fde4f558d3b15455ff9ac8fb6bf62b8033Chris Lattner  if (Name == "x86-64")
1353c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return x86_64;
1363c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (Name == "xcore")
1373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    return xcore;
1383c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
1393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  return UnknownArch;
1403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar}
1413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
142baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel DunbarTriple::ArchType Triple::getArchTypeForDarwinArchName(const StringRef &Str) {
143baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
144baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // archs which Darwin doesn't use.
145baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
146baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // The matching this routine does is fairly pointless, since it is neither the
147baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // complete architecture list, nor a reasonable subset. The problem is that
148baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // historically the driver driver accepts this and also ties its -march=
149baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // handling to the architecture name, so we need to be careful before removing
150baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // support for it.
151baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
152ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar  // This code must be kept in sync with Clang's Darwin specific argument
153ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar  // translation.
154ed6878842bcfb0a923834ad95fb33a2c2507fbe7Daniel Dunbar
155baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "ppc" || Str == "ppc601" || Str == "ppc603" || Str == "ppc604" ||
156baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "ppc604e" || Str == "ppc750" || Str == "ppc7400" ||
157baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "ppc7450" || Str == "ppc970")
158baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::ppc;
159baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
160baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "ppc64")
161baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::ppc64;
162baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
163baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "i386" || Str == "i486" || Str == "i486SX" || Str == "pentium" ||
164baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "i586" || Str == "pentpro" || Str == "i686" || Str == "pentIIm3" ||
165baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "pentIIm5" || Str == "pentium4")
166baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::x86;
167baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
168baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "x86_64")
169baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::x86_64;
170baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
171baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  // This is derived from the driver driver.
172baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  if (Str == "arm" || Str == "armv4t" || Str == "armv5" || Str == "xscale" ||
173baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar      Str == "armv6" || Str == "armv7")
174baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar    return Triple::arm;
175baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
176baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar  return Triple::UnknownArch;
177baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar}
178baf9b562309ae0f82774a6a3b4ffb9417a43a032Daniel Dunbar
17923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
18023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
18123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::Parse() const {
18223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  assert(!isInitialized() && "Invalid parse call.");
18323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
184a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef ArchName = getArchName();
185651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar  StringRef VendorName = getVendorName();
186651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar  StringRef OSName = getOSName();
187651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
18823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (ArchName.size() == 4 && ArchName[0] == 'i' &&
1896337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar      ArchName[2] == '8' && ArchName[3] == '6' &&
1906337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar      ArchName[1] - '3' < 6) // i[3-9]86
19123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = x86;
19223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "amd64" || ArchName == "x86_64")
19323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = x86_64;
194b26bc42a2c62a4816647fd9cf4d5e0919bb18f37Daniel Dunbar  else if (ArchName == "bfin")
195b26bc42a2c62a4816647fd9cf4d5e0919bb18f37Daniel Dunbar    Arch = bfin;
196fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  else if (ArchName == "pic16")
197fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar    Arch = pic16;
19823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "powerpc")
19923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = ppc;
20023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "powerpc64")
20123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = ppc64;
2026337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "arm" ||
2032447389bac8b4fc1b1edb3240a408a92616f2ca2Daniel Dunbar           ArchName.startswith("armv") ||
2042447389bac8b4fc1b1edb3240a408a92616f2ca2Daniel Dunbar           ArchName == "xscale")
2056337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = arm;
2066337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "thumb" ||
2076337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar           ArchName.startswith("thumbv"))
2086337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = thumb;
2096337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName.startswith("alpha"))
2106337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = alpha;
2116337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "spu" || ArchName == "cellspu")
2126337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = cellspu;
2136337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "msp430")
2146337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = msp430;
2156337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "mips" || ArchName == "mipsallegrex")
2166337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = mips;
2176337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
2186337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar           ArchName == "psp")
2196337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = mipsel;
2206337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "sparc")
2216337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = sparc;
2226337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (ArchName == "s390x")
2236337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    Arch = systemz;
22474db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman  else if (ArchName == "tce")
22574db89e30fbd97808786026e56bcf1edb37469c7Eli Friedman    Arch = tce;
226768f1dd48fbc1582213271f2698a0328d03d4d7eRichard Osborne  else if (ArchName == "xcore")
227768f1dd48fbc1582213271f2698a0328d03d4d7eRichard Osborne    Arch = xcore;
22823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
22923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = UnknownArch;
23023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
231651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
232651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar  // Handle some exceptional cases where the OS / environment components are
233651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar  // stuck into the vendor field.
234651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar  if (StringRef(getTriple()).count('-') == 1) {
235651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar    StringRef VendorName = getVendorName();
236651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
237651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar    if (VendorName.startswith("mingw32")) { // 'i386-mingw32', etc.
238651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar      Vendor = PC;
239651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar      OS = MinGW32;
240651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar      return;
241651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar    }
242651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
243651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar    // arm-elf is another example, but we don't currently parse anything about
244651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar    // the environment.
245651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar  }
246651aa689cc37d5932fac0e096aa8b536f282aa21Daniel Dunbar
24723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (VendorName == "apple")
24823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Vendor = Apple;
24923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (VendorName == "pc")
25023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Vendor = PC;
25123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
25223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Vendor = UnknownVendor;
25323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
254a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  if (OSName.startswith("auroraux"))
255852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands    OS = AuroraUX;
2566337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (OSName.startswith("cygwin"))
2576337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    OS = Cygwin;
258a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("darwin"))
25923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = Darwin;
260a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("dragonfly"))
2617eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar    OS = DragonFly;
262a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("freebsd"))
26323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = FreeBSD;
264a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("linux"))
26523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = Linux;
2666337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (OSName.startswith("mingw32"))
2676337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    OS = MinGW32;
2688e6208304bb1a885bc5970c090c97eaebf8a15f8Chris Lattner  else if (OSName.startswith("mingw64"))
2698e6208304bb1a885bc5970c090c97eaebf8a15f8Chris Lattner    OS = MinGW64;
270a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("netbsd"))
271b8ac841c9a275cc8d4e1a92dd06cc99323e35fa2Chris Lattner    OS = NetBSD;
272a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  else if (OSName.startswith("openbsd"))
273cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands    OS = OpenBSD;
274fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar  else if (OSName.startswith("solaris"))
275fdb0b7b555aaea054f85f654275fce56e5d7d1d3Daniel Dunbar    OS = Solaris;
2766337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar  else if (OSName.startswith("win32"))
2776337f15b5a73c3eeb644d59cf34d37d4a278f5f7Daniel Dunbar    OS = Win32;
27823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
27923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = UnknownOS;
28023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
28123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  assert(isInitialized() && "Failed to initialize!");
28223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
28323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
284a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getArchName() const {
285a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return StringRef(Data).split('-').first;           // Isolate first component
28623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
28723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
288a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getVendorName() const {
289a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
290a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').first;                       // Isolate second component
29123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
29223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
293a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSName() const {
294a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
295a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Tmp = Tmp.split('-').second;                       // Strip second component
296a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').first;                       // Isolate third component
29723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
29823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
299a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getEnvironmentName() const {
300a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
301a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Tmp = Tmp.split('-').second;                       // Strip second component
302a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').second;                      // Strip third component
30323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
30423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
305a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel DunbarStringRef Triple::getOSAndEnvironmentName() const {
306a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
307a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  return Tmp.split('-').second;                      // Strip second component
30823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
30923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
310dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnerstatic unsigned EatNumber(StringRef &Str) {
311dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
312dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  unsigned Result = Str[0]-'0';
313dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
314dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Eat the digit.
315dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  Str = Str.substr(1);
316dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
317dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Handle "darwin11".
318dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (Result == 1 && !Str.empty() && Str[0] >= '0' && Str[0] <= '9') {
319dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    Result = Result*10 + (Str[0] - '0');
320dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    // Eat the digit.
321dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    Str = Str.substr(1);
322dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  }
323dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
324dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  return Result;
325dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner}
326dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
327dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner/// getDarwinNumber - Parse the 'darwin number' out of the specific target
328dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner/// triple.  For example, if we have darwin8.5 return 8,5,0.  If any entry is
329dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner/// not defined, return 0's.  This requires that the triple have an OSType of
330dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner/// darwin before it is called.
331dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattnervoid Triple::getDarwinNumber(unsigned &Maj, unsigned &Min,
332dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner                             unsigned &Revision) const {
333dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  assert(getOS() == Darwin && "Not a darwin target triple!");
334dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  StringRef OSName = getOSName();
335dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  assert(OSName.startswith("darwin") && "Unknown darwin target triple!");
336dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
337dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Strip off "darwin".
338dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  OSName = OSName.substr(6);
339dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
340dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  Maj = Min = Revision = 0;
341dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
342dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
343dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    return;
344dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
345dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // The major version is the first digit.
346dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  Maj = EatNumber(OSName);
347dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName.empty()) return;
348dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
349dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Handle minor version: 10.4.9 -> darwin8.9.
350dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName[0] != '.')
351dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    return;
352dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
353dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Eat the '.'.
354dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  OSName = OSName.substr(1);
355dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
356dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
357dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    return;
358dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
359dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  Min = EatNumber(OSName);
360dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName.empty()) return;
361dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
362dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Handle revision darwin8.9.1
363dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName[0] != '.')
364dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    return;
365dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
366dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  // Eat the '.'.
367dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  OSName = OSName.substr(1);
368dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
369dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
370dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner    return;
371dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
372dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner  Revision = EatNumber(OSName);
373dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner}
374dfc17f75e81250f3dcf06938f164481a77a50d60Chris Lattner
375a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setTriple(const Twine &Str) {
376a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbar  Data = Str.str();
37723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Arch = InvalidArch;
37823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
37923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
38023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) {
38123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setArchName(getArchTypeName(Kind));
38223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
38323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
38423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) {
38523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setVendorName(getVendorTypeName(Kind));
38623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
38723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
38823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) {
38923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setOSName(getOSTypeName(Kind));
39023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
39123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
392a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setArchName(const StringRef &Str) {
39323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
39423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
39523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
396a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setVendorName(const StringRef &Str) {
39723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
39823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
39923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
400a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setOSName(const StringRef &Str) {
40123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (hasEnvironment())
40223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
40323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar              "-" + getEnvironmentName());
40423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
40523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
40623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
40723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
408a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setEnvironmentName(const StringRef &Str) {
40923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
41023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar            "-" + Str);
41123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
41223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
413a14d225ef4d3d8bd8ec9ec913246d1fb47d2edc1Daniel Dunbarvoid Triple::setOSAndEnvironmentName(const StringRef &Str) {
41423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
41523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
416