Triple.cpp revision 193323
1193323Sed//===--- Triple.cpp - Target triple helper class --------------------------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed
10193323Sed#include "llvm/ADT/Triple.h"
11193323Sed#include <cassert>
12193323Sed#include <cstring>
13193323Sedusing namespace llvm;
14193323Sed
15193323Sed//
16193323Sed
17193323Sedconst char *Triple::getArchTypeName(ArchType Kind) {
18193323Sed  switch (Kind) {
19193323Sed  case InvalidArch: return "<invalid>";
20193323Sed  case UnknownArch: return "unknown";
21193323Sed
22193323Sed  case x86: return "i386";
23193323Sed  case x86_64: return "x86_64";
24193323Sed  case ppc: return "powerpc";
25193323Sed  case ppc64: return "powerpc64";
26193323Sed  }
27193323Sed
28193323Sed  return "<invalid>";
29193323Sed}
30193323Sed
31193323Sedconst char *Triple::getVendorTypeName(VendorType Kind) {
32193323Sed  switch (Kind) {
33193323Sed  case UnknownVendor: return "unknown";
34193323Sed
35193323Sed  case Apple: return "apple";
36193323Sed  case PC: return "PC";
37193323Sed  }
38193323Sed
39193323Sed  return "<invalid>";
40193323Sed}
41193323Sed
42193323Sedconst char *Triple::getOSTypeName(OSType Kind) {
43193323Sed  switch (Kind) {
44193323Sed  case UnknownOS: return "unknown";
45193323Sed
46193323Sed  case Darwin: return "darwin";
47193323Sed  case DragonFly: return "dragonfly";
48193323Sed  case FreeBSD: return "freebsd";
49193323Sed  case Linux: return "linux";
50193323Sed  }
51193323Sed
52193323Sed  return "<invalid>";
53193323Sed}
54193323Sed
55193323Sed//
56193323Sed
57193323Sedvoid Triple::Parse() const {
58193323Sed  assert(!isInitialized() && "Invalid parse call.");
59193323Sed
60193323Sed  std::string ArchName = getArchName();
61193323Sed  if (ArchName.size() == 4 && ArchName[0] == 'i' &&
62193323Sed      ArchName[2] == '8' && ArchName[3] == '6')
63193323Sed    Arch = x86;
64193323Sed  else if (ArchName == "amd64" || ArchName == "x86_64")
65193323Sed    Arch = x86_64;
66193323Sed  else if (ArchName == "powerpc")
67193323Sed    Arch = ppc;
68193323Sed  else if (ArchName == "powerpc64")
69193323Sed    Arch = ppc64;
70193323Sed  else
71193323Sed    Arch = UnknownArch;
72193323Sed
73193323Sed  std::string VendorName = getVendorName();
74193323Sed  if (VendorName == "apple")
75193323Sed    Vendor = Apple;
76193323Sed  else if (VendorName == "pc")
77193323Sed    Vendor = PC;
78193323Sed  else
79193323Sed    Vendor = UnknownVendor;
80193323Sed
81193323Sed  std::string OSName = getOSName();
82193323Sed  if (memcmp(&OSName[0], "darwin", 6) == 0)
83193323Sed    OS = Darwin;
84193323Sed  else if (memcmp(&OSName[0], "dragonfly", 9) == 0)
85193323Sed    OS = DragonFly;
86193323Sed  else if (memcmp(&OSName[0], "freebsd", 7) == 0)
87193323Sed    OS = FreeBSD;
88193323Sed  else if (memcmp(&OSName[0], "linux", 5) == 0)
89193323Sed    OS = Linux;
90193323Sed  else
91193323Sed    OS = UnknownOS;
92193323Sed
93193323Sed  assert(isInitialized() && "Failed to initialize!");
94193323Sed}
95193323Sed
96193323Sedstatic std::string extract(const std::string &A,
97193323Sed                           std::string::size_type begin,
98193323Sed                           std::string::size_type end) {
99193323Sed  if (begin == std::string::npos)
100193323Sed    return "";
101193323Sed  if (end == std::string::npos)
102193323Sed    return A.substr(begin);
103193323Sed  return A.substr(begin, end - begin);
104193323Sed}
105193323Sed
106193323Sedstatic std::string extract1(const std::string &A,
107193323Sed                           std::string::size_type begin,
108193323Sed                           std::string::size_type end) {
109193323Sed  if (begin == std::string::npos || begin == end)
110193323Sed    return "";
111193323Sed  return extract(A, begin + 1, end);
112193323Sed}
113193323Sed
114193323Sedstd::string Triple::getArchName() const {
115193323Sed  std::string Tmp = Data;
116193323Sed  return extract(Tmp, 0, Tmp.find('-'));
117193323Sed}
118193323Sed
119193323Sedstd::string Triple::getVendorName() const {
120193323Sed  std::string Tmp = Data;
121193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
122193323Sed  return extract(Tmp, 0, Tmp.find('-'));
123193323Sed}
124193323Sed
125193323Sedstd::string Triple::getOSName() const {
126193323Sed  std::string Tmp = Data;
127193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
128193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
129193323Sed  return extract(Tmp, 0, Tmp.find('-'));
130193323Sed}
131193323Sed
132193323Sedstd::string Triple::getEnvironmentName() const {
133193323Sed  std::string Tmp = Data;
134193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
135193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
136193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
137193323Sed  return extract(Tmp, 0, std::string::npos);
138193323Sed}
139193323Sed
140193323Sedstd::string Triple::getOSAndEnvironmentName() const {
141193323Sed  std::string Tmp = Data;
142193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
143193323Sed  Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos);
144193323Sed  return extract(Tmp, 0, std::string::npos);
145193323Sed}
146193323Sed
147193323Sedvoid Triple::setTriple(const std::string &Str) {
148193323Sed  Data = Str;
149193323Sed  Arch = InvalidArch;
150193323Sed}
151193323Sed
152193323Sedvoid Triple::setArch(ArchType Kind) {
153193323Sed  setArchName(getArchTypeName(Kind));
154193323Sed}
155193323Sed
156193323Sedvoid Triple::setVendor(VendorType Kind) {
157193323Sed  setVendorName(getVendorTypeName(Kind));
158193323Sed}
159193323Sed
160193323Sedvoid Triple::setOS(OSType Kind) {
161193323Sed  setOSName(getOSTypeName(Kind));
162193323Sed}
163193323Sed
164193323Sedvoid Triple::setArchName(const std::string &Str) {
165193323Sed  setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
166193323Sed}
167193323Sed
168193323Sedvoid Triple::setVendorName(const std::string &Str) {
169193323Sed  setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
170193323Sed}
171193323Sed
172193323Sedvoid Triple::setOSName(const std::string &Str) {
173193323Sed  if (hasEnvironment())
174193323Sed    setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
175193323Sed              "-" + getEnvironmentName());
176193323Sed  else
177193323Sed    setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
178193323Sed}
179193323Sed
180193323Sedvoid Triple::setEnvironmentName(const std::string &Str) {
181193323Sed  setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
182193323Sed            "-" + Str);
183193323Sed}
184193323Sed
185193323Sedvoid Triple::setOSAndEnvironmentName(const std::string &Str) {
186193323Sed  setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
187193323Sed}
188