Triple.cpp revision cd1267d2d68f03026aed21e22f7e28efd510ec5f
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"
1123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include <cassert>
1270748756427c115b9344c7ce7759ff7041ce879bMikhail Glushenkov#include <cstring>
1323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarusing namespace llvm;
1423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
1623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
1723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getArchTypeName(ArchType Kind) {
1823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
1923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case InvalidArch: return "<invalid>";
2023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownArch: return "unknown";
2123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
2223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case x86: return "i386";
2323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case x86_64: return "x86_64";
2423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case ppc: return "powerpc";
2523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case ppc64: return "powerpc64";
2623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
2723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
2823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
2923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
3023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
3123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) {
3223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
3323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownVendor: return "unknown";
3423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
3523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Apple: return "apple";
3623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case PC: return "PC";
3723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
3823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
3923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
4023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
4123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
4223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) {
4323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  switch (Kind) {
4423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case UnknownOS: return "unknown";
4523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
46852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  case AuroraUX: return "auroraux";
4723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Darwin: return "darwin";
487eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar  case DragonFly: return "dragonfly";
4923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case FreeBSD: return "freebsd";
5023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  case Linux: return "linux";
51cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands  case OpenBSD: return "openbsd";
5223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  }
5323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
5423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return "<invalid>";
5523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
5623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
5723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//
5823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
5923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::Parse() const {
6023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  assert(!isInitialized() && "Invalid parse call.");
6123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
6223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string ArchName = getArchName();
6323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (ArchName.size() == 4 && ArchName[0] == 'i' &&
6423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar      ArchName[2] == '8' && ArchName[3] == '6')
6523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = x86;
6623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "amd64" || ArchName == "x86_64")
6723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = x86_64;
6823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "powerpc")
6923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = ppc;
7023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (ArchName == "powerpc64")
7123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = ppc64;
7223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
7323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Arch = UnknownArch;
7423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
7523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string VendorName = getVendorName();
7623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (VendorName == "apple")
7723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Vendor = Apple;
7823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (VendorName == "pc")
7923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Vendor = PC;
8023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
8123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    Vendor = UnknownVendor;
8223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
8323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string OSName = getOSName();
84852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  if (memcmp(&OSName[0], "auroraux", 8) == 0)
85852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands    OS = AuroraUX;
86852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands  else if (memcmp(&OSName[0], "darwin", 6) == 0)
8723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = Darwin;
887eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar  else if (memcmp(&OSName[0], "dragonfly", 9) == 0)
897eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar    OS = DragonFly;
9023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (memcmp(&OSName[0], "freebsd", 7) == 0)
9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = FreeBSD;
9223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else if (memcmp(&OSName[0], "linux", 5) == 0)
9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = Linux;
94cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands  else if (memcmp(&OSName[0], "openbsd", 7) == 0)
95cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands    OS = OpenBSD;
9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
9723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    OS = UnknownOS;
9823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
9923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  assert(isInitialized() && "Failed to initialize!");
10023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
10223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstatic std::string extract(const std::string &A,
10323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar                           std::string::size_type begin,
10423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar                           std::string::size_type end) {
10523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (begin == std::string::npos)
10623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    return "";
10723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (end == std::string::npos)
10823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    return A.substr(begin);
10923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return A.substr(begin, end - begin);
11023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
11123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
11223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstatic std::string extract1(const std::string &A,
11323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar                           std::string::size_type begin,
11423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar                           std::string::size_type end) {
11523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (begin == std::string::npos || begin == end)
11623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    return "";
11723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return extract(A, begin + 1, end);
11823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
11923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
12023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getArchName() const {
12123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string Tmp = Data;
12223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return extract(Tmp, 0, Tmp.find('-'));
12323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
12423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
12523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getVendorName() const {
12623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string Tmp = Data;
12723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
12823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return extract(Tmp, 0, Tmp.find('-'));
12923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
13023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
13123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getOSName() const {
13223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string Tmp = Data;
13323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
13423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
13523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return extract(Tmp, 0, Tmp.find('-'));
13623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
13723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
13823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getEnvironmentName() const {
13923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string Tmp = Data;
14023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
14123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
14223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
14323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return extract(Tmp, 0, std::string::npos);
14423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
14523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
14623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getOSAndEnvironmentName() const {
14723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  std::string Tmp = Data;
14823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
14923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
15023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  return extract(Tmp, 0, std::string::npos);
15123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
15223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
15323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setTriple(const std::string &Str) {
15423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Data = Str;
15523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  Arch = InvalidArch;
15623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
15723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
15823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) {
15923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setArchName(getArchTypeName(Kind));
16023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
16123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
16223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) {
16323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setVendorName(getVendorTypeName(Kind));
16423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
16523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
16623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) {
16723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setOSName(getOSTypeName(Kind));
16823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
16923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
17023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArchName(const std::string &Str) {
17123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
17223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
17323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
17423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendorName(const std::string &Str) {
17523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
17623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
17723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
17823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOSName(const std::string &Str) {
17923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  if (hasEnvironment())
18023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
18123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar              "-" + getEnvironmentName());
18223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  else
18323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar    setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
18423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
18523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
18623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setEnvironmentName(const std::string &Str) {
18723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
18823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar            "-" + Str);
18923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
19023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar
19123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOSAndEnvironmentName(const std::string &Str) {
19223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar  setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
19323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar}
194