blob: 016f88e4987368a912048dc6868776621ed4ab4e [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
Chris Lattnerbd00eb82008-10-05 21:50:58 +000036//===----------------------------------------------------------------------===//
37// Defines specific to certain operating systems.
38//===----------------------------------------------------------------------===//
39
Eli Friedmanff158dd2008-08-20 07:28:14 +000040static void getSolarisDefines(std::vector<char> &Defs) {
41 Define(Defs, "__SUN__");
42 Define(Defs, "__SOLARIS__");
43}
Chris Lattner4b009652007-07-25 00:24:17 +000044
Chris Lattnerbd00eb82008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +000068static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +000069 Define(Defs, "__APPLE__");
70 Define(Defs, "__MACH__");
Chris Lattnerc5dc8eb2008-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 Lattnerd376f6d2008-09-30 20:30:12 +000075 char DarwinStr[] = "1000";
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000076 Darwin += strlen("-darwin");
Chris Lattnerd376f6d2008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +000088 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
89 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000090 }
Chris Lattnerd376f6d2008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +000097 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +000098 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000099 }
Eli Friedman872996c2008-08-20 02:34:37 +0000100}
Chris Lattner4b009652007-07-25 00:24:17 +0000101
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000102//===----------------------------------------------------------------------===//
103// Defines specific to certain architectures.
104//===----------------------------------------------------------------------===//
Eli Friedman5fb0a022008-08-21 00:24:02 +0000105
Chris Lattner4b009652007-07-25 00:24:17 +0000106/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
107/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000108static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000109 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000110 Define(Defs, "__ppc__");
111 Define(Defs, "_ARCH_PPC");
112 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000113 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000114 Define(Defs, "_ARCH_PPC64");
115 Define(Defs, "_LP64");
116 Define(Defs, "__LP64__");
117 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000118 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000119 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000120 }
121
122 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000123 Define(Defs, "_BIG_ENDIAN");
124 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000125
Chris Lattner4b009652007-07-25 00:24:17 +0000126 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000127 Define(Defs, "__NATURAL_ALIGNMENT__");
128 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000129
Chris Lattner3da35682008-10-05 21:49:27 +0000130 // FIXME: Should be controlled by command line option.
Chris Lattner0db667a2007-10-06 06:57:34 +0000131 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000132}
133
134/// getX86Defines - Return a set of the X86-specific #defines that are
135/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000136static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000137 // Target identification.
138 if (is64Bit) {
Chris Lattner0db667a2007-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__");
Chris Lattner4b009652007-07-25 00:24:17 +0000145 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000146 Define(Defs, "__i386__");
147 Define(Defs, "__i386");
148 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000149 }
150
151 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000152 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000153
Chris Lattner4b009652007-07-25 00:24:17 +0000154 // Subtarget options.
Chris Lattner0db667a2007-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__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000164}
165
Chris Lattnerb6444052008-04-21 20:19:54 +0000166/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-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 Lattner9fd73612008-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 Lattner9fd73612008-04-21 18:56:49 +0000180}
181
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000182//===----------------------------------------------------------------------===//
183// Specific target implementations.
184//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000185
Eli Friedmanfd5a4122008-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 {
Chris Lattner4b009652007-07-25 00:24:17 +0000199 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000200 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000201 }
Eli Friedmanfd5a4122008-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 Carlsson7dd1c952007-11-24 23:38:12 +0000210 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000211 virtual const char *getTargetPrefix() const {
212 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000213 }
Eli Friedmanfd5a4122008-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 Carlsson4ce42302007-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 Friedmanfd5a4122008-08-20 23:11:40 +0000230 virtual const char *getClobbers() const {
231 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000232 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000233};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000234
Eli Friedmanfd5a4122008-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 Lattner9fd73612008-04-21 18:56:49 +0000239
Eli Friedmanfd5a4122008-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};
Chris Lattner4b009652007-07-25 00:24:17 +0000260
Eli Friedmanfd5a4122008-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}
Chris Lattner4b009652007-07-25 00:24:17 +0000266
Eli Friedmanfd5a4122008-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.
Chris Lattner4b009652007-07-25 00:24:17 +0000310
311namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000312class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000313public:
Eli Friedman2b161652008-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 Lattner0db667a2007-10-06 06:57:34 +0000318 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000319 getPowerPCDefines(Defines, false);
320 }
Chris Lattner4b009652007-07-25 00:24:17 +0000321};
322} // end anonymous namespace.
323
324namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000325class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000326public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000327 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000328 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-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 Lattnere5fde952008-05-09 06:17:04 +0000331 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000332 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000333 getPowerPCDefines(Defines, true);
334 }
Eli Friedmanfd5a4122008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +0000344 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000345 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000346
347 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanfd5a4122008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +0000357 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000358 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000359
360 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000361};
362} // end anonymous namespace.
363
364namespace {
Eli Friedman872996c2008-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 Friedman0b7b1cb2008-05-20 14:21:01 +0000370
Eli Friedman872996c2008-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;
Chris Lattner4b009652007-07-25 00:24:17 +0000398 }
399 virtual void getTargetBuiltins(const Builtin::Info *&Records,
400 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000401 Records = BuiltinInfo;
402 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000403 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000404 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000405 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000406 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000407 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000408 unsigned &NumNames) const {
409 Names = GCCRegNames;
410 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000411 }
412 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
413 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000414 Aliases = GCCRegAliases;
415 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000416 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000417 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000418 TargetInfo::ConstraintInfo &info) const;
419 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000420 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000421 return "~{dirflag},~{fpsr},~{flags}";
422 }
Chris Lattner4b009652007-07-25 00:24:17 +0000423};
Eli Friedman872996c2008-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.
440 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
441 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
442 // instructions.
443 case 'N': // unsigned 8-bit integer constant for use with in and out
444 // instructions.
445 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
446 return true;
447 }
448}
449
450std::string
451X86TargetInfo::convertConstraint(const char Constraint) const {
452 switch (Constraint) {
453 case 'a': return std::string("{ax}");
454 case 'b': return std::string("{bx}");
455 case 'c': return std::string("{cx}");
456 case 'd': return std::string("{dx}");
457 case 'S': return std::string("{si}");
458 case 'D': return std::string("{di}");
459 case 't': // top of floating point stack.
460 return std::string("{st}");
461 case 'u': // second from top of floating point stack.
462 return std::string("{st(1)}"); // second from top of floating point stack.
463 default:
464 return std::string(1, Constraint);
465 }
466}
Eli Friedman872996c2008-08-20 02:34:37 +0000467} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000468
469namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000470// X86-32 generic target
471class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000472public:
Eli Friedman872996c2008-08-20 02:34:37 +0000473 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
474 DoubleAlign = LongLongAlign = 32;
475 LongDoubleWidth = 96;
476 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000477 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
478 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
479 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000480 }
481 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000482 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000483 }
484 virtual void getTargetDefines(std::vector<char> &Defines) const {
485 getX86Defines(Defines, false);
486 }
487};
488} // end anonymous namespace
489
490namespace {
491// x86-32 Darwin (OS X) target
492class DarwinI386TargetInfo : public X86_32TargetInfo {
493public:
494 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
495 LongDoubleWidth = 128;
496 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000497 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
498 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
499 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000500 }
501 virtual void getTargetDefines(std::vector<char> &Defines) const {
502 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000503 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000504 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000505 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +0000506};
507} // end anonymous namespace
508
509namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000510// x86-32 DragonFly target
511class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
512public:
513 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
514 }
515 virtual void getTargetDefines(std::vector<char> &Defines) const {
516 X86_32TargetInfo::getTargetDefines(Defines);
517 getDragonFlyDefines(Defines);
518 }
519};
520} // end anonymous namespace
521
522namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000523// x86-32 Linux target
524class LinuxX86_32TargetInfo : public X86_32TargetInfo {
525public:
526 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000527 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000528 }
529 virtual void getTargetDefines(std::vector<char> &Defines) const {
530 X86_32TargetInfo::getTargetDefines(Defines);
531 getLinuxDefines(Defines);
532 }
533};
534} // end anonymous namespace
535
536namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000537// x86-32 Windows target
538class WindowsX86_32TargetInfo : public X86_32TargetInfo {
539public:
540 WindowsX86_32TargetInfo(const std::string& triple)
541 : X86_32TargetInfo(triple) {
542 // FIXME: Fix wchar_t.
543 // FIXME: We should probably enable -fms-extensions by default for
544 // this target.
545 }
546 virtual void getTargetDefines(std::vector<char> &Defines) const {
547 X86_32TargetInfo::getTargetDefines(Defines);
548 // This list is based off of the the list of things MingW defines
549 Define(Defines, "__WIN32__");
550 Define(Defines, "__WIN32");
551 Define(Defines, "_WIN32");
552 Define(Defines, "WIN32");
553 Define(Defines, "__WINNT__");
554 Define(Defines, "__WINNT");
555 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000556 Define(Defines, "_X86_");
557 Define(Defines, "__MSVCRT__");
558 }
559};
560} // end anonymous namespace
561
562namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000563// x86-64 generic target
564class X86_64TargetInfo : public X86TargetInfo {
565public:
566 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000567 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000568 LongDoubleWidth = 128;
569 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000570 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
571 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
572 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000573 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000574 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000575 return "typedef struct __va_list_tag {"
576 " unsigned gp_offset;"
577 " unsigned fp_offset;"
578 " void* overflow_arg_area;"
579 " void* reg_save_area;"
580 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000581 }
Eli Friedman872996c2008-08-20 02:34:37 +0000582 virtual void getTargetDefines(std::vector<char> &Defines) const {
583 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000584 }
Eli Friedman872996c2008-08-20 02:34:37 +0000585};
586} // end anonymous namespace
587
588namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000589// x86-64 Linux target
590class LinuxX86_64TargetInfo : public X86_64TargetInfo {
591public:
592 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000593 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000594 }
595 virtual void getTargetDefines(std::vector<char> &Defines) const {
596 X86_64TargetInfo::getTargetDefines(Defines);
597 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000598 }
599};
600} // end anonymous namespace
601
602namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000603// x86-64 Darwin (OS X) target
604class DarwinX86_64TargetInfo : public X86_64TargetInfo {
605public:
606 DarwinX86_64TargetInfo(const std::string& triple) :
607 X86_64TargetInfo(triple) {}
608
609 virtual void getTargetDefines(std::vector<char> &Defines) const {
610 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000611 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000612 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000613
614 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000615};
616} // end anonymous namespace.
617
Chris Lattner9fd73612008-04-21 18:56:49 +0000618namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000619class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000620public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000621 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
622 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000623 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
624 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000625 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000626 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000627 getARMDefines(Defines);
628 }
629 virtual void getTargetBuiltins(const Builtin::Info *&Records,
630 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000631 // FIXME: Implement.
632 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000633 NumRecords = 0;
634 }
635 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000636 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000637 }
638 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000639 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000640 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000641 virtual void getGCCRegNames(const char * const *&Names,
642 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000643 // FIXME: Implement.
644 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000645 NumNames = 0;
646 }
647 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
648 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000649 // FIXME: Implement.
650 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000651 NumAliases = 0;
652 }
653 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000654 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000655 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000656 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000657 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000658 case 'l': // r0-r7
659 case 'h': // r8-r15
660 case 'w': // VFP Floating point register single precision
661 case 'P': // VFP Floating point register double precision
662 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
663 return true;
664 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000665 return false;
666 }
667 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000668 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000669 return "";
670 }
671};
672} // end anonymous namespace.
673
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000674
675namespace {
676class DarwinARMTargetInfo : public ARMTargetInfo {
677public:
678 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
679
680 virtual void getTargetDefines(std::vector<char> &Defines) const {
681 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000682 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000683 }
684};
685} // end anonymous namespace.
686
Chris Lattner4b009652007-07-25 00:24:17 +0000687namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000688class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000689public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000690 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
691 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000692 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
693 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000694 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000695 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000696 // FIXME: This is missing a lot of important defines; some of the
697 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000698 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000699 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000700 Define(Defines, "__sparcv8");
701 }
702 virtual void getTargetBuiltins(const Builtin::Info *&Records,
703 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000704 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000705 }
706 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000707 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000708 }
709 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000710 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000711 }
712 virtual void getGCCRegNames(const char * const *&Names,
713 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000714 // FIXME: Implement!
715 Names = 0;
716 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000717 }
718 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
719 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000720 // FIXME: Implement!
721 Aliases = 0;
722 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000723 }
724 virtual bool validateAsmConstraint(char c,
725 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000726 // FIXME: Implement!
727 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000728 }
729 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000730 // FIXME: Implement!
731 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000732 }
733};
734
735} // end anonymous namespace.
736
Eli Friedmanff158dd2008-08-20 07:28:14 +0000737namespace {
738class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
739public:
740 SolarisSparcV8TargetInfo(const std::string& triple) :
741 SparcV8TargetInfo(triple) {}
742
743 virtual void getTargetDefines(std::vector<char> &Defines) const {
744 SparcV8TargetInfo::getTargetDefines(Defines);
745 getSolarisDefines(Defines);
746 }
747};
748} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000749
Chris Lattner85970f32008-05-08 05:58:21 +0000750namespace {
751 class PIC16TargetInfo : public TargetInfo{
752 public:
753 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000754 // FIXME: Is IntAlign really supposed to be 16? There seems
755 // little point on a platform with 8-bit loads.
756 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner1be8bb92008-10-05 20:06:37 +0000757 LongWidth = 16;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000758 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000759 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000760 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000761 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
762 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000763 virtual void getTargetDefines(std::vector<char> &Defines) const {
764 Define(Defines, "__pic16");
765 }
766 virtual void getTargetBuiltins(const Builtin::Info *&Records,
767 unsigned &NumRecords) const {}
768 virtual const char *getVAListDeclaration() const { return "";}
769 virtual const char *getClobbers() const {return "";}
770 virtual const char *getTargetPrefix() const {return "";}
771 virtual void getGCCRegNames(const char * const *&Names,
772 unsigned &NumNames) const {}
773 virtual bool validateAsmConstraint(char c,
774 TargetInfo::ConstraintInfo &info) const {
775 return true;
776 }
777 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
778 unsigned &NumAliases) const {}
779 virtual bool useGlobalsForAutomaticVariables() const {return true;}
780 };
781}
782
Chris Lattner4b009652007-07-25 00:24:17 +0000783//===----------------------------------------------------------------------===//
784// Driver code
785//===----------------------------------------------------------------------===//
786
Ted Kremenekb97d7672007-12-04 17:07:35 +0000787static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000788 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
789 TT[4] == '-' && TT[1] - '3' < 6);
790}
791
Chris Lattnerfc457002008-03-05 01:18:20 +0000792/// CreateTargetInfo - Return the target info object for the specified target
793/// triple.
794TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000795 // OS detection; this isn't really anywhere near complete.
796 // Additions and corrections are welcome.
797 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000798 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000799 bool isSolaris = T.find("-solaris") != std::string::npos;
800 bool isLinux = T.find("-linux") != std::string::npos;
801 bool isWindows = T.find("-windows") != std::string::npos ||
802 T.find("-win32") != std::string::npos ||
803 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000804
Eli Friedman2b161652008-08-21 00:13:15 +0000805 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
806 if (isDarwin)
807 return new DarwinPPCTargetInfo(T);
808 return new PPC32TargetInfo(T);
809 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000810
Eli Friedman2b161652008-08-21 00:13:15 +0000811 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
812 if (isDarwin)
813 return new DarwinPPC64TargetInfo(T);
814 return new PPC64TargetInfo(T);
815 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000816
Eli Friedman2b161652008-08-21 00:13:15 +0000817 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
818 if (isDarwin)
819 return new DarwinARMTargetInfo(T);
820 return new ARMTargetInfo(T);
821 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000822
Eli Friedman2b161652008-08-21 00:13:15 +0000823 if (T.find("sparc-") == 0) {
824 if (isSolaris)
825 return new SolarisSparcV8TargetInfo(T);
826 return new SparcV8TargetInfo(T);
827 }
828
829 if (T.find("x86_64-") == 0) {
830 if (isDarwin)
831 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000832 if (isLinux)
833 return new LinuxX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000834 return new X86_64TargetInfo(T);
835 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000836
Chris Lattner85970f32008-05-08 05:58:21 +0000837 if (T.find("pic16-") == 0)
838 return new PIC16TargetInfo(T);
839
Eli Friedman2b161652008-08-21 00:13:15 +0000840 if (IsX86(T)) {
841 if (isDarwin)
842 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000843 if (isLinux)
844 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000845 if (isDragonFly)
846 return new DragonFlyX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +0000847 if (isWindows)
848 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000849 return new X86_32TargetInfo(T);
850 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000851
Chris Lattnerfc457002008-03-05 01:18:20 +0000852 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000853}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000854