blob: 89d95ca15fb1f0d2b1ce902d1bffd78756c3806a [file] [log] [blame]
Daniel Dunbar23e97b02009-04-01 21:53:23 +00001//===--- Triple.cpp - Target triple helper class --------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ADT/Triple.h"
Daniel Dunbara14d2252009-07-26 03:31:47 +000011
12#include "llvm/ADT/Twine.h"
Daniel Dunbar23e97b02009-04-01 21:53:23 +000013#include <cassert>
Mikhail Glushenkov70748752009-04-02 01:11:37 +000014#include <cstring>
Daniel Dunbar23e97b02009-04-01 21:53:23 +000015using namespace llvm;
16
17//
18
19const char *Triple::getArchTypeName(ArchType Kind) {
20 switch (Kind) {
21 case InvalidArch: return "<invalid>";
22 case UnknownArch: return "unknown";
Daniel Dunbar6337f152009-07-26 04:23:03 +000023
24 case alpha: return "alpha";
25 case arm: return "arm";
26 case cellspu: return "cellspu";
27 case mips: return "mips";
28 case mipsel: return "mipsel";
29 case msp430: return "msp430";
30 case sparc: return "sparc";
31 case systemz: return "s390x";
32 case thumb: return "thumb";
33 case x86: return "i386";
34 case x86_64: return "x86_64";
35 case ppc: return "powerpc";
36 case ppc64: return "powerpc64";
Daniel Dunbar23e97b02009-04-01 21:53:23 +000037 }
38
39 return "<invalid>";
40}
41
42const char *Triple::getVendorTypeName(VendorType Kind) {
43 switch (Kind) {
44 case UnknownVendor: return "unknown";
45
46 case Apple: return "apple";
47 case PC: return "PC";
48 }
49
50 return "<invalid>";
51}
52
53const char *Triple::getOSTypeName(OSType Kind) {
54 switch (Kind) {
55 case UnknownOS: return "unknown";
56
Duncan Sands852cd112009-06-19 14:40:01 +000057 case AuroraUX: return "auroraux";
Daniel Dunbar6337f152009-07-26 04:23:03 +000058 case Cygwin: return "cygwin";
Daniel Dunbar23e97b02009-04-01 21:53:23 +000059 case Darwin: return "darwin";
Daniel Dunbar7eaf0572009-05-22 02:24:11 +000060 case DragonFly: return "dragonfly";
Daniel Dunbar23e97b02009-04-01 21:53:23 +000061 case FreeBSD: return "freebsd";
62 case Linux: return "linux";
Daniel Dunbar6337f152009-07-26 04:23:03 +000063 case MinGW32: return "mingw32";
Chris Lattnerb8ac8412009-07-13 20:22:23 +000064 case NetBSD: return "netbsd";
Duncan Sandscd1267d2009-06-29 13:36:13 +000065 case OpenBSD: return "openbsd";
Daniel Dunbar6337f152009-07-26 04:23:03 +000066 case Win32: return "win32";
Daniel Dunbar23e97b02009-04-01 21:53:23 +000067 }
68
69 return "<invalid>";
70}
71
72//
73
74void Triple::Parse() const {
75 assert(!isInitialized() && "Invalid parse call.");
76
Daniel Dunbara14d2252009-07-26 03:31:47 +000077 StringRef ArchName = getArchName();
Daniel Dunbar23e97b02009-04-01 21:53:23 +000078 if (ArchName.size() == 4 && ArchName[0] == 'i' &&
Daniel Dunbar6337f152009-07-26 04:23:03 +000079 ArchName[2] == '8' && ArchName[3] == '6' &&
80 ArchName[1] - '3' < 6) // i[3-9]86
Daniel Dunbar23e97b02009-04-01 21:53:23 +000081 Arch = x86;
82 else if (ArchName == "amd64" || ArchName == "x86_64")
83 Arch = x86_64;
84 else if (ArchName == "powerpc")
85 Arch = ppc;
86 else if (ArchName == "powerpc64")
87 Arch = ppc64;
Daniel Dunbar6337f152009-07-26 04:23:03 +000088 else if (ArchName == "arm" ||
89 ArchName.startswith("armv"))
90 Arch = arm;
91 else if (ArchName == "thumb" ||
92 ArchName.startswith("thumbv"))
93 Arch = thumb;
94 else if (ArchName.startswith("alpha"))
95 Arch = alpha;
96 else if (ArchName == "spu" || ArchName == "cellspu")
97 Arch = cellspu;
98 else if (ArchName == "msp430")
99 Arch = msp430;
100 else if (ArchName == "mips" || ArchName == "mipsallegrex")
101 Arch = mips;
102 else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
103 ArchName == "psp")
104 Arch = mipsel;
105 else if (ArchName == "sparc")
106 Arch = sparc;
107 else if (ArchName == "s390x")
108 Arch = systemz;
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000109 else
110 Arch = UnknownArch;
111
Daniel Dunbara14d2252009-07-26 03:31:47 +0000112 StringRef VendorName = getVendorName();
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000113 if (VendorName == "apple")
114 Vendor = Apple;
115 else if (VendorName == "pc")
116 Vendor = PC;
117 else
118 Vendor = UnknownVendor;
119
Daniel Dunbara14d2252009-07-26 03:31:47 +0000120 StringRef OSName = getOSName();
121 if (OSName.startswith("auroraux"))
Duncan Sands852cd112009-06-19 14:40:01 +0000122 OS = AuroraUX;
Daniel Dunbar6337f152009-07-26 04:23:03 +0000123 else if (OSName.startswith("cygwin"))
124 OS = Cygwin;
Daniel Dunbara14d2252009-07-26 03:31:47 +0000125 else if (OSName.startswith("darwin"))
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000126 OS = Darwin;
Daniel Dunbara14d2252009-07-26 03:31:47 +0000127 else if (OSName.startswith("dragonfly"))
Daniel Dunbar7eaf0572009-05-22 02:24:11 +0000128 OS = DragonFly;
Daniel Dunbara14d2252009-07-26 03:31:47 +0000129 else if (OSName.startswith("freebsd"))
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000130 OS = FreeBSD;
Daniel Dunbara14d2252009-07-26 03:31:47 +0000131 else if (OSName.startswith("linux"))
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000132 OS = Linux;
Daniel Dunbar6337f152009-07-26 04:23:03 +0000133 else if (OSName.startswith("mingw32"))
134 OS = MinGW32;
Daniel Dunbara14d2252009-07-26 03:31:47 +0000135 else if (OSName.startswith("netbsd"))
Chris Lattnerb8ac8412009-07-13 20:22:23 +0000136 OS = NetBSD;
Daniel Dunbara14d2252009-07-26 03:31:47 +0000137 else if (OSName.startswith("openbsd"))
Duncan Sandscd1267d2009-06-29 13:36:13 +0000138 OS = OpenBSD;
Daniel Dunbar6337f152009-07-26 04:23:03 +0000139 else if (OSName.startswith("win32"))
140 OS = Win32;
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000141 else
142 OS = UnknownOS;
143
144 assert(isInitialized() && "Failed to initialize!");
145}
146
Daniel Dunbara14d2252009-07-26 03:31:47 +0000147StringRef Triple::getArchName() const {
148 return StringRef(Data).split('-').first; // Isolate first component
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000149}
150
Daniel Dunbara14d2252009-07-26 03:31:47 +0000151StringRef Triple::getVendorName() const {
152 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
153 return Tmp.split('-').first; // Isolate second component
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000154}
155
Daniel Dunbara14d2252009-07-26 03:31:47 +0000156StringRef Triple::getOSName() const {
157 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
158 Tmp = Tmp.split('-').second; // Strip second component
159 return Tmp.split('-').first; // Isolate third component
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000160}
161
Daniel Dunbara14d2252009-07-26 03:31:47 +0000162StringRef Triple::getEnvironmentName() const {
163 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
164 Tmp = Tmp.split('-').second; // Strip second component
165 return Tmp.split('-').second; // Strip third component
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000166}
167
Daniel Dunbara14d2252009-07-26 03:31:47 +0000168StringRef Triple::getOSAndEnvironmentName() const {
169 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
170 return Tmp.split('-').second; // Strip second component
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000171}
172
Daniel Dunbara14d2252009-07-26 03:31:47 +0000173void Triple::setTriple(const Twine &Str) {
174 Data = Str.str();
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000175 Arch = InvalidArch;
176}
177
178void Triple::setArch(ArchType Kind) {
179 setArchName(getArchTypeName(Kind));
180}
181
182void Triple::setVendor(VendorType Kind) {
183 setVendorName(getVendorTypeName(Kind));
184}
185
186void Triple::setOS(OSType Kind) {
187 setOSName(getOSTypeName(Kind));
188}
189
Daniel Dunbara14d2252009-07-26 03:31:47 +0000190void Triple::setArchName(const StringRef &Str) {
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000191 setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName());
192}
193
Daniel Dunbara14d2252009-07-26 03:31:47 +0000194void Triple::setVendorName(const StringRef &Str) {
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000195 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
196}
197
Daniel Dunbara14d2252009-07-26 03:31:47 +0000198void Triple::setOSName(const StringRef &Str) {
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000199 if (hasEnvironment())
200 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
201 "-" + getEnvironmentName());
202 else
203 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
204}
205
Daniel Dunbara14d2252009-07-26 03:31:47 +0000206void Triple::setEnvironmentName(const StringRef &Str) {
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000207 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
208 "-" + Str);
209}
210
Daniel Dunbara14d2252009-07-26 03:31:47 +0000211void Triple::setOSAndEnvironmentName(const StringRef &Str) {
Daniel Dunbar23e97b02009-04-01 21:53:23 +0000212 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
213}