blob: 424be5f268ec13a023ce269b4c0253dcc7b42c9a [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-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 Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner10a5b382007-01-29 05:24:35 +000015#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000020using namespace clang;
21
Chris Lattner5ba61f02006-10-14 07:39:34 +000022//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000023// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
25
Chris Lattnerb2d486a2007-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 Friedmanda8f5a92008-08-20 07:28:14 +000036static void getSolarisDefines(std::vector<char> &Defs) {
37 Define(Defs, "__SUN__");
38 Define(Defs, "__SOLARIS__");
39}
Chris Lattner5ba61f02006-10-14 07:39:34 +000040
Chris Lattnerb3793bb2008-09-30 01:00:25 +000041static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +000042 Define(Defs, "__APPLE__");
43 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-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 Lattner97d74942008-09-30 20:30:12 +000048 char DarwinStr[] = "1000";
Chris Lattnerb3793bb2008-09-30 01:00:25 +000049 Darwin += strlen("-darwin");
Chris Lattner97d74942008-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 Lattnerb3793bb2008-09-30 01:00:25 +000061 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
62 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +000063 }
Chris Lattner97d74942008-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 Lattnerb3793bb2008-09-30 01:00:25 +000070 }
Chris Lattner97d74942008-09-30 20:30:12 +000071 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +000072 }
Eli Friedman3fd920a2008-08-20 02:34:37 +000073}
Chris Lattner5ba61f02006-10-14 07:39:34 +000074
Chris Lattner5637ef52008-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 Friedmanff594f22008-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 Lattner1f5ad112006-10-14 18:32:12 +000098/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
99/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000100static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000101 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000102 Define(Defs, "__ppc__");
103 Define(Defs, "_ARCH_PPC");
104 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000105 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000106 Define(Defs, "_ARCH_PPC64");
107 Define(Defs, "_LP64");
108 Define(Defs, "__LP64__");
109 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000110 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000111 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000112 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000113
Chris Lattner9c837532006-10-15 01:05:46 +0000114 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000115 Define(Defs, "_BIG_ENDIAN");
116 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000117
Chris Lattner9c837532006-10-15 01:05:46 +0000118 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000119 Define(Defs, "__NATURAL_ALIGNMENT__");
120 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000121
Chris Lattnerac7ed9a2008-10-05 21:49:27 +0000122 // FIXME: Should be controlled by command line option.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000123 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000124}
125
126/// getX86Defines - Return a set of the X86-specific #defines that are
127/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000128static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000129 // Target identification.
130 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000131 Define(Defs, "_LP64");
132 Define(Defs, "__LP64__");
133 Define(Defs, "__amd64__");
134 Define(Defs, "__amd64");
135 Define(Defs, "__x86_64");
136 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000137 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000138 Define(Defs, "__i386__");
139 Define(Defs, "__i386");
140 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000141 }
142
143 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000144 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000145
Chris Lattner9c837532006-10-15 01:05:46 +0000146 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000147 Define(Defs, "__nocona");
148 Define(Defs, "__nocona__");
149 Define(Defs, "__tune_nocona__");
150 Define(Defs, "__SSE2_MATH__");
151 Define(Defs, "__SSE2__");
152 Define(Defs, "__SSE_MATH__");
153 Define(Defs, "__SSE__");
154 Define(Defs, "__MMX__");
155 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000156}
157
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000158/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000159/// not tied to a specific subtarget.
160static void getARMDefines(std::vector<char> &Defs) {
161 // Target identification.
162 Define(Defs, "__arm");
163 Define(Defs, "__arm__");
164
165 // Target properties.
166 Define(Defs, "__LITTLE_ENDIAN__");
167
Chris Lattner17df24e2008-04-21 18:56:49 +0000168 // Subtarget options. [hard coded to v6 for now]
169 Define(Defs, "__ARM_ARCH_6K__");
170 Define(Defs, "__ARMEL__");
171 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner17df24e2008-04-21 18:56:49 +0000172}
173
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000174//===----------------------------------------------------------------------===//
175// Specific target implementations.
176//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000177
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000178namespace {
179// PPC abstract base class
180class PPCTargetInfo : public TargetInfo {
181 static const Builtin::Info BuiltinInfo[];
182 static const char * const GCCRegNames[];
183 static const TargetInfo::GCCRegAlias GCCRegAliases[];
184
185public:
186 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
187 CharIsSigned = false;
188 }
189 virtual void getTargetBuiltins(const Builtin::Info *&Records,
190 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000191 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000192 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000193 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000194 virtual const char *getVAListDeclaration() const {
195 return "typedef struct __va_list_tag {"
196 " unsigned char gpr;"
197 " unsigned char fpr;"
198 " unsigned short reserved;"
199 " void* overflow_arg_area;"
200 " void* reg_save_area;"
201 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000202 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000203 virtual const char *getTargetPrefix() const {
204 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000205 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000206 virtual void getGCCRegNames(const char * const *&Names,
207 unsigned &NumNames) const;
208 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
209 unsigned &NumAliases) const;
210 virtual bool validateAsmConstraint(char c,
211 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000212 switch (c) {
213 default: return false;
214 case 'O': // Zero
215 return true;
216 case 'b': // Base register
217 case 'f': // Floating point register
218 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
219 return true;
220 }
221 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000222 virtual const char *getClobbers() const {
223 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000224 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000225};
Anders Carlssonf511f642007-11-27 04:11:28 +0000226
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000227const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
228#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
229#include "clang/AST/PPCBuiltins.def"
230};
Chris Lattner17df24e2008-04-21 18:56:49 +0000231
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000232const char * const PPCTargetInfo::GCCRegNames[] = {
233 "0", "1", "2", "3", "4", "5", "6", "7",
234 "8", "9", "10", "11", "12", "13", "14", "15",
235 "16", "17", "18", "19", "20", "21", "22", "23",
236 "24", "25", "26", "27", "28", "29", "30", "31",
237 "0", "1", "2", "3", "4", "5", "6", "7",
238 "8", "9", "10", "11", "12", "13", "14", "15",
239 "16", "17", "18", "19", "20", "21", "22", "23",
240 "24", "25", "26", "27", "28", "29", "30", "31",
241 "mq", "lr", "ctr", "ap",
242 "0", "1", "2", "3", "4", "5", "6", "7",
243 "xer",
244 "0", "1", "2", "3", "4", "5", "6", "7",
245 "8", "9", "10", "11", "12", "13", "14", "15",
246 "16", "17", "18", "19", "20", "21", "22", "23",
247 "24", "25", "26", "27", "28", "29", "30", "31",
248 "vrsave", "vscr",
249 "spe_acc", "spefscr",
250 "sfp"
251};
Chris Lattner10a5b382007-01-29 05:24:35 +0000252
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000253void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
254 unsigned &NumNames) const {
255 Names = GCCRegNames;
256 NumNames = llvm::array_lengthof(GCCRegNames);
257}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000258
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000259const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
260 // While some of these aliases do map to different registers
261 // they still share the same register name.
262 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
263 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
264 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
265 { { "cr3", "fr3", "r3", "v3"}, "3" },
266 { { "cr4", "fr4", "r4", "v4"}, "4" },
267 { { "cr5", "fr5", "r5", "v5"}, "5" },
268 { { "cr6", "fr6", "r6", "v6"}, "6" },
269 { { "cr7", "fr7", "r7", "v7"}, "7" },
270 { { "fr8", "r8", "v8"}, "8" },
271 { { "fr9", "r9", "v9"}, "9" },
272 { { "fr10", "r10", "v10"}, "10" },
273 { { "fr11", "r11", "v11"}, "11" },
274 { { "fr12", "r12", "v12"}, "12" },
275 { { "fr13", "r13", "v13"}, "13" },
276 { { "fr14", "r14", "v14"}, "14" },
277 { { "fr15", "r15", "v15"}, "15" },
278 { { "fr16", "r16", "v16"}, "16" },
279 { { "fr17", "r17", "v17"}, "17" },
280 { { "fr18", "r18", "v18"}, "18" },
281 { { "fr19", "r19", "v19"}, "19" },
282 { { "fr20", "r20", "v20"}, "20" },
283 { { "fr21", "r21", "v21"}, "21" },
284 { { "fr22", "r22", "v22"}, "22" },
285 { { "fr23", "r23", "v23"}, "23" },
286 { { "fr24", "r24", "v24"}, "24" },
287 { { "fr25", "r25", "v25"}, "25" },
288 { { "fr26", "r26", "v26"}, "26" },
289 { { "fr27", "r27", "v27"}, "27" },
290 { { "fr28", "r28", "v28"}, "28" },
291 { { "fr29", "r29", "v29"}, "29" },
292 { { "fr30", "r30", "v30"}, "30" },
293 { { "fr31", "r31", "v31"}, "31" },
294};
295
296void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
297 unsigned &NumAliases) const {
298 Aliases = GCCRegAliases;
299 NumAliases = llvm::array_lengthof(GCCRegAliases);
300}
301} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000302
Chris Lattner5ba61f02006-10-14 07:39:34 +0000303namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000304class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000305public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000306 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
307 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
308 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
309 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000310 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000311 getPowerPCDefines(Defines, false);
312 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000313};
314} // end anonymous namespace.
315
316namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000317class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000318public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000319 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000320 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000321 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
322 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000323 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000324 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000325 getPowerPCDefines(Defines, true);
326 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000327};
328} // end anonymous namespace.
329
330namespace {
331class DarwinPPCTargetInfo : public PPC32TargetInfo {
332public:
333 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
334 virtual void getTargetDefines(std::vector<char> &Defines) const {
335 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000336 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000337 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000338
339 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000340};
341} // end anonymous namespace.
342
343namespace {
344class DarwinPPC64TargetInfo : public PPC64TargetInfo {
345public:
346 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
347 virtual void getTargetDefines(std::vector<char> &Defines) const {
348 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000349 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000350 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000351
352 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000353};
354} // end anonymous namespace.
355
356namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000357// Namespace for x86 abstract base class
358const Builtin::Info BuiltinInfo[] = {
359#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
360#include "clang/AST/X86Builtins.def"
361};
Eli Friedmanb5366062008-05-20 14:21:01 +0000362
Eli Friedman3fd920a2008-08-20 02:34:37 +0000363const char *GCCRegNames[] = {
364 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
365 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
366 "argp", "flags", "fspr", "dirflag", "frame",
367 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
368 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
369 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
370 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
371};
372
373const TargetInfo::GCCRegAlias GCCRegAliases[] = {
374 { { "al", "ah", "eax", "rax" }, "ax" },
375 { { "bl", "bh", "ebx", "rbx" }, "bx" },
376 { { "cl", "ch", "ecx", "rcx" }, "cx" },
377 { { "dl", "dh", "edx", "rdx" }, "dx" },
378 { { "esi", "rsi" }, "si" },
379 { { "edi", "rdi" }, "di" },
380 { { "esp", "rsp" }, "sp" },
381 { { "ebp", "rbp" }, "bp" },
382};
383
384// X86 target abstract base class; x86-32 and x86-64 are very close, so
385// most of the implementation can be shared.
386class X86TargetInfo : public TargetInfo {
387public:
388 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
389 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000390 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000391 virtual void getTargetBuiltins(const Builtin::Info *&Records,
392 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000393 Records = BuiltinInfo;
394 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000395 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000396 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000397 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000398 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000399 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000400 unsigned &NumNames) const {
401 Names = GCCRegNames;
402 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000403 }
404 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
405 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000406 Aliases = GCCRegAliases;
407 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000408 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000409 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000410 TargetInfo::ConstraintInfo &info) const;
411 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000412 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000413 return "~{dirflag},~{fpsr},~{flags}";
414 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000415};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000416
417bool
418X86TargetInfo::validateAsmConstraint(char c,
419 TargetInfo::ConstraintInfo &info) const {
420 switch (c) {
421 default: return false;
422 case 'a': // eax.
423 case 'b': // ebx.
424 case 'c': // ecx.
425 case 'd': // edx.
426 case 'S': // esi.
427 case 'D': // edi.
428 case 'A': // edx:eax.
429 case 't': // top of floating point stack.
430 case 'u': // second from top of floating point stack.
431 case 'q': // Any register accessible as [r]l: a, b, c, and d.
432 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
433 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
434 // instructions.
435 case 'N': // unsigned 8-bit integer constant for use with in and out
436 // instructions.
437 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
438 return true;
439 }
440}
441
442std::string
443X86TargetInfo::convertConstraint(const char Constraint) const {
444 switch (Constraint) {
445 case 'a': return std::string("{ax}");
446 case 'b': return std::string("{bx}");
447 case 'c': return std::string("{cx}");
448 case 'd': return std::string("{dx}");
449 case 'S': return std::string("{si}");
450 case 'D': return std::string("{di}");
451 case 't': // top of floating point stack.
452 return std::string("{st}");
453 case 'u': // second from top of floating point stack.
454 return std::string("{st(1)}"); // second from top of floating point stack.
455 default:
456 return std::string(1, Constraint);
457 }
458}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000459} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000460
461namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000462// X86-32 generic target
463class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000464public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000465 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
466 DoubleAlign = LongLongAlign = 32;
467 LongDoubleWidth = 96;
468 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000469 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
470 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
471 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000472 }
473 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000474 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000475 }
476 virtual void getTargetDefines(std::vector<char> &Defines) const {
477 getX86Defines(Defines, false);
478 }
479};
480} // end anonymous namespace
481
482namespace {
483// x86-32 Darwin (OS X) target
484class DarwinI386TargetInfo : public X86_32TargetInfo {
485public:
486 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
487 LongDoubleWidth = 128;
488 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000489 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
490 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
491 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000492 }
493 virtual void getTargetDefines(std::vector<char> &Defines) const {
494 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000495 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000496 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000497 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000498};
499} // end anonymous namespace
500
501namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000502// x86-32 DragonFly target
503class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
504public:
505 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
506 }
507 virtual void getTargetDefines(std::vector<char> &Defines) const {
508 X86_32TargetInfo::getTargetDefines(Defines);
509 getDragonFlyDefines(Defines);
510 }
511};
512} // end anonymous namespace
513
514namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000515// x86-32 Linux target
516class LinuxX86_32TargetInfo : public X86_32TargetInfo {
517public:
518 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000519 UserLabelPrefix = "";
Eli Friedmanff594f22008-08-21 00:24:02 +0000520 }
521 virtual void getTargetDefines(std::vector<char> &Defines) const {
522 X86_32TargetInfo::getTargetDefines(Defines);
523 getLinuxDefines(Defines);
524 }
525};
526} // end anonymous namespace
527
528namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000529// x86-32 Windows target
530class WindowsX86_32TargetInfo : public X86_32TargetInfo {
531public:
532 WindowsX86_32TargetInfo(const std::string& triple)
533 : X86_32TargetInfo(triple) {
534 // FIXME: Fix wchar_t.
535 // FIXME: We should probably enable -fms-extensions by default for
536 // this target.
537 }
538 virtual void getTargetDefines(std::vector<char> &Defines) const {
539 X86_32TargetInfo::getTargetDefines(Defines);
540 // This list is based off of the the list of things MingW defines
541 Define(Defines, "__WIN32__");
542 Define(Defines, "__WIN32");
543 Define(Defines, "_WIN32");
544 Define(Defines, "WIN32");
545 Define(Defines, "__WINNT__");
546 Define(Defines, "__WINNT");
547 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000548 Define(Defines, "_X86_");
549 Define(Defines, "__MSVCRT__");
550 }
551};
552} // end anonymous namespace
553
554namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000555// x86-64 generic target
556class X86_64TargetInfo : public X86TargetInfo {
557public:
558 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000559 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000560 LongDoubleWidth = 128;
561 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000562 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
563 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
564 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000565 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000566 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000567 return "typedef struct __va_list_tag {"
568 " unsigned gp_offset;"
569 " unsigned fp_offset;"
570 " void* overflow_arg_area;"
571 " void* reg_save_area;"
572 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000573 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000574 virtual void getTargetDefines(std::vector<char> &Defines) const {
575 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000576 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000577};
578} // end anonymous namespace
579
580namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000581// x86-64 Linux target
582class LinuxX86_64TargetInfo : public X86_64TargetInfo {
583public:
584 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000585 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000586 }
587 virtual void getTargetDefines(std::vector<char> &Defines) const {
588 X86_64TargetInfo::getTargetDefines(Defines);
589 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000590 }
591};
592} // end anonymous namespace
593
594namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000595// x86-64 Darwin (OS X) target
596class DarwinX86_64TargetInfo : public X86_64TargetInfo {
597public:
598 DarwinX86_64TargetInfo(const std::string& triple) :
599 X86_64TargetInfo(triple) {}
600
601 virtual void getTargetDefines(std::vector<char> &Defines) const {
602 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000603 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000604 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000605
606 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000607};
608} // end anonymous namespace.
609
Chris Lattner17df24e2008-04-21 18:56:49 +0000610namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000611class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000612public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000613 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
614 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000615 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
616 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000617 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000618 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000619 getARMDefines(Defines);
620 }
621 virtual void getTargetBuiltins(const Builtin::Info *&Records,
622 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000623 // FIXME: Implement.
624 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000625 NumRecords = 0;
626 }
627 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000628 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000629 }
630 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000631 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000632 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000633 virtual void getGCCRegNames(const char * const *&Names,
634 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000635 // FIXME: Implement.
636 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000637 NumNames = 0;
638 }
639 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
640 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000641 // FIXME: Implement.
642 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000643 NumAliases = 0;
644 }
645 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000646 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000647 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000648 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000649 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000650 case 'l': // r0-r7
651 case 'h': // r8-r15
652 case 'w': // VFP Floating point register single precision
653 case 'P': // VFP Floating point register double precision
654 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
655 return true;
656 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000657 return false;
658 }
659 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000660 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000661 return "";
662 }
663};
664} // end anonymous namespace.
665
Eli Friedmanf05b7722008-08-20 07:44:10 +0000666
667namespace {
668class DarwinARMTargetInfo : public ARMTargetInfo {
669public:
670 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
671
672 virtual void getTargetDefines(std::vector<char> &Defines) const {
673 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000674 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000675 }
676};
677} // end anonymous namespace.
678
Chris Lattner5ba61f02006-10-14 07:39:34 +0000679namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000680class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000681public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000682 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
683 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000684 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
685 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000686 }
Gabor Greif49991682008-02-21 16:29:08 +0000687 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000688 // FIXME: This is missing a lot of important defines; some of the
689 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000690 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000691 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000692 Define(Defines, "__sparcv8");
693 }
694 virtual void getTargetBuiltins(const Builtin::Info *&Records,
695 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000696 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000697 }
698 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000699 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000700 }
701 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000702 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000703 }
704 virtual void getGCCRegNames(const char * const *&Names,
705 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000706 // FIXME: Implement!
707 Names = 0;
708 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000709 }
710 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
711 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000712 // FIXME: Implement!
713 Aliases = 0;
714 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000715 }
716 virtual bool validateAsmConstraint(char c,
717 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000718 // FIXME: Implement!
719 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000720 }
721 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000722 // FIXME: Implement!
723 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000724 }
725};
726
727} // end anonymous namespace.
728
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000729namespace {
730class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
731public:
732 SolarisSparcV8TargetInfo(const std::string& triple) :
733 SparcV8TargetInfo(triple) {}
734
735 virtual void getTargetDefines(std::vector<char> &Defines) const {
736 SparcV8TargetInfo::getTargetDefines(Defines);
737 getSolarisDefines(Defines);
738 }
739};
740} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000741
Chris Lattnerb781dc792008-05-08 05:58:21 +0000742namespace {
743 class PIC16TargetInfo : public TargetInfo{
744 public:
745 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000746 // FIXME: Is IntAlign really supposed to be 16? There seems
747 // little point on a platform with 8-bit loads.
748 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner6512a882008-10-05 20:06:37 +0000749 LongWidth = 16;
Eli Friedmanb5366062008-05-20 14:21:01 +0000750 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000751 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000752 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000753 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
754 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000755 virtual void getTargetDefines(std::vector<char> &Defines) const {
756 Define(Defines, "__pic16");
757 }
758 virtual void getTargetBuiltins(const Builtin::Info *&Records,
759 unsigned &NumRecords) const {}
760 virtual const char *getVAListDeclaration() const { return "";}
761 virtual const char *getClobbers() const {return "";}
762 virtual const char *getTargetPrefix() const {return "";}
763 virtual void getGCCRegNames(const char * const *&Names,
764 unsigned &NumNames) const {}
765 virtual bool validateAsmConstraint(char c,
766 TargetInfo::ConstraintInfo &info) const {
767 return true;
768 }
769 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
770 unsigned &NumAliases) const {}
771 virtual bool useGlobalsForAutomaticVariables() const {return true;}
772 };
773}
774
Chris Lattner5ba61f02006-10-14 07:39:34 +0000775//===----------------------------------------------------------------------===//
776// Driver code
777//===----------------------------------------------------------------------===//
778
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000779static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000780 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
781 TT[4] == '-' && TT[1] - '3' < 6);
782}
783
Chris Lattner855d0242008-03-05 01:18:20 +0000784/// CreateTargetInfo - Return the target info object for the specified target
785/// triple.
786TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000787 // OS detection; this isn't really anywhere near complete.
788 // Additions and corrections are welcome.
789 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000790 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000791 bool isSolaris = T.find("-solaris") != std::string::npos;
792 bool isLinux = T.find("-linux") != std::string::npos;
793 bool isWindows = T.find("-windows") != std::string::npos ||
794 T.find("-win32") != std::string::npos ||
795 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000796
Eli Friedman873f65a2008-08-21 00:13:15 +0000797 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
798 if (isDarwin)
799 return new DarwinPPCTargetInfo(T);
800 return new PPC32TargetInfo(T);
801 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000802
Eli Friedman873f65a2008-08-21 00:13:15 +0000803 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
804 if (isDarwin)
805 return new DarwinPPC64TargetInfo(T);
806 return new PPC64TargetInfo(T);
807 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000808
Eli Friedman873f65a2008-08-21 00:13:15 +0000809 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
810 if (isDarwin)
811 return new DarwinARMTargetInfo(T);
812 return new ARMTargetInfo(T);
813 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000814
Eli Friedman873f65a2008-08-21 00:13:15 +0000815 if (T.find("sparc-") == 0) {
816 if (isSolaris)
817 return new SolarisSparcV8TargetInfo(T);
818 return new SparcV8TargetInfo(T);
819 }
820
821 if (T.find("x86_64-") == 0) {
822 if (isDarwin)
823 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000824 if (isLinux)
825 return new LinuxX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000826 return new X86_64TargetInfo(T);
827 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000828
Chris Lattnerb781dc792008-05-08 05:58:21 +0000829 if (T.find("pic16-") == 0)
830 return new PIC16TargetInfo(T);
831
Eli Friedman873f65a2008-08-21 00:13:15 +0000832 if (IsX86(T)) {
833 if (isDarwin)
834 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000835 if (isLinux)
836 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000837 if (isDragonFly)
838 return new DragonFlyX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000839 if (isWindows)
840 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000841 return new X86_32TargetInfo(T);
842 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000843
Chris Lattner855d0242008-03-05 01:18:20 +0000844 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000845}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000846