blob: 531d0520ccf16479dea3ba45d897f79744df5b4b [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenekbbced582007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/AST/Builtins.h"
Anders Carlsson564f1de2007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson3346ae62007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedman25531262008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000020using namespace clang;
21
Reid Spencer5f016e22007-07-11 17:01:13 +000022//===----------------------------------------------------------------------===//
23// Common code shared among targets.
24//===----------------------------------------------------------------------===//
25
Chris Lattnerd15fa822007-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
Chris Lattnerd29b6302008-10-05 21:50:58 +000036//===----------------------------------------------------------------------===//
37// Defines specific to certain operating systems.
38//===----------------------------------------------------------------------===//
39
Eli Friedman01b86682008-08-20 07:28:14 +000040static void getSolarisDefines(std::vector<char> &Defs) {
41 Define(Defs, "__SUN__");
42 Define(Defs, "__SOLARIS__");
43}
Reid Spencer5f016e22007-07-11 17:01:13 +000044
Chris Lattnerd29b6302008-10-05 21:50:58 +000045static void getDragonFlyDefines(std::vector<char> &Defs) {
46 // DragonFly defines; list based off of gcc output
47 Define(Defs, "__DragonFly__");
48 Define(Defs, "__DragonFly_cc_version", "100001");
49 Define(Defs, "__ELF__");
50 Define(Defs, "__KPRINTF_ATTRIBUTE__");
51 Define(Defs, "__tune_i386__");
52 Define(Defs, "unix");
53 Define(Defs, "__unix");
54 Define(Defs, "__unix__");
55}
56
57static void getLinuxDefines(std::vector<char> &Defs) {
58 // Linux defines; list based off of gcc output
59 Define(Defs, "__unix__");
60 Define(Defs, "__unix");
61 Define(Defs, "unix");
62 Define(Defs, "__linux__");
63 Define(Defs, "__linux");
64 Define(Defs, "linux");
65 Define(Defs, "__gnu_linux__");
66}
67
Chris Lattner8b30c412008-09-30 01:00:25 +000068static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +000069 Define(Defs, "__APPLE__");
70 Define(Defs, "__MACH__");
Chris Lattner8b30c412008-09-30 01:00:25 +000071
72 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
73 const char *Darwin = strstr(Triple, "-darwin");
74 if (Darwin) {
Chris Lattner079f2c462008-09-30 20:30:12 +000075 char DarwinStr[] = "1000";
Chris Lattner8b30c412008-09-30 01:00:25 +000076 Darwin += strlen("-darwin");
Chris Lattner079f2c462008-09-30 20:30:12 +000077 if (Darwin[0] >= '0' && Darwin[0] <= '9') {
78 unsigned DarwinNo = Darwin[0]-'0';
79 ++Darwin;
80
81 // Handle "darwin11".
82 if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
83 DarwinNo = 10+Darwin[0]-'0';
84 ++Darwin;
85 }
86
87 if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
Chris Lattner8b30c412008-09-30 01:00:25 +000088 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
89 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattner8b30c412008-09-30 01:00:25 +000090 }
Chris Lattner079f2c462008-09-30 20:30:12 +000091
92 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
93 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
94 Darwin[2] == '\0')
95 DarwinStr[3] = Darwin[1];
96
Chris Lattner8b30c412008-09-30 01:00:25 +000097 }
Chris Lattner079f2c462008-09-30 20:30:12 +000098 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattner8b30c412008-09-30 01:00:25 +000099 }
Eli Friedman618234a2008-08-20 02:34:37 +0000100}
Reid Spencer5f016e22007-07-11 17:01:13 +0000101
Chris Lattnerd29b6302008-10-05 21:50:58 +0000102//===----------------------------------------------------------------------===//
103// Defines specific to certain architectures.
104//===----------------------------------------------------------------------===//
Eli Friedman0d4047b2008-08-21 00:24:02 +0000105
Reid Spencer5f016e22007-07-11 17:01:13 +0000106/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
107/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000108static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000109 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000110 Define(Defs, "__ppc__");
111 Define(Defs, "_ARCH_PPC");
112 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000113 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000114 Define(Defs, "_ARCH_PPC64");
115 Define(Defs, "_LP64");
116 Define(Defs, "__LP64__");
117 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000118 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000119 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000120 }
121
122 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000123 Define(Defs, "_BIG_ENDIAN");
124 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000125
Reid Spencer5f016e22007-07-11 17:01:13 +0000126 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000127 Define(Defs, "__NATURAL_ALIGNMENT__");
128 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000129
Chris Lattner12f09262008-10-05 21:49:27 +0000130 // FIXME: Should be controlled by command line option.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000131 Define(Defs, "__LONG_DOUBLE_128__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000132}
133
134/// getX86Defines - Return a set of the X86-specific #defines that are
135/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000136static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000137 // Target identification.
138 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000139 Define(Defs, "_LP64");
140 Define(Defs, "__LP64__");
141 Define(Defs, "__amd64__");
142 Define(Defs, "__amd64");
143 Define(Defs, "__x86_64");
144 Define(Defs, "__x86_64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000145 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000146 Define(Defs, "__i386__");
147 Define(Defs, "__i386");
148 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000149 }
150
151 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000152 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000153
Reid Spencer5f016e22007-07-11 17:01:13 +0000154 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000155 Define(Defs, "__nocona");
156 Define(Defs, "__nocona__");
157 Define(Defs, "__tune_nocona__");
158 Define(Defs, "__SSE2_MATH__");
159 Define(Defs, "__SSE2__");
160 Define(Defs, "__SSE_MATH__");
161 Define(Defs, "__SSE__");
162 Define(Defs, "__MMX__");
163 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000164}
165
Chris Lattnerd0c33d32008-04-21 20:19:54 +0000166/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner393ff042008-04-21 18:56:49 +0000167/// not tied to a specific subtarget.
168static void getARMDefines(std::vector<char> &Defs) {
169 // Target identification.
170 Define(Defs, "__arm");
171 Define(Defs, "__arm__");
172
173 // Target properties.
174 Define(Defs, "__LITTLE_ENDIAN__");
175
Chris Lattner393ff042008-04-21 18:56:49 +0000176 // Subtarget options. [hard coded to v6 for now]
177 Define(Defs, "__ARM_ARCH_6K__");
178 Define(Defs, "__ARMEL__");
179 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner393ff042008-04-21 18:56:49 +0000180}
181
Eli Friedmane4277982008-08-20 23:11:40 +0000182//===----------------------------------------------------------------------===//
183// Specific target implementations.
184//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000185
Eli Friedmane4277982008-08-20 23:11:40 +0000186namespace {
187// PPC abstract base class
188class PPCTargetInfo : public TargetInfo {
189 static const Builtin::Info BuiltinInfo[];
190 static const char * const GCCRegNames[];
191 static const TargetInfo::GCCRegAlias GCCRegAliases[];
192
193public:
194 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
195 CharIsSigned = false;
196 }
197 virtual void getTargetBuiltins(const Builtin::Info *&Records,
198 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000199 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000200 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000201 }
Eli Friedmane4277982008-08-20 23:11:40 +0000202 virtual const char *getVAListDeclaration() const {
203 return "typedef struct __va_list_tag {"
204 " unsigned char gpr;"
205 " unsigned char fpr;"
206 " unsigned short reserved;"
207 " void* overflow_arg_area;"
208 " void* reg_save_area;"
209 "} __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +0000210 }
Eli Friedmane4277982008-08-20 23:11:40 +0000211 virtual const char *getTargetPrefix() const {
212 return "ppc";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000213 }
Eli Friedmane4277982008-08-20 23:11:40 +0000214 virtual void getGCCRegNames(const char * const *&Names,
215 unsigned &NumNames) const;
216 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
217 unsigned &NumAliases) const;
218 virtual bool validateAsmConstraint(char c,
219 TargetInfo::ConstraintInfo &info) const {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000220 switch (c) {
221 default: return false;
222 case 'O': // Zero
223 return true;
224 case 'b': // Base register
225 case 'f': // Floating point register
226 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
227 return true;
228 }
229 }
Eli Friedmane4277982008-08-20 23:11:40 +0000230 virtual const char *getClobbers() const {
231 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000232 }
Eli Friedmane4277982008-08-20 23:11:40 +0000233};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000234
Eli Friedmane4277982008-08-20 23:11:40 +0000235const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
236#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
237#include "clang/AST/PPCBuiltins.def"
238};
Chris Lattner393ff042008-04-21 18:56:49 +0000239
Eli Friedmane4277982008-08-20 23:11:40 +0000240const char * const PPCTargetInfo::GCCRegNames[] = {
241 "0", "1", "2", "3", "4", "5", "6", "7",
242 "8", "9", "10", "11", "12", "13", "14", "15",
243 "16", "17", "18", "19", "20", "21", "22", "23",
244 "24", "25", "26", "27", "28", "29", "30", "31",
245 "0", "1", "2", "3", "4", "5", "6", "7",
246 "8", "9", "10", "11", "12", "13", "14", "15",
247 "16", "17", "18", "19", "20", "21", "22", "23",
248 "24", "25", "26", "27", "28", "29", "30", "31",
249 "mq", "lr", "ctr", "ap",
250 "0", "1", "2", "3", "4", "5", "6", "7",
251 "xer",
252 "0", "1", "2", "3", "4", "5", "6", "7",
253 "8", "9", "10", "11", "12", "13", "14", "15",
254 "16", "17", "18", "19", "20", "21", "22", "23",
255 "24", "25", "26", "27", "28", "29", "30", "31",
256 "vrsave", "vscr",
257 "spe_acc", "spefscr",
258 "sfp"
259};
Reid Spencer5f016e22007-07-11 17:01:13 +0000260
Eli Friedmane4277982008-08-20 23:11:40 +0000261void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
262 unsigned &NumNames) const {
263 Names = GCCRegNames;
264 NumNames = llvm::array_lengthof(GCCRegNames);
265}
Reid Spencer5f016e22007-07-11 17:01:13 +0000266
Eli Friedmane4277982008-08-20 23:11:40 +0000267const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
268 // While some of these aliases do map to different registers
269 // they still share the same register name.
270 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
271 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
272 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
273 { { "cr3", "fr3", "r3", "v3"}, "3" },
274 { { "cr4", "fr4", "r4", "v4"}, "4" },
275 { { "cr5", "fr5", "r5", "v5"}, "5" },
276 { { "cr6", "fr6", "r6", "v6"}, "6" },
277 { { "cr7", "fr7", "r7", "v7"}, "7" },
278 { { "fr8", "r8", "v8"}, "8" },
279 { { "fr9", "r9", "v9"}, "9" },
280 { { "fr10", "r10", "v10"}, "10" },
281 { { "fr11", "r11", "v11"}, "11" },
282 { { "fr12", "r12", "v12"}, "12" },
283 { { "fr13", "r13", "v13"}, "13" },
284 { { "fr14", "r14", "v14"}, "14" },
285 { { "fr15", "r15", "v15"}, "15" },
286 { { "fr16", "r16", "v16"}, "16" },
287 { { "fr17", "r17", "v17"}, "17" },
288 { { "fr18", "r18", "v18"}, "18" },
289 { { "fr19", "r19", "v19"}, "19" },
290 { { "fr20", "r20", "v20"}, "20" },
291 { { "fr21", "r21", "v21"}, "21" },
292 { { "fr22", "r22", "v22"}, "22" },
293 { { "fr23", "r23", "v23"}, "23" },
294 { { "fr24", "r24", "v24"}, "24" },
295 { { "fr25", "r25", "v25"}, "25" },
296 { { "fr26", "r26", "v26"}, "26" },
297 { { "fr27", "r27", "v27"}, "27" },
298 { { "fr28", "r28", "v28"}, "28" },
299 { { "fr29", "r29", "v29"}, "29" },
300 { { "fr30", "r30", "v30"}, "30" },
301 { { "fr31", "r31", "v31"}, "31" },
302};
303
304void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
305 unsigned &NumAliases) const {
306 Aliases = GCCRegAliases;
307 NumAliases = llvm::array_lengthof(GCCRegAliases);
308}
309} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000310
311namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000312class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000313public:
Eli Friedmaned855cb2008-08-21 00:13:15 +0000314 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
315 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
316 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
317 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000318 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000319 getPowerPCDefines(Defines, false);
320 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000321};
322} // end anonymous namespace.
323
324namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000325class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000326public:
Eli Friedmane4277982008-08-20 23:11:40 +0000327 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000328 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000329 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
330 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerf291b102008-05-09 06:17:04 +0000331 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000332 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000333 getPowerPCDefines(Defines, true);
334 }
Eli Friedmane4277982008-08-20 23:11:40 +0000335};
336} // end anonymous namespace.
337
338namespace {
339class DarwinPPCTargetInfo : public PPC32TargetInfo {
340public:
341 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
342 virtual void getTargetDefines(std::vector<char> &Defines) const {
343 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000344 getDarwinDefines(Defines, getTargetTriple());
Reid Spencer5f016e22007-07-11 17:01:13 +0000345 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000346
347 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmane4277982008-08-20 23:11:40 +0000348};
349} // end anonymous namespace.
350
351namespace {
352class DarwinPPC64TargetInfo : public PPC64TargetInfo {
353public:
354 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
355 virtual void getTargetDefines(std::vector<char> &Defines) const {
356 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000357 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000358 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000359
360 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Reid Spencer5f016e22007-07-11 17:01:13 +0000361};
362} // end anonymous namespace.
363
364namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000365// Namespace for x86 abstract base class
366const Builtin::Info BuiltinInfo[] = {
367#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
368#include "clang/AST/X86Builtins.def"
369};
Eli Friedman61538a72008-05-20 14:21:01 +0000370
Eli Friedman618234a2008-08-20 02:34:37 +0000371const char *GCCRegNames[] = {
372 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
373 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
374 "argp", "flags", "fspr", "dirflag", "frame",
375 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
376 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
378 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
379};
380
381const TargetInfo::GCCRegAlias GCCRegAliases[] = {
382 { { "al", "ah", "eax", "rax" }, "ax" },
383 { { "bl", "bh", "ebx", "rbx" }, "bx" },
384 { { "cl", "ch", "ecx", "rcx" }, "cx" },
385 { { "dl", "dh", "edx", "rdx" }, "dx" },
386 { { "esi", "rsi" }, "si" },
387 { { "edi", "rdi" }, "di" },
388 { { "esp", "rsp" }, "sp" },
389 { { "ebp", "rbp" }, "bp" },
390};
391
392// X86 target abstract base class; x86-32 and x86-64 are very close, so
393// most of the implementation can be shared.
394class X86TargetInfo : public TargetInfo {
395public:
396 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
397 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +0000398 }
399 virtual void getTargetBuiltins(const Builtin::Info *&Records,
400 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000401 Records = BuiltinInfo;
402 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000403 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000404 virtual const char *getTargetPrefix() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000405 return "x86";
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000406 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000407 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +0000408 unsigned &NumNames) const {
409 Names = GCCRegNames;
410 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +0000411 }
412 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
413 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000414 Aliases = GCCRegAliases;
415 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000416 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000417 virtual bool validateAsmConstraint(char c,
Eli Friedman618234a2008-08-20 02:34:37 +0000418 TargetInfo::ConstraintInfo &info) const;
419 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000420 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000421 return "~{dirflag},~{fpsr},~{flags}";
422 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000423};
Eli Friedman618234a2008-08-20 02:34:37 +0000424
425bool
426X86TargetInfo::validateAsmConstraint(char c,
427 TargetInfo::ConstraintInfo &info) const {
428 switch (c) {
429 default: return false;
430 case 'a': // eax.
431 case 'b': // ebx.
432 case 'c': // ecx.
433 case 'd': // edx.
434 case 'S': // esi.
435 case 'D': // edi.
436 case 'A': // edx:eax.
437 case 't': // top of floating point stack.
438 case 'u': // second from top of floating point stack.
439 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +0000440 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +0000441 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +0000442 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
443 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
444 // instructions.
445 case 'N': // unsigned 8-bit integer constant for use with in and out
446 // instructions.
447 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
448 return true;
449 }
450}
451
452std::string
453X86TargetInfo::convertConstraint(const char Constraint) const {
454 switch (Constraint) {
455 case 'a': return std::string("{ax}");
456 case 'b': return std::string("{bx}");
457 case 'c': return std::string("{cx}");
458 case 'd': return std::string("{dx}");
459 case 'S': return std::string("{si}");
460 case 'D': return std::string("{di}");
461 case 't': // top of floating point stack.
462 return std::string("{st}");
463 case 'u': // second from top of floating point stack.
464 return std::string("{st(1)}"); // second from top of floating point stack.
465 default:
466 return std::string(1, Constraint);
467 }
468}
Eli Friedman618234a2008-08-20 02:34:37 +0000469} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +0000470
471namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000472// X86-32 generic target
473class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000474public:
Eli Friedman618234a2008-08-20 02:34:37 +0000475 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
476 DoubleAlign = LongLongAlign = 32;
477 LongDoubleWidth = 96;
478 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000479 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
480 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
481 "a0:0:64-f80:32:32";
Eli Friedman618234a2008-08-20 02:34:37 +0000482 }
483 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000484 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +0000485 }
486 virtual void getTargetDefines(std::vector<char> &Defines) const {
487 getX86Defines(Defines, false);
488 }
489};
490} // end anonymous namespace
491
492namespace {
493// x86-32 Darwin (OS X) target
494class DarwinI386TargetInfo : public X86_32TargetInfo {
495public:
496 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
497 LongDoubleWidth = 128;
498 LongDoubleAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000499 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
500 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
501 "a0:0:64-f80:128:128";
Eli Friedman618234a2008-08-20 02:34:37 +0000502 }
503 virtual void getTargetDefines(std::vector<char> &Defines) const {
504 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000505 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman618234a2008-08-20 02:34:37 +0000506 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000507 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman618234a2008-08-20 02:34:37 +0000508};
509} // end anonymous namespace
510
511namespace {
Chris Lattnereac7aee2008-08-23 18:23:14 +0000512// x86-32 DragonFly target
513class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
514public:
515 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
516 }
517 virtual void getTargetDefines(std::vector<char> &Defines) const {
518 X86_32TargetInfo::getTargetDefines(Defines);
519 getDragonFlyDefines(Defines);
520 }
521};
522} // end anonymous namespace
523
524namespace {
Eli Friedman0d4047b2008-08-21 00:24:02 +0000525// x86-32 Linux target
526class LinuxX86_32TargetInfo : public X86_32TargetInfo {
527public:
528 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner9b533162008-10-05 19:44:25 +0000529 UserLabelPrefix = "";
Eli Friedman0d4047b2008-08-21 00:24:02 +0000530 }
531 virtual void getTargetDefines(std::vector<char> &Defines) const {
532 X86_32TargetInfo::getTargetDefines(Defines);
533 getLinuxDefines(Defines);
534 }
535};
536} // end anonymous namespace
537
538namespace {
Eli Friedman29a30502008-08-21 01:40:19 +0000539// x86-32 Windows target
540class WindowsX86_32TargetInfo : public X86_32TargetInfo {
541public:
542 WindowsX86_32TargetInfo(const std::string& triple)
543 : X86_32TargetInfo(triple) {
544 // FIXME: Fix wchar_t.
545 // FIXME: We should probably enable -fms-extensions by default for
546 // this target.
547 }
548 virtual void getTargetDefines(std::vector<char> &Defines) const {
549 X86_32TargetInfo::getTargetDefines(Defines);
550 // This list is based off of the the list of things MingW defines
551 Define(Defines, "__WIN32__");
552 Define(Defines, "__WIN32");
553 Define(Defines, "_WIN32");
554 Define(Defines, "WIN32");
555 Define(Defines, "__WINNT__");
556 Define(Defines, "__WINNT");
557 Define(Defines, "WINNT");
Eli Friedman29a30502008-08-21 01:40:19 +0000558 Define(Defines, "_X86_");
559 Define(Defines, "__MSVCRT__");
560 }
561};
562} // end anonymous namespace
563
564namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000565// x86-64 generic target
566class X86_64TargetInfo : public X86TargetInfo {
567public:
568 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000569 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +0000570 LongDoubleWidth = 128;
571 LongDoubleAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000572 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
573 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
574 "a0:0:64-f80:128:128";
Reid Spencer5f016e22007-07-11 17:01:13 +0000575 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000576 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000577 return "typedef struct __va_list_tag {"
578 " unsigned gp_offset;"
579 " unsigned fp_offset;"
580 " void* overflow_arg_area;"
581 " void* reg_save_area;"
582 "} __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +0000583 }
Eli Friedman618234a2008-08-20 02:34:37 +0000584 virtual void getTargetDefines(std::vector<char> &Defines) const {
585 getX86Defines(Defines, true);
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000586 }
Eli Friedman618234a2008-08-20 02:34:37 +0000587};
588} // end anonymous namespace
589
590namespace {
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000591// x86-64 Linux target
592class LinuxX86_64TargetInfo : public X86_64TargetInfo {
593public:
594 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner9b533162008-10-05 19:44:25 +0000595 UserLabelPrefix = "";
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000596 }
597 virtual void getTargetDefines(std::vector<char> &Defines) const {
598 X86_64TargetInfo::getTargetDefines(Defines);
599 getLinuxDefines(Defines);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000600 }
601};
602} // end anonymous namespace
603
604namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000605// x86-64 Darwin (OS X) target
606class DarwinX86_64TargetInfo : public X86_64TargetInfo {
607public:
608 DarwinX86_64TargetInfo(const std::string& triple) :
609 X86_64TargetInfo(triple) {}
610
611 virtual void getTargetDefines(std::vector<char> &Defines) const {
612 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000613 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000614 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000615
616 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Reid Spencer5f016e22007-07-11 17:01:13 +0000617};
618} // end anonymous namespace.
619
Chris Lattner393ff042008-04-21 18:56:49 +0000620namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +0000621class ARMTargetInfo : public TargetInfo {
Chris Lattner393ff042008-04-21 18:56:49 +0000622public:
Eli Friedmana9f54962008-08-20 07:44:10 +0000623 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
624 // FIXME: Are the defaults correct for ARM?
Eli Friedmaned855cb2008-08-21 00:13:15 +0000625 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
626 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman61538a72008-05-20 14:21:01 +0000627 }
Chris Lattner393ff042008-04-21 18:56:49 +0000628 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner393ff042008-04-21 18:56:49 +0000629 getARMDefines(Defines);
630 }
631 virtual void getTargetBuiltins(const Builtin::Info *&Records,
632 unsigned &NumRecords) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000633 // FIXME: Implement.
634 Records = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000635 NumRecords = 0;
636 }
637 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000638 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +0000639 }
640 virtual const char *getTargetPrefix() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000641 return "arm";
Chris Lattner393ff042008-04-21 18:56:49 +0000642 }
Chris Lattner393ff042008-04-21 18:56:49 +0000643 virtual void getGCCRegNames(const char * const *&Names,
644 unsigned &NumNames) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000645 // FIXME: Implement.
646 Names = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000647 NumNames = 0;
648 }
649 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
650 unsigned &NumAliases) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000651 // FIXME: Implement.
652 Aliases = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000653 NumAliases = 0;
654 }
655 virtual bool validateAsmConstraint(char c,
Nate Begemanad487f42008-04-22 05:03:19 +0000656 TargetInfo::ConstraintInfo &info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000657 // FIXME: Check if this is complete
Nate Begemanad487f42008-04-22 05:03:19 +0000658 switch (c) {
Eli Friedmana9f54962008-08-20 07:44:10 +0000659 default:
Nate Begemanad487f42008-04-22 05:03:19 +0000660 case 'l': // r0-r7
661 case 'h': // r8-r15
662 case 'w': // VFP Floating point register single precision
663 case 'P': // VFP Floating point register double precision
664 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
665 return true;
666 }
Chris Lattner393ff042008-04-21 18:56:49 +0000667 return false;
668 }
669 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000670 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +0000671 return "";
672 }
673};
674} // end anonymous namespace.
675
Eli Friedmana9f54962008-08-20 07:44:10 +0000676
677namespace {
678class DarwinARMTargetInfo : public ARMTargetInfo {
679public:
680 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
681
682 virtual void getTargetDefines(std::vector<char> &Defines) const {
683 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000684 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmana9f54962008-08-20 07:44:10 +0000685 }
686};
687} // end anonymous namespace.
688
Reid Spencer5f016e22007-07-11 17:01:13 +0000689namespace {
Eli Friedman01b86682008-08-20 07:28:14 +0000690class SparcV8TargetInfo : public TargetInfo {
Gabor Greif26658672008-02-21 16:29:08 +0000691public:
Eli Friedman01b86682008-08-20 07:28:14 +0000692 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
693 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +0000694 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
695 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedman01b86682008-08-20 07:28:14 +0000696 }
Gabor Greif26658672008-02-21 16:29:08 +0000697 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000698 // FIXME: This is missing a lot of important defines; some of the
699 // missing stuff is likely to break system headers.
Gabor Greif26658672008-02-21 16:29:08 +0000700 Define(Defines, "__sparc");
Eli Friedmanbf0c9bd2008-05-25 05:26:09 +0000701 Define(Defines, "__sparc__");
Gabor Greif26658672008-02-21 16:29:08 +0000702 Define(Defines, "__sparcv8");
703 }
704 virtual void getTargetBuiltins(const Builtin::Info *&Records,
705 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000706 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +0000707 }
708 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000709 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +0000710 }
711 virtual const char *getTargetPrefix() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000712 return "sparc";
Gabor Greif26658672008-02-21 16:29:08 +0000713 }
714 virtual void getGCCRegNames(const char * const *&Names,
715 unsigned &NumNames) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000716 // FIXME: Implement!
717 Names = 0;
718 NumNames = 0;
Gabor Greif26658672008-02-21 16:29:08 +0000719 }
720 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
721 unsigned &NumAliases) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000722 // FIXME: Implement!
723 Aliases = 0;
724 NumAliases = 0;
Gabor Greif26658672008-02-21 16:29:08 +0000725 }
726 virtual bool validateAsmConstraint(char c,
727 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000728 // FIXME: Implement!
729 return false;
Gabor Greif26658672008-02-21 16:29:08 +0000730 }
731 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000732 // FIXME: Implement!
733 return "";
Gabor Greif26658672008-02-21 16:29:08 +0000734 }
735};
736
737} // end anonymous namespace.
738
Eli Friedman01b86682008-08-20 07:28:14 +0000739namespace {
740class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
741public:
742 SolarisSparcV8TargetInfo(const std::string& triple) :
743 SparcV8TargetInfo(triple) {}
744
745 virtual void getTargetDefines(std::vector<char> &Defines) const {
746 SparcV8TargetInfo::getTargetDefines(Defines);
747 getSolarisDefines(Defines);
748 }
749};
750} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000751
Chris Lattner2621fd12008-05-08 05:58:21 +0000752namespace {
753 class PIC16TargetInfo : public TargetInfo{
754 public:
755 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman61538a72008-05-20 14:21:01 +0000756 // FIXME: Is IntAlign really supposed to be 16? There seems
757 // little point on a platform with 8-bit loads.
758 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner0e5d4ef2008-10-05 20:06:37 +0000759 LongWidth = 16;
Eli Friedman61538a72008-05-20 14:21:01 +0000760 PointerAlign = 8;
Sanjiv Gupta364af812008-08-18 10:05:22 +0000761 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner2621fd12008-05-08 05:58:21 +0000762 }
Chris Lattner927686f2008-05-09 06:08:39 +0000763 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
764 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner2621fd12008-05-08 05:58:21 +0000765 virtual void getTargetDefines(std::vector<char> &Defines) const {
766 Define(Defines, "__pic16");
767 }
768 virtual void getTargetBuiltins(const Builtin::Info *&Records,
769 unsigned &NumRecords) const {}
770 virtual const char *getVAListDeclaration() const { return "";}
771 virtual const char *getClobbers() const {return "";}
772 virtual const char *getTargetPrefix() const {return "";}
773 virtual void getGCCRegNames(const char * const *&Names,
774 unsigned &NumNames) const {}
775 virtual bool validateAsmConstraint(char c,
776 TargetInfo::ConstraintInfo &info) const {
777 return true;
778 }
779 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
780 unsigned &NumAliases) const {}
781 virtual bool useGlobalsForAutomaticVariables() const {return true;}
782 };
783}
784
Reid Spencer5f016e22007-07-11 17:01:13 +0000785//===----------------------------------------------------------------------===//
786// Driver code
787//===----------------------------------------------------------------------===//
788
Ted Kremenek8448d382007-12-04 17:07:35 +0000789static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +0000790 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
791 TT[4] == '-' && TT[1] - '3' < 6);
792}
793
Chris Lattner42e67372008-03-05 01:18:20 +0000794/// CreateTargetInfo - Return the target info object for the specified target
795/// triple.
796TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000797 // OS detection; this isn't really anywhere near complete.
798 // Additions and corrections are welcome.
799 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnereac7aee2008-08-23 18:23:14 +0000800 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000801 bool isSolaris = T.find("-solaris") != std::string::npos;
802 bool isLinux = T.find("-linux") != std::string::npos;
803 bool isWindows = T.find("-windows") != std::string::npos ||
804 T.find("-win32") != std::string::npos ||
805 T.find("-mingw") != std::string::npos;
Eli Friedman61538a72008-05-20 14:21:01 +0000806
Eli Friedmaned855cb2008-08-21 00:13:15 +0000807 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
808 if (isDarwin)
809 return new DarwinPPCTargetInfo(T);
810 return new PPC32TargetInfo(T);
811 }
Eli Friedman61538a72008-05-20 14:21:01 +0000812
Eli Friedmaned855cb2008-08-21 00:13:15 +0000813 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
814 if (isDarwin)
815 return new DarwinPPC64TargetInfo(T);
816 return new PPC64TargetInfo(T);
817 }
Chris Lattner393ff042008-04-21 18:56:49 +0000818
Eli Friedmaned855cb2008-08-21 00:13:15 +0000819 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
820 if (isDarwin)
821 return new DarwinARMTargetInfo(T);
822 return new ARMTargetInfo(T);
823 }
Eli Friedman61538a72008-05-20 14:21:01 +0000824
Eli Friedmaned855cb2008-08-21 00:13:15 +0000825 if (T.find("sparc-") == 0) {
826 if (isSolaris)
827 return new SolarisSparcV8TargetInfo(T);
828 return new SparcV8TargetInfo(T);
829 }
830
831 if (T.find("x86_64-") == 0) {
832 if (isDarwin)
833 return new DarwinX86_64TargetInfo(T);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000834 if (isLinux)
835 return new LinuxX86_64TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +0000836 return new X86_64TargetInfo(T);
837 }
Eli Friedman61538a72008-05-20 14:21:01 +0000838
Chris Lattner2621fd12008-05-08 05:58:21 +0000839 if (T.find("pic16-") == 0)
840 return new PIC16TargetInfo(T);
841
Eli Friedmaned855cb2008-08-21 00:13:15 +0000842 if (IsX86(T)) {
843 if (isDarwin)
844 return new DarwinI386TargetInfo(T);
Eli Friedman0d4047b2008-08-21 00:24:02 +0000845 if (isLinux)
846 return new LinuxX86_32TargetInfo(T);
Chris Lattnereac7aee2008-08-23 18:23:14 +0000847 if (isDragonFly)
848 return new DragonFlyX86_32TargetInfo(T);
Eli Friedman29a30502008-08-21 01:40:19 +0000849 if (isWindows)
850 return new WindowsX86_32TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +0000851 return new X86_32TargetInfo(T);
852 }
Eli Friedman61538a72008-05-20 14:21:01 +0000853
Chris Lattner42e67372008-03-05 01:18:20 +0000854 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +0000855}
Ted Kremenekfb79f7c2008-03-04 17:47:18 +0000856