blob: 430bb504beaf75f77f9cf5689ce5a32997f31919 [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"
Ted Kremenekb0615542007-12-03 22:06:55 +000020
Chris Lattner5ba61f02006-10-14 07:39:34 +000021using namespace clang;
22
Chris Lattner5ba61f02006-10-14 07:39:34 +000023//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000024// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000025//===----------------------------------------------------------------------===//
26
Chris Lattnerb2d486a2007-10-06 06:57:34 +000027static void Define(std::vector<char> &Buf, const char *Macro,
28 const char *Val = "1") {
29 const char *Def = "#define ";
30 Buf.insert(Buf.end(), Def, Def+strlen(Def));
31 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
32 Buf.push_back(' ');
33 Buf.insert(Buf.end(), Val, Val+strlen(Val));
34 Buf.push_back('\n');
35}
36
Eli Friedmanda8f5a92008-08-20 07:28:14 +000037static void getSolarisDefines(std::vector<char> &Defs) {
38 Define(Defs, "__SUN__");
39 Define(Defs, "__SOLARIS__");
40}
Chris Lattner5ba61f02006-10-14 07:39:34 +000041
Eli Friedman3fd920a2008-08-20 02:34:37 +000042static void getDarwinDefines(std::vector<char> &Defs) {
43 Define(Defs, "__APPLE__");
44 Define(Defs, "__MACH__");
45
46 if (0) // darwin_pascal_strings
47 Define(Defs, "__PASCAL_STRINGS__");
48}
Chris Lattner5ba61f02006-10-14 07:39:34 +000049
Chris Lattner1f5ad112006-10-14 18:32:12 +000050/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
51/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000052static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +000053 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000054 Define(Defs, "__ppc__");
55 Define(Defs, "_ARCH_PPC");
56 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +000057 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000058 Define(Defs, "_ARCH_PPC64");
59 Define(Defs, "_LP64");
60 Define(Defs, "__LP64__");
61 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +000062 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000063 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +000064 }
Chris Lattner1f5ad112006-10-14 18:32:12 +000065
Chris Lattner9c837532006-10-15 01:05:46 +000066 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000067 Define(Defs, "_BIG_ENDIAN");
68 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +000069
70 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000071 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
72 Define(Defs, "__INTMAX_TYPE__", "long int");
73 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
74 Define(Defs, "__PTRDIFF_TYPE__", "long int");
75 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +000076 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000077 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
78 Define(Defs, "__INTMAX_TYPE__", "long long int");
79 Define(Defs, "__LONG_MAX__", "2147483647L");
80 Define(Defs, "__PTRDIFF_TYPE__", "int");
81 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +000082 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +000083 Define(Defs, "__INT_MAX__", "2147483647");
84 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
85 Define(Defs, "__CHAR_BIT__", "8");
86 Define(Defs, "__SCHAR_MAX__", "127");
87 Define(Defs, "__SHRT_MAX__", "32767");
88 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +000089
90 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000091 Define(Defs, "__USER_LABEL_PREFIX__", "_");
92 Define(Defs, "__NATURAL_ALIGNMENT__");
93 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +000094
Chris Lattnerb2d486a2007-10-06 06:57:34 +000095 Define(Defs, "__WCHAR_MAX__", "2147483647");
96 Define(Defs, "__WCHAR_TYPE__", "int");
97 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +000098
99 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000100 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
101 Define(Defs, "__FLT_DIG__", "6");
102 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
103 Define(Defs, "__FLT_EVAL_METHOD__", "0");
104 Define(Defs, "__FLT_HAS_INFINITY__");
105 Define(Defs, "__FLT_HAS_QUIET_NAN__");
106 Define(Defs, "__FLT_MANT_DIG__", "24");
107 Define(Defs, "__FLT_MAX_10_EXP__", "38");
108 Define(Defs, "__FLT_MAX_EXP__", "128");
109 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
110 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
111 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
112 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
113 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000114
115 // double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000116 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
117 Define(Defs, "__DBL_DIG__", "15");
118 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
119 Define(Defs, "__DBL_HAS_INFINITY__");
120 Define(Defs, "__DBL_HAS_QUIET_NAN__");
121 Define(Defs, "__DBL_MANT_DIG__", "53");
122 Define(Defs, "__DBL_MAX_10_EXP__", "308");
123 Define(Defs, "__DBL_MAX_EXP__", "1024");
124 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
125 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
126 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
127 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
128 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner9c837532006-10-15 01:05:46 +0000129
130 // 128-bit long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000131 Define(Defs, "__LDBL_DENORM_MIN__",
132 "4.94065645841246544176568792868221e-324L");
133 Define(Defs, "__LDBL_DIG__", "31");
134 Define(Defs, "__LDBL_EPSILON__",
135 "4.94065645841246544176568792868221e-324L");
136 Define(Defs, "__LDBL_HAS_INFINITY__");
137 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
138 Define(Defs, "__LDBL_MANT_DIG__", "106");
139 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
140 Define(Defs, "__LDBL_MAX_EXP__", "1024");
141 Define(Defs, "__LDBL_MAX__",
142 "1.79769313486231580793728971405301e+308L");
143 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
144 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
145 Define(Defs, "__LDBL_MIN__",
146 "2.00416836000897277799610805135016e-292L");
147 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000148}
149
150/// getX86Defines - Return a set of the X86-specific #defines that are
151/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000152static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000153 // Target identification.
154 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000155 Define(Defs, "_LP64");
156 Define(Defs, "__LP64__");
157 Define(Defs, "__amd64__");
158 Define(Defs, "__amd64");
159 Define(Defs, "__x86_64");
160 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000161 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000162 Define(Defs, "__i386__");
163 Define(Defs, "__i386");
164 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000165 }
166
167 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000168 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000169
170 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000171 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
172 Define(Defs, "__INTMAX_TYPE__", "long int");
173 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
174 Define(Defs, "__PTRDIFF_TYPE__", "long int");
175 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000176 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000177 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
178 Define(Defs, "__INTMAX_TYPE__", "long long int");
179 Define(Defs, "__LONG_MAX__", "2147483647L");
180 Define(Defs, "__PTRDIFF_TYPE__", "int");
181 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000182 }
Anders Carlsson35a56362008-07-22 17:16:13 +0000183 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000184 Define(Defs, "__CHAR_BIT__", "8");
185 Define(Defs, "__INT_MAX__", "2147483647");
186 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
187 Define(Defs, "__SCHAR_MAX__", "127");
188 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner9c837532006-10-15 01:05:46 +0000189
190 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000191 Define(Defs, "__nocona");
192 Define(Defs, "__nocona__");
193 Define(Defs, "__tune_nocona__");
194 Define(Defs, "__SSE2_MATH__");
195 Define(Defs, "__SSE2__");
196 Define(Defs, "__SSE_MATH__");
197 Define(Defs, "__SSE__");
198 Define(Defs, "__MMX__");
199 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000200
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000201 Define(Defs, "__WCHAR_MAX__", "2147483647");
202 Define(Defs, "__WCHAR_TYPE__", "int");
203 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000204
205 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000206 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
207 Define(Defs, "__FLT_DIG__", "6");
208 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
209 Define(Defs, "__FLT_EVAL_METHOD__", "0");
210 Define(Defs, "__FLT_HAS_INFINITY__");
211 Define(Defs, "__FLT_HAS_QUIET_NAN__");
212 Define(Defs, "__FLT_MANT_DIG__", "24");
213 Define(Defs, "__FLT_MAX_10_EXP__", "38");
214 Define(Defs, "__FLT_MAX_EXP__", "128");
215 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
216 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
217 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
218 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
219 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000220
221 // Double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000222 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
223 Define(Defs, "__DBL_DIG__", "15");
224 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
225 Define(Defs, "__DBL_HAS_INFINITY__");
226 Define(Defs, "__DBL_HAS_QUIET_NAN__");
227 Define(Defs, "__DBL_MANT_DIG__", "53");
228 Define(Defs, "__DBL_MAX_10_EXP__", "308");
229 Define(Defs, "__DBL_MAX_EXP__", "1024");
230 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
231 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
232 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
233 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
234 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner9c837532006-10-15 01:05:46 +0000235
236 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000237 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
238 Define(Defs, "__LDBL_DIG__", "18");
239 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
240 Define(Defs, "__LDBL_HAS_INFINITY__");
241 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
242 Define(Defs, "__LDBL_MANT_DIG__", "64");
243 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
244 Define(Defs, "__LDBL_MAX_EXP__", "16384");
245 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
246 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
247 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
248 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000249}
250
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000251/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000252/// not tied to a specific subtarget.
253static void getARMDefines(std::vector<char> &Defs) {
254 // Target identification.
255 Define(Defs, "__arm");
256 Define(Defs, "__arm__");
257
258 // Target properties.
259 Define(Defs, "__LITTLE_ENDIAN__");
260
261 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
262 Define(Defs, "__INTMAX_TYPE__", "long long int");
263 Define(Defs, "__LONG_MAX__", "2147483647L");
264 Define(Defs, "__PTRDIFF_TYPE__", "int");
265 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
266 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
267
268 Define(Defs, "__CHAR_BIT__", "8");
269 Define(Defs, "__INT_MAX__", "2147483647");
270 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
271 Define(Defs, "__SCHAR_MAX__", "127");
272 Define(Defs, "__SHRT_MAX__", "32767");
273
274 // Subtarget options. [hard coded to v6 for now]
275 Define(Defs, "__ARM_ARCH_6K__");
276 Define(Defs, "__ARMEL__");
277 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
278
279 Define(Defs, "__WCHAR_MAX__", "2147483647");
280 Define(Defs, "__WCHAR_TYPE__", "int");
281 Define(Defs, "__WINT_TYPE__", "int");
282 Define(Defs, "__DECIMAL_DIG__", "17");
283 Define(Defs, "__FLT_RADIX__", "2");
284
285 // Float macros.
286 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
287 Define(Defs, "__FLT_DIG__", "6");
288 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
289 Define(Defs, "__FLT_EVAL_METHOD__", "0");
290 Define(Defs, "__FLT_HAS_INFINITY__");
291 Define(Defs, "__FLT_HAS_QUIET_NAN__");
292 Define(Defs, "__FLT_MANT_DIG__", "24");
293 Define(Defs, "__FLT_MAX_10_EXP__", "38");
294 Define(Defs, "__FLT_MAX_EXP__", "128");
295 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
296 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
297 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
298 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
299
300 // Double macros.
301 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
302 Define(Defs, "__DBL_DIG__", "15");
303 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
304 Define(Defs, "__DBL_HAS_INFINITY__");
305 Define(Defs, "__DBL_HAS_QUIET_NAN__");
306 Define(Defs, "__DBL_MANT_DIG__", "53");
307 Define(Defs, "__DBL_MAX_10_EXP__", "308");
308 Define(Defs, "__DBL_MAX_EXP__", "1024");
309 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
310 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
311 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
312 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
313
314 // 64-bit Long double macros (same as double).
315 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
316 Define(Defs, "__LDBL_DIG__", "15");
317 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
318 Define(Defs, "__LDBL_HAS_INFINITY__");
319 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
320 Define(Defs, "__LDBL_MANT_DIG__", "53");
321 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
322 Define(Defs, "__LDBL_MAX_EXP__", "1024");
323 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
324 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
325 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
326 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
327}
328
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000329//===----------------------------------------------------------------------===//
330// Specific target implementations.
331//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000332
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000333namespace {
334// PPC abstract base class
335class PPCTargetInfo : public TargetInfo {
336 static const Builtin::Info BuiltinInfo[];
337 static const char * const GCCRegNames[];
338 static const TargetInfo::GCCRegAlias GCCRegAliases[];
339
340public:
341 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
342 CharIsSigned = false;
343 }
344 virtual void getTargetBuiltins(const Builtin::Info *&Records,
345 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000346 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000347 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000348 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000349 virtual const char *getVAListDeclaration() const {
350 return "typedef struct __va_list_tag {"
351 " unsigned char gpr;"
352 " unsigned char fpr;"
353 " unsigned short reserved;"
354 " void* overflow_arg_area;"
355 " void* reg_save_area;"
356 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000357 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000358 virtual const char *getTargetPrefix() const {
359 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000360 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000361 virtual void getGCCRegNames(const char * const *&Names,
362 unsigned &NumNames) const;
363 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
364 unsigned &NumAliases) const;
365 virtual bool validateAsmConstraint(char c,
366 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000367 switch (c) {
368 default: return false;
369 case 'O': // Zero
370 return true;
371 case 'b': // Base register
372 case 'f': // Floating point register
373 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
374 return true;
375 }
376 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000377 virtual const char *getClobbers() const {
378 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000379 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000380};
Anders Carlssonf511f642007-11-27 04:11:28 +0000381
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000382const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
383#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
384#include "clang/AST/PPCBuiltins.def"
385};
Chris Lattner17df24e2008-04-21 18:56:49 +0000386
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000387const char * const PPCTargetInfo::GCCRegNames[] = {
388 "0", "1", "2", "3", "4", "5", "6", "7",
389 "8", "9", "10", "11", "12", "13", "14", "15",
390 "16", "17", "18", "19", "20", "21", "22", "23",
391 "24", "25", "26", "27", "28", "29", "30", "31",
392 "0", "1", "2", "3", "4", "5", "6", "7",
393 "8", "9", "10", "11", "12", "13", "14", "15",
394 "16", "17", "18", "19", "20", "21", "22", "23",
395 "24", "25", "26", "27", "28", "29", "30", "31",
396 "mq", "lr", "ctr", "ap",
397 "0", "1", "2", "3", "4", "5", "6", "7",
398 "xer",
399 "0", "1", "2", "3", "4", "5", "6", "7",
400 "8", "9", "10", "11", "12", "13", "14", "15",
401 "16", "17", "18", "19", "20", "21", "22", "23",
402 "24", "25", "26", "27", "28", "29", "30", "31",
403 "vrsave", "vscr",
404 "spe_acc", "spefscr",
405 "sfp"
406};
Chris Lattner10a5b382007-01-29 05:24:35 +0000407
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000408void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
409 unsigned &NumNames) const {
410 Names = GCCRegNames;
411 NumNames = llvm::array_lengthof(GCCRegNames);
412}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000413
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000414const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
415 // While some of these aliases do map to different registers
416 // they still share the same register name.
417 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
418 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
419 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
420 { { "cr3", "fr3", "r3", "v3"}, "3" },
421 { { "cr4", "fr4", "r4", "v4"}, "4" },
422 { { "cr5", "fr5", "r5", "v5"}, "5" },
423 { { "cr6", "fr6", "r6", "v6"}, "6" },
424 { { "cr7", "fr7", "r7", "v7"}, "7" },
425 { { "fr8", "r8", "v8"}, "8" },
426 { { "fr9", "r9", "v9"}, "9" },
427 { { "fr10", "r10", "v10"}, "10" },
428 { { "fr11", "r11", "v11"}, "11" },
429 { { "fr12", "r12", "v12"}, "12" },
430 { { "fr13", "r13", "v13"}, "13" },
431 { { "fr14", "r14", "v14"}, "14" },
432 { { "fr15", "r15", "v15"}, "15" },
433 { { "fr16", "r16", "v16"}, "16" },
434 { { "fr17", "r17", "v17"}, "17" },
435 { { "fr18", "r18", "v18"}, "18" },
436 { { "fr19", "r19", "v19"}, "19" },
437 { { "fr20", "r20", "v20"}, "20" },
438 { { "fr21", "r21", "v21"}, "21" },
439 { { "fr22", "r22", "v22"}, "22" },
440 { { "fr23", "r23", "v23"}, "23" },
441 { { "fr24", "r24", "v24"}, "24" },
442 { { "fr25", "r25", "v25"}, "25" },
443 { { "fr26", "r26", "v26"}, "26" },
444 { { "fr27", "r27", "v27"}, "27" },
445 { { "fr28", "r28", "v28"}, "28" },
446 { { "fr29", "r29", "v29"}, "29" },
447 { { "fr30", "r30", "v30"}, "30" },
448 { { "fr31", "r31", "v31"}, "31" },
449};
450
451void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
452 unsigned &NumAliases) const {
453 Aliases = GCCRegAliases;
454 NumAliases = llvm::array_lengthof(GCCRegAliases);
455}
456} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000457
Chris Lattner5ba61f02006-10-14 07:39:34 +0000458namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000459class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000460public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000461 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {}
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000462 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000463 getPowerPCDefines(Defines, false);
464 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000465};
466} // end anonymous namespace.
467
468namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000469class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000470public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000471 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000472 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
473 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000474 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000475 getPowerPCDefines(Defines, true);
476 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000477};
478} // end anonymous namespace.
479
480namespace {
481class DarwinPPCTargetInfo : public PPC32TargetInfo {
482public:
483 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
484 virtual void getTargetDefines(std::vector<char> &Defines) const {
485 PPC32TargetInfo::getTargetDefines(Defines);
486 getDarwinDefines(Defines);
Chris Lattner10a5b382007-01-29 05:24:35 +0000487 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000488};
489} // end anonymous namespace.
490
491namespace {
492class DarwinPPC64TargetInfo : public PPC64TargetInfo {
493public:
494 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
495 virtual void getTargetDefines(std::vector<char> &Defines) const {
496 PPC64TargetInfo::getTargetDefines(Defines);
497 getDarwinDefines(Defines);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000498 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000499};
500} // end anonymous namespace.
501
502namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000503// Namespace for x86 abstract base class
504const Builtin::Info BuiltinInfo[] = {
505#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
506#include "clang/AST/X86Builtins.def"
507};
Eli Friedmanb5366062008-05-20 14:21:01 +0000508
Eli Friedman3fd920a2008-08-20 02:34:37 +0000509const char *GCCRegNames[] = {
510 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
511 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
512 "argp", "flags", "fspr", "dirflag", "frame",
513 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
514 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
515 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
516 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
517};
518
519const TargetInfo::GCCRegAlias GCCRegAliases[] = {
520 { { "al", "ah", "eax", "rax" }, "ax" },
521 { { "bl", "bh", "ebx", "rbx" }, "bx" },
522 { { "cl", "ch", "ecx", "rcx" }, "cx" },
523 { { "dl", "dh", "edx", "rdx" }, "dx" },
524 { { "esi", "rsi" }, "si" },
525 { { "edi", "rdi" }, "di" },
526 { { "esp", "rsp" }, "sp" },
527 { { "ebp", "rbp" }, "bp" },
528};
529
530// X86 target abstract base class; x86-32 and x86-64 are very close, so
531// most of the implementation can be shared.
532class X86TargetInfo : public TargetInfo {
533public:
534 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
535 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000536 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000537 virtual void getTargetBuiltins(const Builtin::Info *&Records,
538 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000539 Records = BuiltinInfo;
540 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000541 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000542 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000543 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000544 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000545 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000546 unsigned &NumNames) const {
547 Names = GCCRegNames;
548 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000549 }
550 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
551 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000552 Aliases = GCCRegAliases;
553 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000554 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000555 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000556 TargetInfo::ConstraintInfo &info) const;
557 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000558 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000559 return "~{dirflag},~{fpsr},~{flags}";
560 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000561};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000562
563bool
564X86TargetInfo::validateAsmConstraint(char c,
565 TargetInfo::ConstraintInfo &info) const {
566 switch (c) {
567 default: return false;
568 case 'a': // eax.
569 case 'b': // ebx.
570 case 'c': // ecx.
571 case 'd': // edx.
572 case 'S': // esi.
573 case 'D': // edi.
574 case 'A': // edx:eax.
575 case 't': // top of floating point stack.
576 case 'u': // second from top of floating point stack.
577 case 'q': // Any register accessible as [r]l: a, b, c, and d.
578 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
579 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
580 // instructions.
581 case 'N': // unsigned 8-bit integer constant for use with in and out
582 // instructions.
583 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
584 return true;
585 }
586}
587
588std::string
589X86TargetInfo::convertConstraint(const char Constraint) const {
590 switch (Constraint) {
591 case 'a': return std::string("{ax}");
592 case 'b': return std::string("{bx}");
593 case 'c': return std::string("{cx}");
594 case 'd': return std::string("{dx}");
595 case 'S': return std::string("{si}");
596 case 'D': return std::string("{di}");
597 case 't': // top of floating point stack.
598 return std::string("{st}");
599 case 'u': // second from top of floating point stack.
600 return std::string("{st(1)}"); // second from top of floating point stack.
601 default:
602 return std::string(1, Constraint);
603 }
604}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000605} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000606
607namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000608// X86-32 generic target
609class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000610public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000611 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
612 DoubleAlign = LongLongAlign = 32;
613 LongDoubleWidth = 96;
614 LongDoubleAlign = 32;
615 }
616 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000617 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000618 }
619 virtual void getTargetDefines(std::vector<char> &Defines) const {
620 getX86Defines(Defines, false);
621 }
622};
623} // end anonymous namespace
624
625namespace {
626// x86-32 Darwin (OS X) target
627class DarwinI386TargetInfo : public X86_32TargetInfo {
628public:
629 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
630 LongDoubleWidth = 128;
631 LongDoubleAlign = 128;
632 }
633 virtual void getTargetDefines(std::vector<char> &Defines) const {
634 X86_32TargetInfo::getTargetDefines(Defines);
635 getDarwinDefines(Defines);
636 }
637};
638} // end anonymous namespace
639
640namespace {
641// x86-64 generic target
642class X86_64TargetInfo : public X86TargetInfo {
643public:
644 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000645 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000646 LongDoubleWidth = 128;
647 LongDoubleAlign = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +0000648 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000649 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000650 return "typedef struct __va_list_tag {"
651 " unsigned gp_offset;"
652 " unsigned fp_offset;"
653 " void* overflow_arg_area;"
654 " void* reg_save_area;"
655 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000656 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000657 virtual void getTargetDefines(std::vector<char> &Defines) const {
658 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000659 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000660};
661} // end anonymous namespace
662
663namespace {
664// x86-64 Darwin (OS X) target
665class DarwinX86_64TargetInfo : public X86_64TargetInfo {
666public:
667 DarwinX86_64TargetInfo(const std::string& triple) :
668 X86_64TargetInfo(triple) {}
669
670 virtual void getTargetDefines(std::vector<char> &Defines) const {
671 X86_64TargetInfo::getTargetDefines(Defines);
672 getDarwinDefines(Defines);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000673 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000674};
675} // end anonymous namespace.
676
Chris Lattner17df24e2008-04-21 18:56:49 +0000677namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000678class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000679public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000680 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
681 // FIXME: Are the defaults correct for ARM?
Eli Friedmanb5366062008-05-20 14:21:01 +0000682 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000683 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000684 getARMDefines(Defines);
685 }
686 virtual void getTargetBuiltins(const Builtin::Info *&Records,
687 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000688 // FIXME: Implement.
689 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000690 NumRecords = 0;
691 }
692 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000693 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000694 }
695 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000696 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000697 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000698 virtual void getGCCRegNames(const char * const *&Names,
699 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000700 // FIXME: Implement.
701 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000702 NumNames = 0;
703 }
704 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
705 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000706 // FIXME: Implement.
707 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000708 NumAliases = 0;
709 }
710 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000711 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000712 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000713 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000714 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000715 case 'l': // r0-r7
716 case 'h': // r8-r15
717 case 'w': // VFP Floating point register single precision
718 case 'P': // VFP Floating point register double precision
719 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
720 return true;
721 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000722 return false;
723 }
724 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000725 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000726 return "";
727 }
728};
729} // end anonymous namespace.
730
Eli Friedmanf05b7722008-08-20 07:44:10 +0000731
732namespace {
733class DarwinARMTargetInfo : public ARMTargetInfo {
734public:
735 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
736
737 virtual void getTargetDefines(std::vector<char> &Defines) const {
738 ARMTargetInfo::getTargetDefines(Defines);
739 getDarwinDefines(Defines);
740 }
741};
742} // end anonymous namespace.
743
Chris Lattner5ba61f02006-10-14 07:39:34 +0000744namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000745class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000746public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000747 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
748 // FIXME: Support Sparc quad-precision long double?
749 }
Gabor Greif49991682008-02-21 16:29:08 +0000750 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000751 // FIXME: This is missing a lot of important defines; some of the
752 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000753 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000754 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000755 Define(Defines, "__sparcv8");
756 }
757 virtual void getTargetBuiltins(const Builtin::Info *&Records,
758 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000759 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000760 }
761 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000762 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000763 }
764 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000765 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000766 }
767 virtual void getGCCRegNames(const char * const *&Names,
768 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000769 // FIXME: Implement!
770 Names = 0;
771 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000772 }
773 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
774 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000775 // FIXME: Implement!
776 Aliases = 0;
777 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000778 }
779 virtual bool validateAsmConstraint(char c,
780 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000781 // FIXME: Implement!
782 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000783 }
784 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000785 // FIXME: Implement!
786 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000787 }
788};
789
790} // end anonymous namespace.
791
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000792namespace {
793class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
794public:
795 SolarisSparcV8TargetInfo(const std::string& triple) :
796 SparcV8TargetInfo(triple) {}
797
798 virtual void getTargetDefines(std::vector<char> &Defines) const {
799 SparcV8TargetInfo::getTargetDefines(Defines);
800 getSolarisDefines(Defines);
801 }
802};
803} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000804
Chris Lattnerb781dc792008-05-08 05:58:21 +0000805namespace {
806 class PIC16TargetInfo : public TargetInfo{
807 public:
808 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000809 // FIXME: Is IntAlign really supposed to be 16? There seems
810 // little point on a platform with 8-bit loads.
811 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
812 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000813 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000814 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000815 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
816 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000817 virtual void getTargetDefines(std::vector<char> &Defines) const {
818 Define(Defines, "__pic16");
819 }
820 virtual void getTargetBuiltins(const Builtin::Info *&Records,
821 unsigned &NumRecords) const {}
822 virtual const char *getVAListDeclaration() const { return "";}
823 virtual const char *getClobbers() const {return "";}
824 virtual const char *getTargetPrefix() const {return "";}
825 virtual void getGCCRegNames(const char * const *&Names,
826 unsigned &NumNames) const {}
827 virtual bool validateAsmConstraint(char c,
828 TargetInfo::ConstraintInfo &info) const {
829 return true;
830 }
831 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
832 unsigned &NumAliases) const {}
833 virtual bool useGlobalsForAutomaticVariables() const {return true;}
834 };
835}
836
Chris Lattner5ba61f02006-10-14 07:39:34 +0000837//===----------------------------------------------------------------------===//
838// Driver code
839//===----------------------------------------------------------------------===//
840
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000841static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000842 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
843 TT[4] == '-' && TT[1] - '3' < 6);
844}
845
Chris Lattner855d0242008-03-05 01:18:20 +0000846/// CreateTargetInfo - Return the target info object for the specified target
847/// triple.
848TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner36021a92007-12-05 18:41:05 +0000849 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000850 return new DarwinPPCTargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000851
Chris Lattner855d0242008-03-05 01:18:20 +0000852 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000853 return new DarwinPPC64TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000854
Chris Lattner17df24e2008-04-21 18:56:49 +0000855 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
856 return new DarwinARMTargetInfo(T);
857
Chris Lattner855d0242008-03-05 01:18:20 +0000858 if (T.find("sparc-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000859 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedmanb5366062008-05-20 14:21:01 +0000860
Chris Lattner855d0242008-03-05 01:18:20 +0000861 if (T.find("x86_64-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000862 return new DarwinX86_64TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000863
Chris Lattnerb781dc792008-05-08 05:58:21 +0000864 if (T.find("pic16-") == 0)
865 return new PIC16TargetInfo(T);
866
Chris Lattner855d0242008-03-05 01:18:20 +0000867 if (IsX86(T))
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000868 return new DarwinI386TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000869
Chris Lattner855d0242008-03-05 01:18:20 +0000870 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000871}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000872