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 == "pic16")
128 else if (ArchName == "powerpc")
130 else if (ArchName == "powerpc64")
132 else if (ArchName == "arm" ||
133 ArchName.startswith("armv") ||
134 ArchName == "xscale")
136 else if (ArchName == "thumb" ||
137 ArchName.startswith("thumbv"))
139 else if (ArchName.startswith("alpha"))
141 else if (ArchName == "spu" || ArchName == "cellspu")
143 else if (ArchName == "msp430")
145 else if (ArchName == "mips" || ArchName == "mipsallegrex")
147 else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
150 else if (ArchName == "sparc")
152 else if (ArchName == "s390x")
157 StringRef VendorName = getVendorName();
158 if (VendorName == "apple")
160 else if (VendorName == "pc")
163 Vendor = UnknownVendor;
165 StringRef OSName = getOSName();
166 if (OSName.startswith("auroraux"))
168 else if (OSName.startswith("cygwin"))
170 else if (OSName.startswith("darwin"))
172 else if (OSName.startswith("dragonfly"))
174 else if (OSName.startswith("freebsd"))
176 else if (OSName.startswith("linux"))
178 else if (OSName.startswith("mingw32"))
180 else if (OSName.startswith("mingw64"))
182 else if (OSName.startswith("netbsd"))
184 else if (OSName.startswith("openbsd"))
186 else if (OSName.startswith("solaris"))
188 else if (OSName.startswith("win32"))
193 assert(isInitialized() && "Failed to initialize!");
196 StringRef Triple::getArchName() const {
197 return StringRef(Data).split('-').first; // Isolate first component
200 StringRef Triple::getVendorName() const {
201 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
202 return Tmp.split('-').first; // Isolate second component
205 StringRef Triple::getOSName() const {
206 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
207 Tmp = Tmp.split('-').second; // Strip second component
208 return Tmp.split('-').first; // Isolate third component
211 StringRef Triple::getEnvironmentName() const {
212 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
213 Tmp = Tmp.split('-').second; // Strip second component
214 return Tmp.split('-').second; // Strip third component
217 StringRef Triple::getOSAndEnvironmentName() const {
218 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
219 return Tmp.split('-').second; // Strip second component
222 static unsigned EatNumber(StringRef &Str) {
223 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
224 unsigned Result = Str[0]-'0';
229 // Handle "darwin11".
230 if (Result == 1 && !Str.empty() && Str[0] >= '0' && Str[0] <= '9') {
231 Result = Result*10 + (Str[0] - '0');
239 /// getDarwinNumber - Parse the 'darwin number' out of the specific target
240 /// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
241 /// not defined, return 0's. This requires that the triple have an OSType of
242 /// darwin before it is called.
243 void Triple::getDarwinNumber(unsigned &Maj, unsigned &Min,
244 unsigned &Revision) const {
245 assert(getOS() == Darwin && "Not a darwin target triple!");
246 StringRef OSName = getOSName();
247 assert(OSName.startswith("darwin") && "Unknown darwin target triple!");
249 // Strip off "darwin".
250 OSName = OSName.substr(6);
252 Maj = Min = Revision = 0;
254 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
257 // The major version is the first digit.
258 Maj = EatNumber(OSName);
259 if (OSName.empty()) return;
261 // Handle minor version: 10.4.9 -> darwin8.9.
262 if (OSName[0] != '.')
266 OSName = OSName.substr(1);
268 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
271 Min = EatNumber(OSName);
272 if (OSName.empty()) return;
274 // Handle revision darwin8.9.1
275 if (OSName[0] != '.')
279 OSName = OSName.substr(1);
281 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
284 Revision = EatNumber(OSName);
287 void Triple::setTriple(const Twine &Str) {
292 void Triple::setArch(ArchType Kind) {
293 setArchName(getArchTypeName(Kind));
296 void Triple::setVendor(VendorType Kind) {
297 setVendorName(getVendorTypeName(Kind));
300 void Triple::setOS(OSType Kind) {
301 setOSName(getOSTypeName(Kind));
304 void Triple::setArchName(const StringRef &Str) {
305 setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
308 void Triple::setVendorName(const StringRef &Str) {
309 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
312 void Triple::setOSName(const StringRef &Str) {
313 if (hasEnvironment())
314 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
315 "-" + getEnvironmentName());
317 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
320 void Triple::setEnvironmentName(const StringRef &Str) {
321 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
325 void Triple::setOSAndEnvironmentName(const StringRef &Str) {
326 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);