1 //===--- Triple.cpp - Target triple helper class --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/Triple.h"
12 #include "llvm/ADT/Twine.h"
19 const char *Triple::getArchTypeName(ArchType Kind) {
21 case InvalidArch: return "<invalid>";
22 case UnknownArch: return "unknown";
24 case alpha: return "alpha";
25 case arm: return "arm";
26 case bfin: return "bfin";
27 case cellspu: return "cellspu";
28 case mips: return "mips";
29 case mipsel: return "mipsel";
30 case msp430: return "msp430";
31 case pic16: return "pic16";
32 case ppc64: return "powerpc64";
33 case ppc: return "powerpc";
34 case sparc: return "sparc";
35 case systemz: return "s390x";
36 case thumb: return "thumb";
37 case x86: return "i386";
38 case x86_64: return "x86_64";
39 case xcore: return "xcore";
45 const char *Triple::getVendorTypeName(VendorType Kind) {
47 case UnknownVendor: return "unknown";
49 case Apple: return "apple";
56 const char *Triple::getOSTypeName(OSType Kind) {
58 case UnknownOS: return "unknown";
60 case AuroraUX: return "auroraux";
61 case Cygwin: return "cygwin";
62 case Darwin: return "darwin";
63 case DragonFly: return "dragonfly";
64 case FreeBSD: return "freebsd";
65 case Linux: return "linux";
66 case MinGW32: return "mingw32";
67 case MinGW64: return "mingw64";
68 case NetBSD: return "netbsd";
69 case OpenBSD: return "openbsd";
70 case Solaris: return "solaris";
71 case Win32: return "win32";
77 Triple::ArchType Triple::getArchTypeForLLVMName(const StringRef &Name) {
84 if (Name == "cellspu")
100 if (Name == "systemz")
106 if (Name == "x86-64")
116 void Triple::Parse() const {
117 assert(!isInitialized() && "Invalid parse call.");
119 StringRef ArchName = getArchName();
120 if (ArchName.size() == 4 && ArchName[0] == 'i' &&
121 ArchName[2] == '8' && ArchName[3] == '6' &&
122 ArchName[1] - '3' < 6) // i[3-9]86
124 else if (ArchName == "amd64" || ArchName == "x86_64")
126 else if (ArchName == "bfin")
128 else if (ArchName == "pic16")
130 else if (ArchName == "powerpc")
132 else if (ArchName == "powerpc64")
134 else if (ArchName == "arm" ||
135 ArchName.startswith("armv") ||
136 ArchName == "xscale")
138 else if (ArchName == "thumb" ||
139 ArchName.startswith("thumbv"))
141 else if (ArchName.startswith("alpha"))
143 else if (ArchName == "spu" || ArchName == "cellspu")
145 else if (ArchName == "msp430")
147 else if (ArchName == "mips" || ArchName == "mipsallegrex")
149 else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
152 else if (ArchName == "sparc")
154 else if (ArchName == "s390x")
159 StringRef VendorName = getVendorName();
160 if (VendorName == "apple")
162 else if (VendorName == "pc")
165 Vendor = UnknownVendor;
167 StringRef OSName = getOSName();
168 if (OSName.startswith("auroraux"))
170 else if (OSName.startswith("cygwin"))
172 else if (OSName.startswith("darwin"))
174 else if (OSName.startswith("dragonfly"))
176 else if (OSName.startswith("freebsd"))
178 else if (OSName.startswith("linux"))
180 else if (OSName.startswith("mingw32"))
182 else if (OSName.startswith("mingw64"))
184 else if (OSName.startswith("netbsd"))
186 else if (OSName.startswith("openbsd"))
188 else if (OSName.startswith("solaris"))
190 else if (OSName.startswith("win32"))
195 assert(isInitialized() && "Failed to initialize!");
198 StringRef Triple::getArchName() const {
199 return StringRef(Data).split('-').first; // Isolate first component
202 StringRef Triple::getVendorName() const {
203 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
204 return Tmp.split('-').first; // Isolate second component
207 StringRef Triple::getOSName() const {
208 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
209 Tmp = Tmp.split('-').second; // Strip second component
210 return Tmp.split('-').first; // Isolate third component
213 StringRef Triple::getEnvironmentName() const {
214 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
215 Tmp = Tmp.split('-').second; // Strip second component
216 return Tmp.split('-').second; // Strip third component
219 StringRef Triple::getOSAndEnvironmentName() const {
220 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
221 return Tmp.split('-').second; // Strip second component
224 static unsigned EatNumber(StringRef &Str) {
225 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
226 unsigned Result = Str[0]-'0';
231 // Handle "darwin11".
232 if (Result == 1 && !Str.empty() && Str[0] >= '0' && Str[0] <= '9') {
233 Result = Result*10 + (Str[0] - '0');
241 /// getDarwinNumber - Parse the 'darwin number' out of the specific target
242 /// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
243 /// not defined, return 0's. This requires that the triple have an OSType of
244 /// darwin before it is called.
245 void Triple::getDarwinNumber(unsigned &Maj, unsigned &Min,
246 unsigned &Revision) const {
247 assert(getOS() == Darwin && "Not a darwin target triple!");
248 StringRef OSName = getOSName();
249 assert(OSName.startswith("darwin") && "Unknown darwin target triple!");
251 // Strip off "darwin".
252 OSName = OSName.substr(6);
254 Maj = Min = Revision = 0;
256 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
259 // The major version is the first digit.
260 Maj = EatNumber(OSName);
261 if (OSName.empty()) return;
263 // Handle minor version: 10.4.9 -> darwin8.9.
264 if (OSName[0] != '.')
268 OSName = OSName.substr(1);
270 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
273 Min = EatNumber(OSName);
274 if (OSName.empty()) return;
276 // Handle revision darwin8.9.1
277 if (OSName[0] != '.')
281 OSName = OSName.substr(1);
283 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
286 Revision = EatNumber(OSName);
289 void Triple::setTriple(const Twine &Str) {
294 void Triple::setArch(ArchType Kind) {
295 setArchName(getArchTypeName(Kind));
298 void Triple::setVendor(VendorType Kind) {
299 setVendorName(getVendorTypeName(Kind));
302 void Triple::setOS(OSType Kind) {
303 setOSName(getOSTypeName(Kind));
306 void Triple::setArchName(const StringRef &Str) {
307 setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
310 void Triple::setVendorName(const StringRef &Str) {
311 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
314 void Triple::setOSName(const StringRef &Str) {
315 if (hasEnvironment())
316 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
317 "-" + getEnvironmentName());
319 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
322 void Triple::setEnvironmentName(const StringRef &Str) {
323 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
327 void Triple::setOSAndEnvironmentName(const StringRef &Str) {
328 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);