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 tce
: return "tce";
37 case thumb
: return "thumb";
38 case x86
: return "i386";
39 case x86_64
: return "x86_64";
40 case xcore
: return "xcore";
46 const char *Triple::getArchTypePrefix(ArchType Kind
) {
51 case alpha
: return "alpha";
54 case thumb
: return "arm";
56 case bfin
: return "bfin";
58 case cellspu
: return "spu";
61 case ppc
: return "ppc";
63 case sparc
: return "sparc";
66 case x86_64
: return "x86";
67 case xcore
: return "xcore";
71 const char *Triple::getVendorTypeName(VendorType Kind
) {
73 case UnknownVendor
: return "unknown";
75 case Apple
: return "apple";
82 const char *Triple::getOSTypeName(OSType Kind
) {
84 case UnknownOS
: return "unknown";
86 case AuroraUX
: return "auroraux";
87 case Cygwin
: return "cygwin";
88 case Darwin
: return "darwin";
89 case DragonFly
: return "dragonfly";
90 case FreeBSD
: return "freebsd";
91 case Linux
: return "linux";
92 case MinGW32
: return "mingw32";
93 case MinGW64
: return "mingw64";
94 case NetBSD
: return "netbsd";
95 case OpenBSD
: return "openbsd";
96 case Solaris
: return "solaris";
97 case Win32
: return "win32";
103 Triple::ArchType
Triple::getArchTypeForLLVMName(const StringRef
&Name
) {
110 if (Name
== "cellspu")
114 if (Name
== "mipsel")
116 if (Name
== "msp430")
126 if (Name
== "systemz")
134 if (Name
== "x86-64")
144 void Triple::Parse() const {
145 assert(!isInitialized() && "Invalid parse call.");
147 StringRef ArchName
= getArchName();
148 StringRef VendorName
= getVendorName();
149 StringRef OSName
= getOSName();
151 if (ArchName
.size() == 4 && ArchName
[0] == 'i' &&
152 ArchName
[2] == '8' && ArchName
[3] == '6' &&
153 ArchName
[1] - '3' < 6) // i[3-9]86
155 else if (ArchName
== "amd64" || ArchName
== "x86_64")
157 else if (ArchName
== "bfin")
159 else if (ArchName
== "pic16")
161 else if (ArchName
== "powerpc")
163 else if (ArchName
== "powerpc64")
165 else if (ArchName
== "arm" ||
166 ArchName
.startswith("armv") ||
167 ArchName
== "xscale")
169 else if (ArchName
== "thumb" ||
170 ArchName
.startswith("thumbv"))
172 else if (ArchName
.startswith("alpha"))
174 else if (ArchName
== "spu" || ArchName
== "cellspu")
176 else if (ArchName
== "msp430")
178 else if (ArchName
== "mips" || ArchName
== "mipsallegrex")
180 else if (ArchName
== "mipsel" || ArchName
== "mipsallegrexel" ||
183 else if (ArchName
== "sparc")
185 else if (ArchName
== "s390x")
187 else if (ArchName
== "tce")
193 // Handle some exceptional cases where the OS / environment components are
194 // stuck into the vendor field.
195 if (StringRef(getTriple()).count('-') == 1) {
196 StringRef VendorName
= getVendorName();
198 if (VendorName
.startswith("mingw32")) { // 'i386-mingw32', etc.
204 // arm-elf is another example, but we don't currently parse anything about
208 if (VendorName
== "apple")
210 else if (VendorName
== "pc")
213 Vendor
= UnknownVendor
;
215 if (OSName
.startswith("auroraux"))
217 else if (OSName
.startswith("cygwin"))
219 else if (OSName
.startswith("darwin"))
221 else if (OSName
.startswith("dragonfly"))
223 else if (OSName
.startswith("freebsd"))
225 else if (OSName
.startswith("linux"))
227 else if (OSName
.startswith("mingw32"))
229 else if (OSName
.startswith("mingw64"))
231 else if (OSName
.startswith("netbsd"))
233 else if (OSName
.startswith("openbsd"))
235 else if (OSName
.startswith("solaris"))
237 else if (OSName
.startswith("win32"))
242 assert(isInitialized() && "Failed to initialize!");
245 StringRef
Triple::getArchName() const {
246 return StringRef(Data
).split('-').first
; // Isolate first component
249 StringRef
Triple::getVendorName() const {
250 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
251 return Tmp
.split('-').first
; // Isolate second component
254 StringRef
Triple::getOSName() const {
255 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
256 Tmp
= Tmp
.split('-').second
; // Strip second component
257 return Tmp
.split('-').first
; // Isolate third component
260 StringRef
Triple::getEnvironmentName() const {
261 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
262 Tmp
= Tmp
.split('-').second
; // Strip second component
263 return Tmp
.split('-').second
; // Strip third component
266 StringRef
Triple::getOSAndEnvironmentName() const {
267 StringRef Tmp
= StringRef(Data
).split('-').second
; // Strip first component
268 return Tmp
.split('-').second
; // Strip second component
271 static unsigned EatNumber(StringRef
&Str
) {
272 assert(!Str
.empty() && Str
[0] >= '0' && Str
[0] <= '9' && "Not a number");
273 unsigned Result
= Str
[0]-'0';
278 // Handle "darwin11".
279 if (Result
== 1 && !Str
.empty() && Str
[0] >= '0' && Str
[0] <= '9') {
280 Result
= Result
*10 + (Str
[0] - '0');
288 /// getDarwinNumber - Parse the 'darwin number' out of the specific target
289 /// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
290 /// not defined, return 0's. This requires that the triple have an OSType of
291 /// darwin before it is called.
292 void Triple::getDarwinNumber(unsigned &Maj
, unsigned &Min
,
293 unsigned &Revision
) const {
294 assert(getOS() == Darwin
&& "Not a darwin target triple!");
295 StringRef OSName
= getOSName();
296 assert(OSName
.startswith("darwin") && "Unknown darwin target triple!");
298 // Strip off "darwin".
299 OSName
= OSName
.substr(6);
301 Maj
= Min
= Revision
= 0;
303 if (OSName
.empty() || OSName
[0] < '0' || OSName
[0] > '9')
306 // The major version is the first digit.
307 Maj
= EatNumber(OSName
);
308 if (OSName
.empty()) return;
310 // Handle minor version: 10.4.9 -> darwin8.9.
311 if (OSName
[0] != '.')
315 OSName
= OSName
.substr(1);
317 if (OSName
.empty() || OSName
[0] < '0' || OSName
[0] > '9')
320 Min
= EatNumber(OSName
);
321 if (OSName
.empty()) return;
323 // Handle revision darwin8.9.1
324 if (OSName
[0] != '.')
328 OSName
= OSName
.substr(1);
330 if (OSName
.empty() || OSName
[0] < '0' || OSName
[0] > '9')
333 Revision
= EatNumber(OSName
);
336 void Triple::setTriple(const Twine
&Str
) {
341 void Triple::setArch(ArchType Kind
) {
342 setArchName(getArchTypeName(Kind
));
345 void Triple::setVendor(VendorType Kind
) {
346 setVendorName(getVendorTypeName(Kind
));
349 void Triple::setOS(OSType Kind
) {
350 setOSName(getOSTypeName(Kind
));
353 void Triple::setArchName(const StringRef
&Str
) {
354 setTriple(Str
+ "-" + getVendorName() + "-" + getOSAndEnvironmentName());
357 void Triple::setVendorName(const StringRef
&Str
) {
358 setTriple(getArchName() + "-" + Str
+ "-" + getOSAndEnvironmentName());
361 void Triple::setOSName(const StringRef
&Str
) {
362 if (hasEnvironment())
363 setTriple(getArchName() + "-" + getVendorName() + "-" + Str
+
364 "-" + getEnvironmentName());
366 setTriple(getArchName() + "-" + getVendorName() + "-" + Str
);
369 void Triple::setEnvironmentName(const StringRef
&Str
) {
370 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
374 void Triple::setOSAndEnvironmentName(const StringRef
&Str
) {
375 setTriple(getArchName() + "-" + getVendorName() + "-" + Str
);