blob: 451c67f4e00127c1535c5ff8d8e31663e293334a [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 Lattnerb2d486a2007-10-06 06:57:34 +0000122 Define(Defs, "__WCHAR_MAX__", "2147483647");
123 Define(Defs, "__WCHAR_TYPE__", "int");
124 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000125
126 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000127 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
128 Define(Defs, "__FLT_DIG__", "6");
129 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
130 Define(Defs, "__FLT_EVAL_METHOD__", "0");
131 Define(Defs, "__FLT_HAS_INFINITY__");
132 Define(Defs, "__FLT_HAS_QUIET_NAN__");
133 Define(Defs, "__FLT_MANT_DIG__", "24");
134 Define(Defs, "__FLT_MAX_10_EXP__", "38");
135 Define(Defs, "__FLT_MAX_EXP__", "128");
136 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
137 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
138 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
139 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
140 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000141
142 // double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000143 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
144 Define(Defs, "__DBL_DIG__", "15");
145 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
146 Define(Defs, "__DBL_HAS_INFINITY__");
147 Define(Defs, "__DBL_HAS_QUIET_NAN__");
148 Define(Defs, "__DBL_MANT_DIG__", "53");
149 Define(Defs, "__DBL_MAX_10_EXP__", "308");
150 Define(Defs, "__DBL_MAX_EXP__", "1024");
151 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
152 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
153 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
154 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
155 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner9c837532006-10-15 01:05:46 +0000156
157 // 128-bit long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000158 Define(Defs, "__LDBL_DENORM_MIN__",
159 "4.94065645841246544176568792868221e-324L");
160 Define(Defs, "__LDBL_DIG__", "31");
161 Define(Defs, "__LDBL_EPSILON__",
162 "4.94065645841246544176568792868221e-324L");
163 Define(Defs, "__LDBL_HAS_INFINITY__");
164 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
165 Define(Defs, "__LDBL_MANT_DIG__", "106");
166 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
167 Define(Defs, "__LDBL_MAX_EXP__", "1024");
168 Define(Defs, "__LDBL_MAX__",
169 "1.79769313486231580793728971405301e+308L");
170 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
171 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
172 Define(Defs, "__LDBL_MIN__",
173 "2.00416836000897277799610805135016e-292L");
174 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000175}
176
177/// getX86Defines - Return a set of the X86-specific #defines that are
178/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000179static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000180 // Target identification.
181 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000182 Define(Defs, "_LP64");
183 Define(Defs, "__LP64__");
184 Define(Defs, "__amd64__");
185 Define(Defs, "__amd64");
186 Define(Defs, "__x86_64");
187 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000188 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000189 Define(Defs, "__i386__");
190 Define(Defs, "__i386");
191 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000192 }
193
194 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000195 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000196
Chris Lattner9c837532006-10-15 01:05:46 +0000197 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000198 Define(Defs, "__nocona");
199 Define(Defs, "__nocona__");
200 Define(Defs, "__tune_nocona__");
201 Define(Defs, "__SSE2_MATH__");
202 Define(Defs, "__SSE2__");
203 Define(Defs, "__SSE_MATH__");
204 Define(Defs, "__SSE__");
205 Define(Defs, "__MMX__");
206 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000207
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000208 Define(Defs, "__WCHAR_MAX__", "2147483647");
209 Define(Defs, "__WCHAR_TYPE__", "int");
210 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000211
212 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000213 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
214 Define(Defs, "__FLT_DIG__", "6");
215 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
216 Define(Defs, "__FLT_EVAL_METHOD__", "0");
217 Define(Defs, "__FLT_HAS_INFINITY__");
218 Define(Defs, "__FLT_HAS_QUIET_NAN__");
219 Define(Defs, "__FLT_MANT_DIG__", "24");
220 Define(Defs, "__FLT_MAX_10_EXP__", "38");
221 Define(Defs, "__FLT_MAX_EXP__", "128");
222 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
223 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
224 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
225 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
226 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000227
228 // Double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000229 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
230 Define(Defs, "__DBL_DIG__", "15");
231 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
232 Define(Defs, "__DBL_HAS_INFINITY__");
233 Define(Defs, "__DBL_HAS_QUIET_NAN__");
234 Define(Defs, "__DBL_MANT_DIG__", "53");
235 Define(Defs, "__DBL_MAX_10_EXP__", "308");
236 Define(Defs, "__DBL_MAX_EXP__", "1024");
237 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
238 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
239 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
240 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
241 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner9c837532006-10-15 01:05:46 +0000242
243 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000244 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
245 Define(Defs, "__LDBL_DIG__", "18");
246 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
247 Define(Defs, "__LDBL_HAS_INFINITY__");
248 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
249 Define(Defs, "__LDBL_MANT_DIG__", "64");
250 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
251 Define(Defs, "__LDBL_MAX_EXP__", "16384");
252 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
253 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
254 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
255 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000256}
257
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000258/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000259/// not tied to a specific subtarget.
260static void getARMDefines(std::vector<char> &Defs) {
261 // Target identification.
262 Define(Defs, "__arm");
263 Define(Defs, "__arm__");
264
265 // Target properties.
266 Define(Defs, "__LITTLE_ENDIAN__");
267
Chris Lattner17df24e2008-04-21 18:56:49 +0000268 // Subtarget options. [hard coded to v6 for now]
269 Define(Defs, "__ARM_ARCH_6K__");
270 Define(Defs, "__ARMEL__");
271 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
272
273 Define(Defs, "__WCHAR_MAX__", "2147483647");
274 Define(Defs, "__WCHAR_TYPE__", "int");
275 Define(Defs, "__WINT_TYPE__", "int");
276 Define(Defs, "__DECIMAL_DIG__", "17");
277 Define(Defs, "__FLT_RADIX__", "2");
278
279 // Float macros.
280 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
281 Define(Defs, "__FLT_DIG__", "6");
282 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
283 Define(Defs, "__FLT_EVAL_METHOD__", "0");
284 Define(Defs, "__FLT_HAS_INFINITY__");
285 Define(Defs, "__FLT_HAS_QUIET_NAN__");
286 Define(Defs, "__FLT_MANT_DIG__", "24");
287 Define(Defs, "__FLT_MAX_10_EXP__", "38");
288 Define(Defs, "__FLT_MAX_EXP__", "128");
289 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
290 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
291 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
292 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
293
294 // Double macros.
295 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
296 Define(Defs, "__DBL_DIG__", "15");
297 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
298 Define(Defs, "__DBL_HAS_INFINITY__");
299 Define(Defs, "__DBL_HAS_QUIET_NAN__");
300 Define(Defs, "__DBL_MANT_DIG__", "53");
301 Define(Defs, "__DBL_MAX_10_EXP__", "308");
302 Define(Defs, "__DBL_MAX_EXP__", "1024");
303 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
304 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
305 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
306 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
307
308 // 64-bit Long double macros (same as double).
309 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
310 Define(Defs, "__LDBL_DIG__", "15");
311 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
312 Define(Defs, "__LDBL_HAS_INFINITY__");
313 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
314 Define(Defs, "__LDBL_MANT_DIG__", "53");
315 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
316 Define(Defs, "__LDBL_MAX_EXP__", "1024");
317 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
318 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
319 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
320 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
321}
322
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000323//===----------------------------------------------------------------------===//
324// Specific target implementations.
325//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000326
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000327namespace {
328// PPC abstract base class
329class PPCTargetInfo : public TargetInfo {
330 static const Builtin::Info BuiltinInfo[];
331 static const char * const GCCRegNames[];
332 static const TargetInfo::GCCRegAlias GCCRegAliases[];
333
334public:
335 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
336 CharIsSigned = false;
337 }
338 virtual void getTargetBuiltins(const Builtin::Info *&Records,
339 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000340 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000341 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000342 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000343 virtual const char *getVAListDeclaration() const {
344 return "typedef struct __va_list_tag {"
345 " unsigned char gpr;"
346 " unsigned char fpr;"
347 " unsigned short reserved;"
348 " void* overflow_arg_area;"
349 " void* reg_save_area;"
350 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000351 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000352 virtual const char *getTargetPrefix() const {
353 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000354 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000355 virtual void getGCCRegNames(const char * const *&Names,
356 unsigned &NumNames) const;
357 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
358 unsigned &NumAliases) const;
359 virtual bool validateAsmConstraint(char c,
360 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000361 switch (c) {
362 default: return false;
363 case 'O': // Zero
364 return true;
365 case 'b': // Base register
366 case 'f': // Floating point register
367 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
368 return true;
369 }
370 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000371 virtual const char *getClobbers() const {
372 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000373 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000374};
Anders Carlssonf511f642007-11-27 04:11:28 +0000375
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000376const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
377#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
378#include "clang/AST/PPCBuiltins.def"
379};
Chris Lattner17df24e2008-04-21 18:56:49 +0000380
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000381const char * const PPCTargetInfo::GCCRegNames[] = {
382 "0", "1", "2", "3", "4", "5", "6", "7",
383 "8", "9", "10", "11", "12", "13", "14", "15",
384 "16", "17", "18", "19", "20", "21", "22", "23",
385 "24", "25", "26", "27", "28", "29", "30", "31",
386 "0", "1", "2", "3", "4", "5", "6", "7",
387 "8", "9", "10", "11", "12", "13", "14", "15",
388 "16", "17", "18", "19", "20", "21", "22", "23",
389 "24", "25", "26", "27", "28", "29", "30", "31",
390 "mq", "lr", "ctr", "ap",
391 "0", "1", "2", "3", "4", "5", "6", "7",
392 "xer",
393 "0", "1", "2", "3", "4", "5", "6", "7",
394 "8", "9", "10", "11", "12", "13", "14", "15",
395 "16", "17", "18", "19", "20", "21", "22", "23",
396 "24", "25", "26", "27", "28", "29", "30", "31",
397 "vrsave", "vscr",
398 "spe_acc", "spefscr",
399 "sfp"
400};
Chris Lattner10a5b382007-01-29 05:24:35 +0000401
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000402void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
403 unsigned &NumNames) const {
404 Names = GCCRegNames;
405 NumNames = llvm::array_lengthof(GCCRegNames);
406}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000407
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000408const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
409 // While some of these aliases do map to different registers
410 // they still share the same register name.
411 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
412 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
413 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
414 { { "cr3", "fr3", "r3", "v3"}, "3" },
415 { { "cr4", "fr4", "r4", "v4"}, "4" },
416 { { "cr5", "fr5", "r5", "v5"}, "5" },
417 { { "cr6", "fr6", "r6", "v6"}, "6" },
418 { { "cr7", "fr7", "r7", "v7"}, "7" },
419 { { "fr8", "r8", "v8"}, "8" },
420 { { "fr9", "r9", "v9"}, "9" },
421 { { "fr10", "r10", "v10"}, "10" },
422 { { "fr11", "r11", "v11"}, "11" },
423 { { "fr12", "r12", "v12"}, "12" },
424 { { "fr13", "r13", "v13"}, "13" },
425 { { "fr14", "r14", "v14"}, "14" },
426 { { "fr15", "r15", "v15"}, "15" },
427 { { "fr16", "r16", "v16"}, "16" },
428 { { "fr17", "r17", "v17"}, "17" },
429 { { "fr18", "r18", "v18"}, "18" },
430 { { "fr19", "r19", "v19"}, "19" },
431 { { "fr20", "r20", "v20"}, "20" },
432 { { "fr21", "r21", "v21"}, "21" },
433 { { "fr22", "r22", "v22"}, "22" },
434 { { "fr23", "r23", "v23"}, "23" },
435 { { "fr24", "r24", "v24"}, "24" },
436 { { "fr25", "r25", "v25"}, "25" },
437 { { "fr26", "r26", "v26"}, "26" },
438 { { "fr27", "r27", "v27"}, "27" },
439 { { "fr28", "r28", "v28"}, "28" },
440 { { "fr29", "r29", "v29"}, "29" },
441 { { "fr30", "r30", "v30"}, "30" },
442 { { "fr31", "r31", "v31"}, "31" },
443};
444
445void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
446 unsigned &NumAliases) const {
447 Aliases = GCCRegAliases;
448 NumAliases = llvm::array_lengthof(GCCRegAliases);
449}
450} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000451
Chris Lattner5ba61f02006-10-14 07:39:34 +0000452namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000453class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000454public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000455 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
456 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
457 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
458 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000459 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000460 getPowerPCDefines(Defines, false);
461 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000462};
463} // end anonymous namespace.
464
465namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000466class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000467public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000468 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000469 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000470 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
471 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000472 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000473 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000474 getPowerPCDefines(Defines, true);
475 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000476};
477} // end anonymous namespace.
478
479namespace {
480class DarwinPPCTargetInfo : public PPC32TargetInfo {
481public:
482 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
483 virtual void getTargetDefines(std::vector<char> &Defines) const {
484 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000485 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000486 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000487
488 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000489};
490} // end anonymous namespace.
491
492namespace {
493class DarwinPPC64TargetInfo : public PPC64TargetInfo {
494public:
495 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
496 virtual void getTargetDefines(std::vector<char> &Defines) const {
497 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000498 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000499 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000500
501 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000502};
503} // end anonymous namespace.
504
505namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000506// Namespace for x86 abstract base class
507const Builtin::Info BuiltinInfo[] = {
508#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
509#include "clang/AST/X86Builtins.def"
510};
Eli Friedmanb5366062008-05-20 14:21:01 +0000511
Eli Friedman3fd920a2008-08-20 02:34:37 +0000512const char *GCCRegNames[] = {
513 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
514 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
515 "argp", "flags", "fspr", "dirflag", "frame",
516 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
517 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
518 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
519 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
520};
521
522const TargetInfo::GCCRegAlias GCCRegAliases[] = {
523 { { "al", "ah", "eax", "rax" }, "ax" },
524 { { "bl", "bh", "ebx", "rbx" }, "bx" },
525 { { "cl", "ch", "ecx", "rcx" }, "cx" },
526 { { "dl", "dh", "edx", "rdx" }, "dx" },
527 { { "esi", "rsi" }, "si" },
528 { { "edi", "rdi" }, "di" },
529 { { "esp", "rsp" }, "sp" },
530 { { "ebp", "rbp" }, "bp" },
531};
532
533// X86 target abstract base class; x86-32 and x86-64 are very close, so
534// most of the implementation can be shared.
535class X86TargetInfo : public TargetInfo {
536public:
537 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
538 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000539 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000540 virtual void getTargetBuiltins(const Builtin::Info *&Records,
541 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000542 Records = BuiltinInfo;
543 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000544 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000545 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000546 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000547 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000548 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000549 unsigned &NumNames) const {
550 Names = GCCRegNames;
551 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000552 }
553 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
554 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000555 Aliases = GCCRegAliases;
556 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000557 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000558 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000559 TargetInfo::ConstraintInfo &info) const;
560 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000561 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000562 return "~{dirflag},~{fpsr},~{flags}";
563 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000564};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000565
566bool
567X86TargetInfo::validateAsmConstraint(char c,
568 TargetInfo::ConstraintInfo &info) const {
569 switch (c) {
570 default: return false;
571 case 'a': // eax.
572 case 'b': // ebx.
573 case 'c': // ecx.
574 case 'd': // edx.
575 case 'S': // esi.
576 case 'D': // edi.
577 case 'A': // edx:eax.
578 case 't': // top of floating point stack.
579 case 'u': // second from top of floating point stack.
580 case 'q': // Any register accessible as [r]l: a, b, c, and d.
581 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
582 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
583 // instructions.
584 case 'N': // unsigned 8-bit integer constant for use with in and out
585 // instructions.
586 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
587 return true;
588 }
589}
590
591std::string
592X86TargetInfo::convertConstraint(const char Constraint) const {
593 switch (Constraint) {
594 case 'a': return std::string("{ax}");
595 case 'b': return std::string("{bx}");
596 case 'c': return std::string("{cx}");
597 case 'd': return std::string("{dx}");
598 case 'S': return std::string("{si}");
599 case 'D': return std::string("{di}");
600 case 't': // top of floating point stack.
601 return std::string("{st}");
602 case 'u': // second from top of floating point stack.
603 return std::string("{st(1)}"); // second from top of floating point stack.
604 default:
605 return std::string(1, Constraint);
606 }
607}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000608} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000609
610namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000611// X86-32 generic target
612class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000613public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000614 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
615 DoubleAlign = LongLongAlign = 32;
616 LongDoubleWidth = 96;
617 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000618 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
619 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
620 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000621 }
622 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000623 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000624 }
625 virtual void getTargetDefines(std::vector<char> &Defines) const {
626 getX86Defines(Defines, false);
627 }
628};
629} // end anonymous namespace
630
631namespace {
632// x86-32 Darwin (OS X) target
633class DarwinI386TargetInfo : public X86_32TargetInfo {
634public:
635 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
636 LongDoubleWidth = 128;
637 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000638 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
639 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
640 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000641 }
642 virtual void getTargetDefines(std::vector<char> &Defines) const {
643 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000644 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000645 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000646 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000647};
648} // end anonymous namespace
649
650namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000651// x86-32 DragonFly target
652class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
653public:
654 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
655 }
656 virtual void getTargetDefines(std::vector<char> &Defines) const {
657 X86_32TargetInfo::getTargetDefines(Defines);
658 getDragonFlyDefines(Defines);
659 }
660};
661} // end anonymous namespace
662
663namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000664// x86-32 Linux target
665class LinuxX86_32TargetInfo : public X86_32TargetInfo {
666public:
667 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000668 UserLabelPrefix = "";
Eli Friedmanff594f22008-08-21 00:24:02 +0000669 }
670 virtual void getTargetDefines(std::vector<char> &Defines) const {
671 X86_32TargetInfo::getTargetDefines(Defines);
672 getLinuxDefines(Defines);
673 }
674};
675} // end anonymous namespace
676
677namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000678// x86-32 Windows target
679class WindowsX86_32TargetInfo : public X86_32TargetInfo {
680public:
681 WindowsX86_32TargetInfo(const std::string& triple)
682 : X86_32TargetInfo(triple) {
683 // FIXME: Fix wchar_t.
684 // FIXME: We should probably enable -fms-extensions by default for
685 // this target.
686 }
687 virtual void getTargetDefines(std::vector<char> &Defines) const {
688 X86_32TargetInfo::getTargetDefines(Defines);
689 // This list is based off of the the list of things MingW defines
690 Define(Defines, "__WIN32__");
691 Define(Defines, "__WIN32");
692 Define(Defines, "_WIN32");
693 Define(Defines, "WIN32");
694 Define(Defines, "__WINNT__");
695 Define(Defines, "__WINNT");
696 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000697 Define(Defines, "_X86_");
698 Define(Defines, "__MSVCRT__");
699 }
700};
701} // end anonymous namespace
702
703namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000704// x86-64 generic target
705class X86_64TargetInfo : public X86TargetInfo {
706public:
707 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000708 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000709 LongDoubleWidth = 128;
710 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000711 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
712 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
713 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000714 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000715 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000716 return "typedef struct __va_list_tag {"
717 " unsigned gp_offset;"
718 " unsigned fp_offset;"
719 " void* overflow_arg_area;"
720 " void* reg_save_area;"
721 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000722 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000723 virtual void getTargetDefines(std::vector<char> &Defines) const {
724 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000725 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000726};
727} // end anonymous namespace
728
729namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000730// x86-64 Linux target
731class LinuxX86_64TargetInfo : public X86_64TargetInfo {
732public:
733 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000734 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000735 }
736 virtual void getTargetDefines(std::vector<char> &Defines) const {
737 X86_64TargetInfo::getTargetDefines(Defines);
738 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000739 }
740};
741} // end anonymous namespace
742
743namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000744// x86-64 Darwin (OS X) target
745class DarwinX86_64TargetInfo : public X86_64TargetInfo {
746public:
747 DarwinX86_64TargetInfo(const std::string& triple) :
748 X86_64TargetInfo(triple) {}
749
750 virtual void getTargetDefines(std::vector<char> &Defines) const {
751 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000752 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000753 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000754
755 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000756};
757} // end anonymous namespace.
758
Chris Lattner17df24e2008-04-21 18:56:49 +0000759namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000760class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000761public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000762 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
763 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000764 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
765 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000766 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000767 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000768 getARMDefines(Defines);
769 }
770 virtual void getTargetBuiltins(const Builtin::Info *&Records,
771 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000772 // FIXME: Implement.
773 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000774 NumRecords = 0;
775 }
776 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000777 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000778 }
779 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000780 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000781 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000782 virtual void getGCCRegNames(const char * const *&Names,
783 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000784 // FIXME: Implement.
785 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000786 NumNames = 0;
787 }
788 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
789 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000790 // FIXME: Implement.
791 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000792 NumAliases = 0;
793 }
794 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000795 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000796 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000797 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000798 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000799 case 'l': // r0-r7
800 case 'h': // r8-r15
801 case 'w': // VFP Floating point register single precision
802 case 'P': // VFP Floating point register double precision
803 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
804 return true;
805 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000806 return false;
807 }
808 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000809 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000810 return "";
811 }
812};
813} // end anonymous namespace.
814
Eli Friedmanf05b7722008-08-20 07:44:10 +0000815
816namespace {
817class DarwinARMTargetInfo : public ARMTargetInfo {
818public:
819 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
820
821 virtual void getTargetDefines(std::vector<char> &Defines) const {
822 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000823 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000824 }
825};
826} // end anonymous namespace.
827
Chris Lattner5ba61f02006-10-14 07:39:34 +0000828namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000829class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000830public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000831 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
832 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000833 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
834 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000835 }
Gabor Greif49991682008-02-21 16:29:08 +0000836 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000837 // FIXME: This is missing a lot of important defines; some of the
838 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000839 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000840 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000841 Define(Defines, "__sparcv8");
842 }
843 virtual void getTargetBuiltins(const Builtin::Info *&Records,
844 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000845 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000846 }
847 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000848 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000849 }
850 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000851 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000852 }
853 virtual void getGCCRegNames(const char * const *&Names,
854 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000855 // FIXME: Implement!
856 Names = 0;
857 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000858 }
859 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
860 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000861 // FIXME: Implement!
862 Aliases = 0;
863 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000864 }
865 virtual bool validateAsmConstraint(char c,
866 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000867 // FIXME: Implement!
868 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000869 }
870 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000871 // FIXME: Implement!
872 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000873 }
874};
875
876} // end anonymous namespace.
877
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000878namespace {
879class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
880public:
881 SolarisSparcV8TargetInfo(const std::string& triple) :
882 SparcV8TargetInfo(triple) {}
883
884 virtual void getTargetDefines(std::vector<char> &Defines) const {
885 SparcV8TargetInfo::getTargetDefines(Defines);
886 getSolarisDefines(Defines);
887 }
888};
889} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000890
Chris Lattnerb781dc792008-05-08 05:58:21 +0000891namespace {
892 class PIC16TargetInfo : public TargetInfo{
893 public:
894 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000895 // FIXME: Is IntAlign really supposed to be 16? There seems
896 // little point on a platform with 8-bit loads.
897 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner6512a882008-10-05 20:06:37 +0000898 LongWidth = 16;
Eli Friedmanb5366062008-05-20 14:21:01 +0000899 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000900 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000901 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000902 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
903 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000904 virtual void getTargetDefines(std::vector<char> &Defines) const {
905 Define(Defines, "__pic16");
906 }
907 virtual void getTargetBuiltins(const Builtin::Info *&Records,
908 unsigned &NumRecords) const {}
909 virtual const char *getVAListDeclaration() const { return "";}
910 virtual const char *getClobbers() const {return "";}
911 virtual const char *getTargetPrefix() const {return "";}
912 virtual void getGCCRegNames(const char * const *&Names,
913 unsigned &NumNames) const {}
914 virtual bool validateAsmConstraint(char c,
915 TargetInfo::ConstraintInfo &info) const {
916 return true;
917 }
918 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
919 unsigned &NumAliases) const {}
920 virtual bool useGlobalsForAutomaticVariables() const {return true;}
921 };
922}
923
Chris Lattner5ba61f02006-10-14 07:39:34 +0000924//===----------------------------------------------------------------------===//
925// Driver code
926//===----------------------------------------------------------------------===//
927
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000928static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000929 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
930 TT[4] == '-' && TT[1] - '3' < 6);
931}
932
Chris Lattner855d0242008-03-05 01:18:20 +0000933/// CreateTargetInfo - Return the target info object for the specified target
934/// triple.
935TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000936 // OS detection; this isn't really anywhere near complete.
937 // Additions and corrections are welcome.
938 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000939 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000940 bool isSolaris = T.find("-solaris") != std::string::npos;
941 bool isLinux = T.find("-linux") != std::string::npos;
942 bool isWindows = T.find("-windows") != std::string::npos ||
943 T.find("-win32") != std::string::npos ||
944 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000945
Eli Friedman873f65a2008-08-21 00:13:15 +0000946 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
947 if (isDarwin)
948 return new DarwinPPCTargetInfo(T);
949 return new PPC32TargetInfo(T);
950 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000951
Eli Friedman873f65a2008-08-21 00:13:15 +0000952 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
953 if (isDarwin)
954 return new DarwinPPC64TargetInfo(T);
955 return new PPC64TargetInfo(T);
956 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000957
Eli Friedman873f65a2008-08-21 00:13:15 +0000958 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
959 if (isDarwin)
960 return new DarwinARMTargetInfo(T);
961 return new ARMTargetInfo(T);
962 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000963
Eli Friedman873f65a2008-08-21 00:13:15 +0000964 if (T.find("sparc-") == 0) {
965 if (isSolaris)
966 return new SolarisSparcV8TargetInfo(T);
967 return new SparcV8TargetInfo(T);
968 }
969
970 if (T.find("x86_64-") == 0) {
971 if (isDarwin)
972 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000973 if (isLinux)
974 return new LinuxX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000975 return new X86_64TargetInfo(T);
976 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000977
Chris Lattnerb781dc792008-05-08 05:58:21 +0000978 if (T.find("pic16-") == 0)
979 return new PIC16TargetInfo(T);
980
Eli Friedman873f65a2008-08-21 00:13:15 +0000981 if (IsX86(T)) {
982 if (isDarwin)
983 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000984 if (isLinux)
985 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000986 if (isDragonFly)
987 return new DragonFlyX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000988 if (isWindows)
989 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000990 return new X86_32TargetInfo(T);
991 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000992
Chris Lattner855d0242008-03-05 01:18:20 +0000993 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000994}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000995