blob: 97aa11ba02c8073533e07385aa18d09f211b519e [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek38591a22007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Chris Lattner4b009652007-07-25 00:24:17 +000020using namespace clang;
21
Chris Lattner4b009652007-07-25 00:24:17 +000022//===----------------------------------------------------------------------===//
23// Common code shared among targets.
24//===----------------------------------------------------------------------===//
25
Chris Lattner0db667a2007-10-06 06:57:34 +000026static void Define(std::vector<char> &Buf, const char *Macro,
27 const char *Val = "1") {
28 const char *Def = "#define ";
29 Buf.insert(Buf.end(), Def, Def+strlen(Def));
30 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
31 Buf.push_back(' ');
32 Buf.insert(Buf.end(), Val, Val+strlen(Val));
33 Buf.push_back('\n');
34}
35
Eli Friedmanff158dd2008-08-20 07:28:14 +000036static void getSolarisDefines(std::vector<char> &Defs) {
37 Define(Defs, "__SUN__");
38 Define(Defs, "__SOLARIS__");
39}
Chris Lattner4b009652007-07-25 00:24:17 +000040
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000041static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +000042 Define(Defs, "__APPLE__");
43 Define(Defs, "__MACH__");
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000044
45 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
46 const char *Darwin = strstr(Triple, "-darwin");
47 if (Darwin) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +000048 char DarwinStr[] = "1000";
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000049 Darwin += strlen("-darwin");
Chris Lattnerd376f6d2008-09-30 20:30:12 +000050 if (Darwin[0] >= '0' && Darwin[0] <= '9') {
51 unsigned DarwinNo = Darwin[0]-'0';
52 ++Darwin;
53
54 // Handle "darwin11".
55 if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
56 DarwinNo = 10+Darwin[0]-'0';
57 ++Darwin;
58 }
59
60 if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000061 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
62 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000063 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +000064
65 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
66 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
67 Darwin[2] == '\0')
68 DarwinStr[3] = Darwin[1];
69
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000070 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +000071 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000072 }
Eli Friedman872996c2008-08-20 02:34:37 +000073}
Chris Lattner4b009652007-07-25 00:24:17 +000074
Chris Lattnerd4faca42008-08-23 18:23:14 +000075static void getDragonFlyDefines(std::vector<char> &Defs) {
76 // DragonFly defines; list based off of gcc output
77 Define(Defs, "__DragonFly__");
78 Define(Defs, "__DragonFly_cc_version", "100001");
79 Define(Defs, "__ELF__");
80 Define(Defs, "__KPRINTF_ATTRIBUTE__");
81 Define(Defs, "__tune_i386__");
82 Define(Defs, "unix");
83 Define(Defs, "__unix");
84 Define(Defs, "__unix__");
85}
86
Eli Friedman5fb0a022008-08-21 00:24:02 +000087static void getLinuxDefines(std::vector<char> &Defs) {
88 // Linux defines; list based off of gcc output
89 Define(Defs, "__unix__");
90 Define(Defs, "__unix");
91 Define(Defs, "unix");
92 Define(Defs, "__linux__");
93 Define(Defs, "__linux");
94 Define(Defs, "linux");
95 Define(Defs, "__gnu_linux__");
96}
97
Chris Lattner4b009652007-07-25 00:24:17 +000098/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
99/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000100static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000101 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000102 Define(Defs, "__ppc__");
103 Define(Defs, "_ARCH_PPC");
104 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000105 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000106 Define(Defs, "_ARCH_PPC64");
107 Define(Defs, "_LP64");
108 Define(Defs, "__LP64__");
109 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000110 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000111 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000112 }
113
114 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000115 Define(Defs, "_BIG_ENDIAN");
116 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000117
Chris Lattner4b009652007-07-25 00:24:17 +0000118 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000119 Define(Defs, "__NATURAL_ALIGNMENT__");
120 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000121
Chris Lattner0db667a2007-10-06 06:57:34 +0000122 Define(Defs, "__FLT_EVAL_METHOD__", "0");
Chris Lattner0db667a2007-10-06 06:57:34 +0000123 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000124 Define(Defs, "__DECIMAL_DIG__", "33");
125
126 // Float macros.
127 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
Chris Lattner4b009652007-07-25 00:24:17 +0000128
129 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000130 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
Chris Lattner4b009652007-07-25 00:24:17 +0000131
132 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000133 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
Chris Lattner0db667a2007-10-06 06:57:34 +0000134 Define(Defs, "__LDBL_MIN__",
135 "2.00416836000897277799610805135016e-292L");
136 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000137}
138
139/// getX86Defines - Return a set of the X86-specific #defines that are
140/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000141static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000142 // Target identification.
143 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000144 Define(Defs, "_LP64");
145 Define(Defs, "__LP64__");
146 Define(Defs, "__amd64__");
147 Define(Defs, "__amd64");
148 Define(Defs, "__x86_64");
149 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000150 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000151 Define(Defs, "__i386__");
152 Define(Defs, "__i386");
153 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000154 }
155
156 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000157 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000158
Chris Lattner4b009652007-07-25 00:24:17 +0000159 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000160 Define(Defs, "__nocona");
161 Define(Defs, "__nocona__");
162 Define(Defs, "__tune_nocona__");
163 Define(Defs, "__SSE2_MATH__");
164 Define(Defs, "__SSE2__");
165 Define(Defs, "__SSE_MATH__");
166 Define(Defs, "__SSE__");
167 Define(Defs, "__MMX__");
168 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000169
Chris Lattner0db667a2007-10-06 06:57:34 +0000170 Define(Defs, "__FLT_EVAL_METHOD__", "0");
Chris Lattner0db667a2007-10-06 06:57:34 +0000171 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner0db667a2007-10-06 06:57:34 +0000172 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000173
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000174 // Float macros.
175 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
176
177 // Double macros.
178 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
179
Chris Lattner4b009652007-07-25 00:24:17 +0000180 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000181 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000182}
183
Chris Lattnerb6444052008-04-21 20:19:54 +0000184/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000185/// not tied to a specific subtarget.
186static void getARMDefines(std::vector<char> &Defs) {
187 // Target identification.
188 Define(Defs, "__arm");
189 Define(Defs, "__arm__");
190
191 // Target properties.
192 Define(Defs, "__LITTLE_ENDIAN__");
193
Chris Lattner9fd73612008-04-21 18:56:49 +0000194 // Subtarget options. [hard coded to v6 for now]
195 Define(Defs, "__ARM_ARCH_6K__");
196 Define(Defs, "__ARMEL__");
197 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
198
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000199 Define(Defs, "__FLT_EVAL_METHOD__", "0");
Chris Lattner9fd73612008-04-21 18:56:49 +0000200 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner5c8f64a2008-10-05 21:40:58 +0000201 Define(Defs, "__DECIMAL_DIG__", "17");
Chris Lattner9fd73612008-04-21 18:56:49 +0000202
203 // Float macros.
Chris Lattner9fd73612008-04-21 18:56:49 +0000204 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
205
206 // Double macros.
Chris Lattner9fd73612008-04-21 18:56:49 +0000207 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
208
209 // 64-bit Long double macros (same as double).
Chris Lattner9fd73612008-04-21 18:56:49 +0000210 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
211}
212
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000213//===----------------------------------------------------------------------===//
214// Specific target implementations.
215//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000216
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000217namespace {
218// PPC abstract base class
219class PPCTargetInfo : public TargetInfo {
220 static const Builtin::Info BuiltinInfo[];
221 static const char * const GCCRegNames[];
222 static const TargetInfo::GCCRegAlias GCCRegAliases[];
223
224public:
225 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
226 CharIsSigned = false;
227 }
228 virtual void getTargetBuiltins(const Builtin::Info *&Records,
229 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000230 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000231 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000232 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000233 virtual const char *getVAListDeclaration() const {
234 return "typedef struct __va_list_tag {"
235 " unsigned char gpr;"
236 " unsigned char fpr;"
237 " unsigned short reserved;"
238 " void* overflow_arg_area;"
239 " void* reg_save_area;"
240 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000241 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000242 virtual const char *getTargetPrefix() const {
243 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000244 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000245 virtual void getGCCRegNames(const char * const *&Names,
246 unsigned &NumNames) const;
247 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
248 unsigned &NumAliases) const;
249 virtual bool validateAsmConstraint(char c,
250 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000251 switch (c) {
252 default: return false;
253 case 'O': // Zero
254 return true;
255 case 'b': // Base register
256 case 'f': // Floating point register
257 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
258 return true;
259 }
260 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000261 virtual const char *getClobbers() const {
262 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000263 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000264};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000265
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000266const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
267#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
268#include "clang/AST/PPCBuiltins.def"
269};
Chris Lattner9fd73612008-04-21 18:56:49 +0000270
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000271const char * const PPCTargetInfo::GCCRegNames[] = {
272 "0", "1", "2", "3", "4", "5", "6", "7",
273 "8", "9", "10", "11", "12", "13", "14", "15",
274 "16", "17", "18", "19", "20", "21", "22", "23",
275 "24", "25", "26", "27", "28", "29", "30", "31",
276 "0", "1", "2", "3", "4", "5", "6", "7",
277 "8", "9", "10", "11", "12", "13", "14", "15",
278 "16", "17", "18", "19", "20", "21", "22", "23",
279 "24", "25", "26", "27", "28", "29", "30", "31",
280 "mq", "lr", "ctr", "ap",
281 "0", "1", "2", "3", "4", "5", "6", "7",
282 "xer",
283 "0", "1", "2", "3", "4", "5", "6", "7",
284 "8", "9", "10", "11", "12", "13", "14", "15",
285 "16", "17", "18", "19", "20", "21", "22", "23",
286 "24", "25", "26", "27", "28", "29", "30", "31",
287 "vrsave", "vscr",
288 "spe_acc", "spefscr",
289 "sfp"
290};
Chris Lattner4b009652007-07-25 00:24:17 +0000291
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000292void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
293 unsigned &NumNames) const {
294 Names = GCCRegNames;
295 NumNames = llvm::array_lengthof(GCCRegNames);
296}
Chris Lattner4b009652007-07-25 00:24:17 +0000297
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000298const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
299 // While some of these aliases do map to different registers
300 // they still share the same register name.
301 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
302 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
303 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
304 { { "cr3", "fr3", "r3", "v3"}, "3" },
305 { { "cr4", "fr4", "r4", "v4"}, "4" },
306 { { "cr5", "fr5", "r5", "v5"}, "5" },
307 { { "cr6", "fr6", "r6", "v6"}, "6" },
308 { { "cr7", "fr7", "r7", "v7"}, "7" },
309 { { "fr8", "r8", "v8"}, "8" },
310 { { "fr9", "r9", "v9"}, "9" },
311 { { "fr10", "r10", "v10"}, "10" },
312 { { "fr11", "r11", "v11"}, "11" },
313 { { "fr12", "r12", "v12"}, "12" },
314 { { "fr13", "r13", "v13"}, "13" },
315 { { "fr14", "r14", "v14"}, "14" },
316 { { "fr15", "r15", "v15"}, "15" },
317 { { "fr16", "r16", "v16"}, "16" },
318 { { "fr17", "r17", "v17"}, "17" },
319 { { "fr18", "r18", "v18"}, "18" },
320 { { "fr19", "r19", "v19"}, "19" },
321 { { "fr20", "r20", "v20"}, "20" },
322 { { "fr21", "r21", "v21"}, "21" },
323 { { "fr22", "r22", "v22"}, "22" },
324 { { "fr23", "r23", "v23"}, "23" },
325 { { "fr24", "r24", "v24"}, "24" },
326 { { "fr25", "r25", "v25"}, "25" },
327 { { "fr26", "r26", "v26"}, "26" },
328 { { "fr27", "r27", "v27"}, "27" },
329 { { "fr28", "r28", "v28"}, "28" },
330 { { "fr29", "r29", "v29"}, "29" },
331 { { "fr30", "r30", "v30"}, "30" },
332 { { "fr31", "r31", "v31"}, "31" },
333};
334
335void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
336 unsigned &NumAliases) const {
337 Aliases = GCCRegAliases;
338 NumAliases = llvm::array_lengthof(GCCRegAliases);
339}
340} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000341
342namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000343class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000344public:
Eli Friedman2b161652008-08-21 00:13:15 +0000345 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
346 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
347 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
348 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000349 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000350 getPowerPCDefines(Defines, false);
351 }
Chris Lattner4b009652007-07-25 00:24:17 +0000352};
353} // end anonymous namespace.
354
355namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000356class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000357public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000358 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000359 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000360 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
361 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000362 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000363 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000364 getPowerPCDefines(Defines, true);
365 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000366};
367} // end anonymous namespace.
368
369namespace {
370class DarwinPPCTargetInfo : public PPC32TargetInfo {
371public:
372 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
373 virtual void getTargetDefines(std::vector<char> &Defines) const {
374 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000375 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000376 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000377
378 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000379};
380} // end anonymous namespace.
381
382namespace {
383class DarwinPPC64TargetInfo : public PPC64TargetInfo {
384public:
385 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
386 virtual void getTargetDefines(std::vector<char> &Defines) const {
387 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000388 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000389 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000390
391 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000392};
393} // end anonymous namespace.
394
395namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000396// Namespace for x86 abstract base class
397const Builtin::Info BuiltinInfo[] = {
398#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
399#include "clang/AST/X86Builtins.def"
400};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000401
Eli Friedman872996c2008-08-20 02:34:37 +0000402const char *GCCRegNames[] = {
403 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
404 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
405 "argp", "flags", "fspr", "dirflag", "frame",
406 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
407 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
408 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
409 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
410};
411
412const TargetInfo::GCCRegAlias GCCRegAliases[] = {
413 { { "al", "ah", "eax", "rax" }, "ax" },
414 { { "bl", "bh", "ebx", "rbx" }, "bx" },
415 { { "cl", "ch", "ecx", "rcx" }, "cx" },
416 { { "dl", "dh", "edx", "rdx" }, "dx" },
417 { { "esi", "rsi" }, "si" },
418 { { "edi", "rdi" }, "di" },
419 { { "esp", "rsp" }, "sp" },
420 { { "ebp", "rbp" }, "bp" },
421};
422
423// X86 target abstract base class; x86-32 and x86-64 are very close, so
424// most of the implementation can be shared.
425class X86TargetInfo : public TargetInfo {
426public:
427 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
428 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000429 }
430 virtual void getTargetBuiltins(const Builtin::Info *&Records,
431 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000432 Records = BuiltinInfo;
433 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000434 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000435 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000436 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000437 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000438 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000439 unsigned &NumNames) const {
440 Names = GCCRegNames;
441 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000442 }
443 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
444 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000445 Aliases = GCCRegAliases;
446 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000447 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000448 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000449 TargetInfo::ConstraintInfo &info) const;
450 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000451 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000452 return "~{dirflag},~{fpsr},~{flags}";
453 }
Chris Lattner4b009652007-07-25 00:24:17 +0000454};
Eli Friedman872996c2008-08-20 02:34:37 +0000455
456bool
457X86TargetInfo::validateAsmConstraint(char c,
458 TargetInfo::ConstraintInfo &info) const {
459 switch (c) {
460 default: return false;
461 case 'a': // eax.
462 case 'b': // ebx.
463 case 'c': // ecx.
464 case 'd': // edx.
465 case 'S': // esi.
466 case 'D': // edi.
467 case 'A': // edx:eax.
468 case 't': // top of floating point stack.
469 case 'u': // second from top of floating point stack.
470 case 'q': // Any register accessible as [r]l: a, b, c, and d.
471 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
472 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
473 // instructions.
474 case 'N': // unsigned 8-bit integer constant for use with in and out
475 // instructions.
476 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
477 return true;
478 }
479}
480
481std::string
482X86TargetInfo::convertConstraint(const char Constraint) const {
483 switch (Constraint) {
484 case 'a': return std::string("{ax}");
485 case 'b': return std::string("{bx}");
486 case 'c': return std::string("{cx}");
487 case 'd': return std::string("{dx}");
488 case 'S': return std::string("{si}");
489 case 'D': return std::string("{di}");
490 case 't': // top of floating point stack.
491 return std::string("{st}");
492 case 'u': // second from top of floating point stack.
493 return std::string("{st(1)}"); // second from top of floating point stack.
494 default:
495 return std::string(1, Constraint);
496 }
497}
Eli Friedman872996c2008-08-20 02:34:37 +0000498} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000499
500namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000501// X86-32 generic target
502class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000503public:
Eli Friedman872996c2008-08-20 02:34:37 +0000504 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
505 DoubleAlign = LongLongAlign = 32;
506 LongDoubleWidth = 96;
507 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000508 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
509 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
510 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000511 }
512 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000513 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000514 }
515 virtual void getTargetDefines(std::vector<char> &Defines) const {
516 getX86Defines(Defines, false);
517 }
518};
519} // end anonymous namespace
520
521namespace {
522// x86-32 Darwin (OS X) target
523class DarwinI386TargetInfo : public X86_32TargetInfo {
524public:
525 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
526 LongDoubleWidth = 128;
527 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000528 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
529 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
530 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000531 }
532 virtual void getTargetDefines(std::vector<char> &Defines) const {
533 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000534 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000535 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000536 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +0000537};
538} // end anonymous namespace
539
540namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000541// x86-32 DragonFly target
542class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
543public:
544 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
545 }
546 virtual void getTargetDefines(std::vector<char> &Defines) const {
547 X86_32TargetInfo::getTargetDefines(Defines);
548 getDragonFlyDefines(Defines);
549 }
550};
551} // end anonymous namespace
552
553namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000554// x86-32 Linux target
555class LinuxX86_32TargetInfo : public X86_32TargetInfo {
556public:
557 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000558 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000559 }
560 virtual void getTargetDefines(std::vector<char> &Defines) const {
561 X86_32TargetInfo::getTargetDefines(Defines);
562 getLinuxDefines(Defines);
563 }
564};
565} // end anonymous namespace
566
567namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000568// x86-32 Windows target
569class WindowsX86_32TargetInfo : public X86_32TargetInfo {
570public:
571 WindowsX86_32TargetInfo(const std::string& triple)
572 : X86_32TargetInfo(triple) {
573 // FIXME: Fix wchar_t.
574 // FIXME: We should probably enable -fms-extensions by default for
575 // this target.
576 }
577 virtual void getTargetDefines(std::vector<char> &Defines) const {
578 X86_32TargetInfo::getTargetDefines(Defines);
579 // This list is based off of the the list of things MingW defines
580 Define(Defines, "__WIN32__");
581 Define(Defines, "__WIN32");
582 Define(Defines, "_WIN32");
583 Define(Defines, "WIN32");
584 Define(Defines, "__WINNT__");
585 Define(Defines, "__WINNT");
586 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000587 Define(Defines, "_X86_");
588 Define(Defines, "__MSVCRT__");
589 }
590};
591} // end anonymous namespace
592
593namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000594// x86-64 generic target
595class X86_64TargetInfo : public X86TargetInfo {
596public:
597 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000598 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000599 LongDoubleWidth = 128;
600 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000601 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
602 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
603 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000604 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000605 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000606 return "typedef struct __va_list_tag {"
607 " unsigned gp_offset;"
608 " unsigned fp_offset;"
609 " void* overflow_arg_area;"
610 " void* reg_save_area;"
611 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000612 }
Eli Friedman872996c2008-08-20 02:34:37 +0000613 virtual void getTargetDefines(std::vector<char> &Defines) const {
614 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000615 }
Eli Friedman872996c2008-08-20 02:34:37 +0000616};
617} // end anonymous namespace
618
619namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000620// x86-64 Linux target
621class LinuxX86_64TargetInfo : public X86_64TargetInfo {
622public:
623 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000624 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000625 }
626 virtual void getTargetDefines(std::vector<char> &Defines) const {
627 X86_64TargetInfo::getTargetDefines(Defines);
628 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000629 }
630};
631} // end anonymous namespace
632
633namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000634// x86-64 Darwin (OS X) target
635class DarwinX86_64TargetInfo : public X86_64TargetInfo {
636public:
637 DarwinX86_64TargetInfo(const std::string& triple) :
638 X86_64TargetInfo(triple) {}
639
640 virtual void getTargetDefines(std::vector<char> &Defines) const {
641 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000642 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000643 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000644
645 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000646};
647} // end anonymous namespace.
648
Chris Lattner9fd73612008-04-21 18:56:49 +0000649namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000650class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000651public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000652 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
653 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000654 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
655 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000656 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000657 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000658 getARMDefines(Defines);
659 }
660 virtual void getTargetBuiltins(const Builtin::Info *&Records,
661 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000662 // FIXME: Implement.
663 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000664 NumRecords = 0;
665 }
666 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000667 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000668 }
669 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000670 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000671 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000672 virtual void getGCCRegNames(const char * const *&Names,
673 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000674 // FIXME: Implement.
675 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000676 NumNames = 0;
677 }
678 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
679 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000680 // FIXME: Implement.
681 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000682 NumAliases = 0;
683 }
684 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000685 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000686 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000687 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000688 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000689 case 'l': // r0-r7
690 case 'h': // r8-r15
691 case 'w': // VFP Floating point register single precision
692 case 'P': // VFP Floating point register double precision
693 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
694 return true;
695 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000696 return false;
697 }
698 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000699 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000700 return "";
701 }
702};
703} // end anonymous namespace.
704
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000705
706namespace {
707class DarwinARMTargetInfo : public ARMTargetInfo {
708public:
709 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
710
711 virtual void getTargetDefines(std::vector<char> &Defines) const {
712 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000713 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000714 }
715};
716} // end anonymous namespace.
717
Chris Lattner4b009652007-07-25 00:24:17 +0000718namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000719class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000720public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000721 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
722 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000723 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
724 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000725 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000726 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000727 // FIXME: This is missing a lot of important defines; some of the
728 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000729 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000730 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000731 Define(Defines, "__sparcv8");
732 }
733 virtual void getTargetBuiltins(const Builtin::Info *&Records,
734 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000735 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000736 }
737 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000738 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000739 }
740 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000741 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000742 }
743 virtual void getGCCRegNames(const char * const *&Names,
744 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000745 // FIXME: Implement!
746 Names = 0;
747 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000748 }
749 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
750 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000751 // FIXME: Implement!
752 Aliases = 0;
753 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000754 }
755 virtual bool validateAsmConstraint(char c,
756 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000757 // FIXME: Implement!
758 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000759 }
760 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000761 // FIXME: Implement!
762 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000763 }
764};
765
766} // end anonymous namespace.
767
Eli Friedmanff158dd2008-08-20 07:28:14 +0000768namespace {
769class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
770public:
771 SolarisSparcV8TargetInfo(const std::string& triple) :
772 SparcV8TargetInfo(triple) {}
773
774 virtual void getTargetDefines(std::vector<char> &Defines) const {
775 SparcV8TargetInfo::getTargetDefines(Defines);
776 getSolarisDefines(Defines);
777 }
778};
779} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000780
Chris Lattner85970f32008-05-08 05:58:21 +0000781namespace {
782 class PIC16TargetInfo : public TargetInfo{
783 public:
784 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000785 // FIXME: Is IntAlign really supposed to be 16? There seems
786 // little point on a platform with 8-bit loads.
787 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner1be8bb92008-10-05 20:06:37 +0000788 LongWidth = 16;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000789 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000790 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000791 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000792 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
793 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000794 virtual void getTargetDefines(std::vector<char> &Defines) const {
795 Define(Defines, "__pic16");
796 }
797 virtual void getTargetBuiltins(const Builtin::Info *&Records,
798 unsigned &NumRecords) const {}
799 virtual const char *getVAListDeclaration() const { return "";}
800 virtual const char *getClobbers() const {return "";}
801 virtual const char *getTargetPrefix() const {return "";}
802 virtual void getGCCRegNames(const char * const *&Names,
803 unsigned &NumNames) const {}
804 virtual bool validateAsmConstraint(char c,
805 TargetInfo::ConstraintInfo &info) const {
806 return true;
807 }
808 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
809 unsigned &NumAliases) const {}
810 virtual bool useGlobalsForAutomaticVariables() const {return true;}
811 };
812}
813
Chris Lattner4b009652007-07-25 00:24:17 +0000814//===----------------------------------------------------------------------===//
815// Driver code
816//===----------------------------------------------------------------------===//
817
Ted Kremenekb97d7672007-12-04 17:07:35 +0000818static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000819 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
820 TT[4] == '-' && TT[1] - '3' < 6);
821}
822
Chris Lattnerfc457002008-03-05 01:18:20 +0000823/// CreateTargetInfo - Return the target info object for the specified target
824/// triple.
825TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000826 // OS detection; this isn't really anywhere near complete.
827 // Additions and corrections are welcome.
828 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000829 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000830 bool isSolaris = T.find("-solaris") != std::string::npos;
831 bool isLinux = T.find("-linux") != std::string::npos;
832 bool isWindows = T.find("-windows") != std::string::npos ||
833 T.find("-win32") != std::string::npos ||
834 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000835
Eli Friedman2b161652008-08-21 00:13:15 +0000836 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
837 if (isDarwin)
838 return new DarwinPPCTargetInfo(T);
839 return new PPC32TargetInfo(T);
840 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000841
Eli Friedman2b161652008-08-21 00:13:15 +0000842 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
843 if (isDarwin)
844 return new DarwinPPC64TargetInfo(T);
845 return new PPC64TargetInfo(T);
846 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000847
Eli Friedman2b161652008-08-21 00:13:15 +0000848 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
849 if (isDarwin)
850 return new DarwinARMTargetInfo(T);
851 return new ARMTargetInfo(T);
852 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000853
Eli Friedman2b161652008-08-21 00:13:15 +0000854 if (T.find("sparc-") == 0) {
855 if (isSolaris)
856 return new SolarisSparcV8TargetInfo(T);
857 return new SparcV8TargetInfo(T);
858 }
859
860 if (T.find("x86_64-") == 0) {
861 if (isDarwin)
862 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000863 if (isLinux)
864 return new LinuxX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000865 return new X86_64TargetInfo(T);
866 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000867
Chris Lattner85970f32008-05-08 05:58:21 +0000868 if (T.find("pic16-") == 0)
869 return new PIC16TargetInfo(T);
870
Eli Friedman2b161652008-08-21 00:13:15 +0000871 if (IsX86(T)) {
872 if (isDarwin)
873 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000874 if (isLinux)
875 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000876 if (isDragonFly)
877 return new DragonFlyX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +0000878 if (isWindows)
879 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000880 return new X86_32TargetInfo(T);
881 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000882
Chris Lattnerfc457002008-03-05 01:18:20 +0000883 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000884}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000885