blob: d990dd0d59a36cede2a3b7e520267723604d3924 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek38591a22007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Chris Lattner4b009652007-07-25 00:24:17 +000020using namespace clang;
21
Chris Lattner4b009652007-07-25 00:24:17 +000022//===----------------------------------------------------------------------===//
23// Common code shared among targets.
24//===----------------------------------------------------------------------===//
25
Chris Lattner0db667a2007-10-06 06:57:34 +000026static void Define(std::vector<char> &Buf, const char *Macro,
27 const char *Val = "1") {
28 const char *Def = "#define ";
29 Buf.insert(Buf.end(), Def, Def+strlen(Def));
30 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
31 Buf.push_back(' ');
32 Buf.insert(Buf.end(), Val, Val+strlen(Val));
33 Buf.push_back('\n');
34}
35
Eli Friedmanff158dd2008-08-20 07:28:14 +000036static void getSolarisDefines(std::vector<char> &Defs) {
37 Define(Defs, "__SUN__");
38 Define(Defs, "__SOLARIS__");
39}
Chris Lattner4b009652007-07-25 00:24:17 +000040
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000041static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +000042 Define(Defs, "__APPLE__");
43 Define(Defs, "__MACH__");
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000044
45 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
46 const char *Darwin = strstr(Triple, "-darwin");
47 if (Darwin) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +000048 char DarwinStr[] = "1000";
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000049 Darwin += strlen("-darwin");
Chris Lattnerd376f6d2008-09-30 20:30:12 +000050 if (Darwin[0] >= '0' && Darwin[0] <= '9') {
51 unsigned DarwinNo = Darwin[0]-'0';
52 ++Darwin;
53
54 // Handle "darwin11".
55 if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
56 DarwinNo = 10+Darwin[0]-'0';
57 ++Darwin;
58 }
59
60 if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000061 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
62 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000063 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +000064
65 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
66 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
67 Darwin[2] == '\0')
68 DarwinStr[3] = Darwin[1];
69
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000070 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +000071 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000072 }
Eli Friedman872996c2008-08-20 02:34:37 +000073}
Chris Lattner4b009652007-07-25 00:24:17 +000074
Chris Lattnerd4faca42008-08-23 18:23:14 +000075static void getDragonFlyDefines(std::vector<char> &Defs) {
76 // DragonFly defines; list based off of gcc output
77 Define(Defs, "__DragonFly__");
78 Define(Defs, "__DragonFly_cc_version", "100001");
79 Define(Defs, "__ELF__");
80 Define(Defs, "__KPRINTF_ATTRIBUTE__");
81 Define(Defs, "__tune_i386__");
82 Define(Defs, "unix");
83 Define(Defs, "__unix");
84 Define(Defs, "__unix__");
85}
86
Eli Friedman5fb0a022008-08-21 00:24:02 +000087static void getLinuxDefines(std::vector<char> &Defs) {
88 // Linux defines; list based off of gcc output
89 Define(Defs, "__unix__");
90 Define(Defs, "__unix");
91 Define(Defs, "unix");
92 Define(Defs, "__linux__");
93 Define(Defs, "__linux");
94 Define(Defs, "linux");
95 Define(Defs, "__gnu_linux__");
96}
97
Chris Lattner4b009652007-07-25 00:24:17 +000098/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
99/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000100static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000101 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000102 Define(Defs, "__ppc__");
103 Define(Defs, "_ARCH_PPC");
104 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000105 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000106 Define(Defs, "_ARCH_PPC64");
107 Define(Defs, "_LP64");
108 Define(Defs, "__LP64__");
109 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000110 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000111 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000112 }
113
114 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000115 Define(Defs, "_BIG_ENDIAN");
116 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000117
Chris Lattner4b009652007-07-25 00:24:17 +0000118 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000119 Define(Defs, "__NATURAL_ALIGNMENT__");
120 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000121
Chris Lattner0db667a2007-10-06 06:57:34 +0000122 Define(Defs, "__FLT_EVAL_METHOD__", "0");
Chris Lattner0db667a2007-10-06 06:57:34 +0000123 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000124 Define(Defs, "__DECIMAL_DIG__", "33");
125
Chris Lattner0db667a2007-10-06 06:57:34 +0000126 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
Chris Lattnerb9ff1512008-10-05 21:42:17 +0000127
Chris Lattner0db667a2007-10-06 06:57:34 +0000128 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000129}
130
131/// getX86Defines - Return a set of the X86-specific #defines that are
132/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000133static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000134 // Target identification.
135 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000136 Define(Defs, "_LP64");
137 Define(Defs, "__LP64__");
138 Define(Defs, "__amd64__");
139 Define(Defs, "__amd64");
140 Define(Defs, "__x86_64");
141 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000142 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000143 Define(Defs, "__i386__");
144 Define(Defs, "__i386");
145 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000146 }
147
148 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000149 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000150
Chris Lattner4b009652007-07-25 00:24:17 +0000151 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000152 Define(Defs, "__nocona");
153 Define(Defs, "__nocona__");
154 Define(Defs, "__tune_nocona__");
155 Define(Defs, "__SSE2_MATH__");
156 Define(Defs, "__SSE2__");
157 Define(Defs, "__SSE_MATH__");
158 Define(Defs, "__SSE__");
159 Define(Defs, "__MMX__");
160 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000161
Chris Lattner0db667a2007-10-06 06:57:34 +0000162 Define(Defs, "__FLT_EVAL_METHOD__", "0");
Chris Lattner0db667a2007-10-06 06:57:34 +0000163 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner0db667a2007-10-06 06:57:34 +0000164 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000165}
166
Chris Lattnerb6444052008-04-21 20:19:54 +0000167/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000168/// not tied to a specific subtarget.
169static void getARMDefines(std::vector<char> &Defs) {
170 // Target identification.
171 Define(Defs, "__arm");
172 Define(Defs, "__arm__");
173
174 // Target properties.
175 Define(Defs, "__LITTLE_ENDIAN__");
176
Chris Lattner9fd73612008-04-21 18:56:49 +0000177 // Subtarget options. [hard coded to v6 for now]
178 Define(Defs, "__ARM_ARCH_6K__");
179 Define(Defs, "__ARMEL__");
180 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
181
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000182 Define(Defs, "__FLT_EVAL_METHOD__", "0");
Chris Lattner9fd73612008-04-21 18:56:49 +0000183 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000184 Define(Defs, "__DECIMAL_DIG__", "17");
Chris Lattner9fd73612008-04-21 18:56:49 +0000185}
186
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000187//===----------------------------------------------------------------------===//
188// Specific target implementations.
189//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000190
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000191namespace {
192// PPC abstract base class
193class PPCTargetInfo : public TargetInfo {
194 static const Builtin::Info BuiltinInfo[];
195 static const char * const GCCRegNames[];
196 static const TargetInfo::GCCRegAlias GCCRegAliases[];
197
198public:
199 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
200 CharIsSigned = false;
201 }
202 virtual void getTargetBuiltins(const Builtin::Info *&Records,
203 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000204 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000205 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000206 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000207 virtual const char *getVAListDeclaration() const {
208 return "typedef struct __va_list_tag {"
209 " unsigned char gpr;"
210 " unsigned char fpr;"
211 " unsigned short reserved;"
212 " void* overflow_arg_area;"
213 " void* reg_save_area;"
214 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000215 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000216 virtual const char *getTargetPrefix() const {
217 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000218 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000219 virtual void getGCCRegNames(const char * const *&Names,
220 unsigned &NumNames) const;
221 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
222 unsigned &NumAliases) const;
223 virtual bool validateAsmConstraint(char c,
224 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000225 switch (c) {
226 default: return false;
227 case 'O': // Zero
228 return true;
229 case 'b': // Base register
230 case 'f': // Floating point register
231 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
232 return true;
233 }
234 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000235 virtual const char *getClobbers() const {
236 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000237 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000238};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000239
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000240const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
241#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
242#include "clang/AST/PPCBuiltins.def"
243};
Chris Lattner9fd73612008-04-21 18:56:49 +0000244
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000245const char * const PPCTargetInfo::GCCRegNames[] = {
246 "0", "1", "2", "3", "4", "5", "6", "7",
247 "8", "9", "10", "11", "12", "13", "14", "15",
248 "16", "17", "18", "19", "20", "21", "22", "23",
249 "24", "25", "26", "27", "28", "29", "30", "31",
250 "0", "1", "2", "3", "4", "5", "6", "7",
251 "8", "9", "10", "11", "12", "13", "14", "15",
252 "16", "17", "18", "19", "20", "21", "22", "23",
253 "24", "25", "26", "27", "28", "29", "30", "31",
254 "mq", "lr", "ctr", "ap",
255 "0", "1", "2", "3", "4", "5", "6", "7",
256 "xer",
257 "0", "1", "2", "3", "4", "5", "6", "7",
258 "8", "9", "10", "11", "12", "13", "14", "15",
259 "16", "17", "18", "19", "20", "21", "22", "23",
260 "24", "25", "26", "27", "28", "29", "30", "31",
261 "vrsave", "vscr",
262 "spe_acc", "spefscr",
263 "sfp"
264};
Chris Lattner4b009652007-07-25 00:24:17 +0000265
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000266void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
267 unsigned &NumNames) const {
268 Names = GCCRegNames;
269 NumNames = llvm::array_lengthof(GCCRegNames);
270}
Chris Lattner4b009652007-07-25 00:24:17 +0000271
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000272const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
273 // While some of these aliases do map to different registers
274 // they still share the same register name.
275 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
276 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
277 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
278 { { "cr3", "fr3", "r3", "v3"}, "3" },
279 { { "cr4", "fr4", "r4", "v4"}, "4" },
280 { { "cr5", "fr5", "r5", "v5"}, "5" },
281 { { "cr6", "fr6", "r6", "v6"}, "6" },
282 { { "cr7", "fr7", "r7", "v7"}, "7" },
283 { { "fr8", "r8", "v8"}, "8" },
284 { { "fr9", "r9", "v9"}, "9" },
285 { { "fr10", "r10", "v10"}, "10" },
286 { { "fr11", "r11", "v11"}, "11" },
287 { { "fr12", "r12", "v12"}, "12" },
288 { { "fr13", "r13", "v13"}, "13" },
289 { { "fr14", "r14", "v14"}, "14" },
290 { { "fr15", "r15", "v15"}, "15" },
291 { { "fr16", "r16", "v16"}, "16" },
292 { { "fr17", "r17", "v17"}, "17" },
293 { { "fr18", "r18", "v18"}, "18" },
294 { { "fr19", "r19", "v19"}, "19" },
295 { { "fr20", "r20", "v20"}, "20" },
296 { { "fr21", "r21", "v21"}, "21" },
297 { { "fr22", "r22", "v22"}, "22" },
298 { { "fr23", "r23", "v23"}, "23" },
299 { { "fr24", "r24", "v24"}, "24" },
300 { { "fr25", "r25", "v25"}, "25" },
301 { { "fr26", "r26", "v26"}, "26" },
302 { { "fr27", "r27", "v27"}, "27" },
303 { { "fr28", "r28", "v28"}, "28" },
304 { { "fr29", "r29", "v29"}, "29" },
305 { { "fr30", "r30", "v30"}, "30" },
306 { { "fr31", "r31", "v31"}, "31" },
307};
308
309void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
310 unsigned &NumAliases) const {
311 Aliases = GCCRegAliases;
312 NumAliases = llvm::array_lengthof(GCCRegAliases);
313}
314} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000315
316namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000317class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000318public:
Eli Friedman2b161652008-08-21 00:13:15 +0000319 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
320 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
321 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
322 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000323 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000324 getPowerPCDefines(Defines, false);
325 }
Chris Lattner4b009652007-07-25 00:24:17 +0000326};
327} // end anonymous namespace.
328
329namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000330class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000331public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000332 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000333 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000334 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
335 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000336 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000337 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000338 getPowerPCDefines(Defines, true);
339 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000340};
341} // end anonymous namespace.
342
343namespace {
344class DarwinPPCTargetInfo : public PPC32TargetInfo {
345public:
346 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
347 virtual void getTargetDefines(std::vector<char> &Defines) const {
348 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000349 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000350 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000351
352 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000353};
354} // end anonymous namespace.
355
356namespace {
357class DarwinPPC64TargetInfo : public PPC64TargetInfo {
358public:
359 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
360 virtual void getTargetDefines(std::vector<char> &Defines) const {
361 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000362 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000363 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000364
365 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000366};
367} // end anonymous namespace.
368
369namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000370// Namespace for x86 abstract base class
371const Builtin::Info BuiltinInfo[] = {
372#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
373#include "clang/AST/X86Builtins.def"
374};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000375
Eli Friedman872996c2008-08-20 02:34:37 +0000376const char *GCCRegNames[] = {
377 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
378 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
379 "argp", "flags", "fspr", "dirflag", "frame",
380 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
381 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
382 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
383 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
384};
385
386const TargetInfo::GCCRegAlias GCCRegAliases[] = {
387 { { "al", "ah", "eax", "rax" }, "ax" },
388 { { "bl", "bh", "ebx", "rbx" }, "bx" },
389 { { "cl", "ch", "ecx", "rcx" }, "cx" },
390 { { "dl", "dh", "edx", "rdx" }, "dx" },
391 { { "esi", "rsi" }, "si" },
392 { { "edi", "rdi" }, "di" },
393 { { "esp", "rsp" }, "sp" },
394 { { "ebp", "rbp" }, "bp" },
395};
396
397// X86 target abstract base class; x86-32 and x86-64 are very close, so
398// most of the implementation can be shared.
399class X86TargetInfo : public TargetInfo {
400public:
401 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
402 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000403 }
404 virtual void getTargetBuiltins(const Builtin::Info *&Records,
405 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000406 Records = BuiltinInfo;
407 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000408 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000409 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000410 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000411 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000412 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000413 unsigned &NumNames) const {
414 Names = GCCRegNames;
415 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000416 }
417 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
418 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000419 Aliases = GCCRegAliases;
420 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000421 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000422 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000423 TargetInfo::ConstraintInfo &info) const;
424 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000425 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000426 return "~{dirflag},~{fpsr},~{flags}";
427 }
Chris Lattner4b009652007-07-25 00:24:17 +0000428};
Eli Friedman872996c2008-08-20 02:34:37 +0000429
430bool
431X86TargetInfo::validateAsmConstraint(char c,
432 TargetInfo::ConstraintInfo &info) const {
433 switch (c) {
434 default: return false;
435 case 'a': // eax.
436 case 'b': // ebx.
437 case 'c': // ecx.
438 case 'd': // edx.
439 case 'S': // esi.
440 case 'D': // edi.
441 case 'A': // edx:eax.
442 case 't': // top of floating point stack.
443 case 'u': // second from top of floating point stack.
444 case 'q': // Any register accessible as [r]l: a, b, c, and d.
445 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
446 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
447 // instructions.
448 case 'N': // unsigned 8-bit integer constant for use with in and out
449 // instructions.
450 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
451 return true;
452 }
453}
454
455std::string
456X86TargetInfo::convertConstraint(const char Constraint) const {
457 switch (Constraint) {
458 case 'a': return std::string("{ax}");
459 case 'b': return std::string("{bx}");
460 case 'c': return std::string("{cx}");
461 case 'd': return std::string("{dx}");
462 case 'S': return std::string("{si}");
463 case 'D': return std::string("{di}");
464 case 't': // top of floating point stack.
465 return std::string("{st}");
466 case 'u': // second from top of floating point stack.
467 return std::string("{st(1)}"); // second from top of floating point stack.
468 default:
469 return std::string(1, Constraint);
470 }
471}
Eli Friedman872996c2008-08-20 02:34:37 +0000472} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000473
474namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000475// X86-32 generic target
476class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000477public:
Eli Friedman872996c2008-08-20 02:34:37 +0000478 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
479 DoubleAlign = LongLongAlign = 32;
480 LongDoubleWidth = 96;
481 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000482 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
483 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
484 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000485 }
486 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000487 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000488 }
489 virtual void getTargetDefines(std::vector<char> &Defines) const {
490 getX86Defines(Defines, false);
491 }
492};
493} // end anonymous namespace
494
495namespace {
496// x86-32 Darwin (OS X) target
497class DarwinI386TargetInfo : public X86_32TargetInfo {
498public:
499 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
500 LongDoubleWidth = 128;
501 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000502 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
503 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
504 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000505 }
506 virtual void getTargetDefines(std::vector<char> &Defines) const {
507 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000508 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000509 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000510 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +0000511};
512} // end anonymous namespace
513
514namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000515// x86-32 DragonFly target
516class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
517public:
518 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
519 }
520 virtual void getTargetDefines(std::vector<char> &Defines) const {
521 X86_32TargetInfo::getTargetDefines(Defines);
522 getDragonFlyDefines(Defines);
523 }
524};
525} // end anonymous namespace
526
527namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000528// x86-32 Linux target
529class LinuxX86_32TargetInfo : public X86_32TargetInfo {
530public:
531 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000532 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000533 }
534 virtual void getTargetDefines(std::vector<char> &Defines) const {
535 X86_32TargetInfo::getTargetDefines(Defines);
536 getLinuxDefines(Defines);
537 }
538};
539} // end anonymous namespace
540
541namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000542// x86-32 Windows target
543class WindowsX86_32TargetInfo : public X86_32TargetInfo {
544public:
545 WindowsX86_32TargetInfo(const std::string& triple)
546 : X86_32TargetInfo(triple) {
547 // FIXME: Fix wchar_t.
548 // FIXME: We should probably enable -fms-extensions by default for
549 // this target.
550 }
551 virtual void getTargetDefines(std::vector<char> &Defines) const {
552 X86_32TargetInfo::getTargetDefines(Defines);
553 // This list is based off of the the list of things MingW defines
554 Define(Defines, "__WIN32__");
555 Define(Defines, "__WIN32");
556 Define(Defines, "_WIN32");
557 Define(Defines, "WIN32");
558 Define(Defines, "__WINNT__");
559 Define(Defines, "__WINNT");
560 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000561 Define(Defines, "_X86_");
562 Define(Defines, "__MSVCRT__");
563 }
564};
565} // end anonymous namespace
566
567namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000568// x86-64 generic target
569class X86_64TargetInfo : public X86TargetInfo {
570public:
571 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000572 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000573 LongDoubleWidth = 128;
574 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000575 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
576 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
577 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000578 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000579 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000580 return "typedef struct __va_list_tag {"
581 " unsigned gp_offset;"
582 " unsigned fp_offset;"
583 " void* overflow_arg_area;"
584 " void* reg_save_area;"
585 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000586 }
Eli Friedman872996c2008-08-20 02:34:37 +0000587 virtual void getTargetDefines(std::vector<char> &Defines) const {
588 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000589 }
Eli Friedman872996c2008-08-20 02:34:37 +0000590};
591} // end anonymous namespace
592
593namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000594// x86-64 Linux target
595class LinuxX86_64TargetInfo : public X86_64TargetInfo {
596public:
597 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000598 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000599 }
600 virtual void getTargetDefines(std::vector<char> &Defines) const {
601 X86_64TargetInfo::getTargetDefines(Defines);
602 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000603 }
604};
605} // end anonymous namespace
606
607namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000608// x86-64 Darwin (OS X) target
609class DarwinX86_64TargetInfo : public X86_64TargetInfo {
610public:
611 DarwinX86_64TargetInfo(const std::string& triple) :
612 X86_64TargetInfo(triple) {}
613
614 virtual void getTargetDefines(std::vector<char> &Defines) const {
615 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000616 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000617 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000618
619 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000620};
621} // end anonymous namespace.
622
Chris Lattner9fd73612008-04-21 18:56:49 +0000623namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000624class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000625public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000626 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
627 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000628 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
629 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000630 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000631 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000632 getARMDefines(Defines);
633 }
634 virtual void getTargetBuiltins(const Builtin::Info *&Records,
635 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000636 // FIXME: Implement.
637 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000638 NumRecords = 0;
639 }
640 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000641 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000642 }
643 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000644 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000645 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000646 virtual void getGCCRegNames(const char * const *&Names,
647 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000648 // FIXME: Implement.
649 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000650 NumNames = 0;
651 }
652 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
653 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000654 // FIXME: Implement.
655 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000656 NumAliases = 0;
657 }
658 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000659 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000660 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000661 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000662 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000663 case 'l': // r0-r7
664 case 'h': // r8-r15
665 case 'w': // VFP Floating point register single precision
666 case 'P': // VFP Floating point register double precision
667 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
668 return true;
669 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000670 return false;
671 }
672 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000673 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000674 return "";
675 }
676};
677} // end anonymous namespace.
678
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000679
680namespace {
681class DarwinARMTargetInfo : public ARMTargetInfo {
682public:
683 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
684
685 virtual void getTargetDefines(std::vector<char> &Defines) const {
686 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000687 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000688 }
689};
690} // end anonymous namespace.
691
Chris Lattner4b009652007-07-25 00:24:17 +0000692namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000693class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000694public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000695 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
696 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000697 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
698 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000699 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000700 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000701 // FIXME: This is missing a lot of important defines; some of the
702 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000703 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000704 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000705 Define(Defines, "__sparcv8");
706 }
707 virtual void getTargetBuiltins(const Builtin::Info *&Records,
708 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000709 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000710 }
711 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000712 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000713 }
714 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000715 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000716 }
717 virtual void getGCCRegNames(const char * const *&Names,
718 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000719 // FIXME: Implement!
720 Names = 0;
721 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000722 }
723 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
724 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000725 // FIXME: Implement!
726 Aliases = 0;
727 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000728 }
729 virtual bool validateAsmConstraint(char c,
730 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000731 // FIXME: Implement!
732 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000733 }
734 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000735 // FIXME: Implement!
736 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000737 }
738};
739
740} // end anonymous namespace.
741
Eli Friedmanff158dd2008-08-20 07:28:14 +0000742namespace {
743class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
744public:
745 SolarisSparcV8TargetInfo(const std::string& triple) :
746 SparcV8TargetInfo(triple) {}
747
748 virtual void getTargetDefines(std::vector<char> &Defines) const {
749 SparcV8TargetInfo::getTargetDefines(Defines);
750 getSolarisDefines(Defines);
751 }
752};
753} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000754
Chris Lattner85970f32008-05-08 05:58:21 +0000755namespace {
756 class PIC16TargetInfo : public TargetInfo{
757 public:
758 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000759 // FIXME: Is IntAlign really supposed to be 16? There seems
760 // little point on a platform with 8-bit loads.
761 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner1be8bb92008-10-05 20:06:37 +0000762 LongWidth = 16;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000763 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000764 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000765 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000766 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
767 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000768 virtual void getTargetDefines(std::vector<char> &Defines) const {
769 Define(Defines, "__pic16");
770 }
771 virtual void getTargetBuiltins(const Builtin::Info *&Records,
772 unsigned &NumRecords) const {}
773 virtual const char *getVAListDeclaration() const { return "";}
774 virtual const char *getClobbers() const {return "";}
775 virtual const char *getTargetPrefix() const {return "";}
776 virtual void getGCCRegNames(const char * const *&Names,
777 unsigned &NumNames) const {}
778 virtual bool validateAsmConstraint(char c,
779 TargetInfo::ConstraintInfo &info) const {
780 return true;
781 }
782 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
783 unsigned &NumAliases) const {}
784 virtual bool useGlobalsForAutomaticVariables() const {return true;}
785 };
786}
787
Chris Lattner4b009652007-07-25 00:24:17 +0000788//===----------------------------------------------------------------------===//
789// Driver code
790//===----------------------------------------------------------------------===//
791
Ted Kremenekb97d7672007-12-04 17:07:35 +0000792static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000793 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
794 TT[4] == '-' && TT[1] - '3' < 6);
795}
796
Chris Lattnerfc457002008-03-05 01:18:20 +0000797/// CreateTargetInfo - Return the target info object for the specified target
798/// triple.
799TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000800 // OS detection; this isn't really anywhere near complete.
801 // Additions and corrections are welcome.
802 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000803 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000804 bool isSolaris = T.find("-solaris") != std::string::npos;
805 bool isLinux = T.find("-linux") != std::string::npos;
806 bool isWindows = T.find("-windows") != std::string::npos ||
807 T.find("-win32") != std::string::npos ||
808 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000809
Eli Friedman2b161652008-08-21 00:13:15 +0000810 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
811 if (isDarwin)
812 return new DarwinPPCTargetInfo(T);
813 return new PPC32TargetInfo(T);
814 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000815
Eli Friedman2b161652008-08-21 00:13:15 +0000816 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
817 if (isDarwin)
818 return new DarwinPPC64TargetInfo(T);
819 return new PPC64TargetInfo(T);
820 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000821
Eli Friedman2b161652008-08-21 00:13:15 +0000822 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
823 if (isDarwin)
824 return new DarwinARMTargetInfo(T);
825 return new ARMTargetInfo(T);
826 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000827
Eli Friedman2b161652008-08-21 00:13:15 +0000828 if (T.find("sparc-") == 0) {
829 if (isSolaris)
830 return new SolarisSparcV8TargetInfo(T);
831 return new SparcV8TargetInfo(T);
832 }
833
834 if (T.find("x86_64-") == 0) {
835 if (isDarwin)
836 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000837 if (isLinux)
838 return new LinuxX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000839 return new X86_64TargetInfo(T);
840 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000841
Chris Lattner85970f32008-05-08 05:58:21 +0000842 if (T.find("pic16-") == 0)
843 return new PIC16TargetInfo(T);
844
Eli Friedman2b161652008-08-21 00:13:15 +0000845 if (IsX86(T)) {
846 if (isDarwin)
847 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000848 if (isLinux)
849 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000850 if (isDragonFly)
851 return new DragonFlyX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +0000852 if (isWindows)
853 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000854 return new X86_32TargetInfo(T);
855 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000856
Chris Lattnerfc457002008-03-05 01:18:20 +0000857 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000858}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000859