blob: 6139f9d9e09cf237d20cb159654dfc095a05a43f [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"
Ted Kremenek40499482007-12-03 22:06:55 +000020
Chris Lattner4b009652007-07-25 00:24:17 +000021using namespace clang;
22
Chris Lattner4b009652007-07-25 00:24:17 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattner0db667a2007-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 Friedmanff158dd2008-08-20 07:28:14 +000037static void getSolarisDefines(std::vector<char> &Defs) {
38 Define(Defs, "__SUN__");
39 Define(Defs, "__SOLARIS__");
40}
Chris Lattner4b009652007-07-25 00:24:17 +000041
Eli Friedman872996c2008-08-20 02:34:37 +000042static void getDarwinDefines(std::vector<char> &Defs) {
43 Define(Defs, "__APPLE__");
44 Define(Defs, "__MACH__");
Chris Lattnerbcd60db2008-09-30 00:46:39 +000045 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1050");
46
Eli Friedman872996c2008-08-20 02:34:37 +000047 if (0) // darwin_pascal_strings
48 Define(Defs, "__PASCAL_STRINGS__");
49}
Chris Lattner4b009652007-07-25 00:24:17 +000050
Chris Lattnerd4faca42008-08-23 18:23:14 +000051static void getDragonFlyDefines(std::vector<char> &Defs) {
52 // DragonFly defines; list based off of gcc output
53 Define(Defs, "__DragonFly__");
54 Define(Defs, "__DragonFly_cc_version", "100001");
55 Define(Defs, "__ELF__");
56 Define(Defs, "__KPRINTF_ATTRIBUTE__");
57 Define(Defs, "__tune_i386__");
58 Define(Defs, "unix");
59 Define(Defs, "__unix");
60 Define(Defs, "__unix__");
61}
62
Eli Friedman5fb0a022008-08-21 00:24:02 +000063static void getLinuxDefines(std::vector<char> &Defs) {
64 // Linux defines; list based off of gcc output
65 Define(Defs, "__unix__");
66 Define(Defs, "__unix");
67 Define(Defs, "unix");
68 Define(Defs, "__linux__");
69 Define(Defs, "__linux");
70 Define(Defs, "linux");
71 Define(Defs, "__gnu_linux__");
72}
73
Chris Lattner4b009652007-07-25 00:24:17 +000074/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
75/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +000076static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +000077 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +000078 Define(Defs, "__ppc__");
79 Define(Defs, "_ARCH_PPC");
80 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +000081 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000082 Define(Defs, "_ARCH_PPC64");
83 Define(Defs, "_LP64");
84 Define(Defs, "__LP64__");
85 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +000086 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000087 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +000088 }
89
90 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +000091 Define(Defs, "_BIG_ENDIAN");
92 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +000093
94 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000095 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
96 Define(Defs, "__INTMAX_TYPE__", "long int");
97 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
98 Define(Defs, "__PTRDIFF_TYPE__", "long int");
99 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000100 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000101 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
102 Define(Defs, "__INTMAX_TYPE__", "long long int");
103 Define(Defs, "__LONG_MAX__", "2147483647L");
104 Define(Defs, "__PTRDIFF_TYPE__", "int");
105 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000106 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000107 Define(Defs, "__INT_MAX__", "2147483647");
108 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
109 Define(Defs, "__CHAR_BIT__", "8");
110 Define(Defs, "__SCHAR_MAX__", "127");
111 Define(Defs, "__SHRT_MAX__", "32767");
112 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000113
114 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000115 Define(Defs, "__USER_LABEL_PREFIX__", "_");
116 Define(Defs, "__NATURAL_ALIGNMENT__");
117 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000118
Chris Lattner0db667a2007-10-06 06:57:34 +0000119 Define(Defs, "__WCHAR_MAX__", "2147483647");
120 Define(Defs, "__WCHAR_TYPE__", "int");
121 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000122
123 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000124 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
125 Define(Defs, "__FLT_DIG__", "6");
126 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
127 Define(Defs, "__FLT_EVAL_METHOD__", "0");
128 Define(Defs, "__FLT_HAS_INFINITY__");
129 Define(Defs, "__FLT_HAS_QUIET_NAN__");
130 Define(Defs, "__FLT_MANT_DIG__", "24");
131 Define(Defs, "__FLT_MAX_10_EXP__", "38");
132 Define(Defs, "__FLT_MAX_EXP__", "128");
133 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
134 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
135 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
136 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
137 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000138
139 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000140 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
141 Define(Defs, "__DBL_DIG__", "15");
142 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
143 Define(Defs, "__DBL_HAS_INFINITY__");
144 Define(Defs, "__DBL_HAS_QUIET_NAN__");
145 Define(Defs, "__DBL_MANT_DIG__", "53");
146 Define(Defs, "__DBL_MAX_10_EXP__", "308");
147 Define(Defs, "__DBL_MAX_EXP__", "1024");
148 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
149 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
150 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
151 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
152 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000153
154 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000155 Define(Defs, "__LDBL_DENORM_MIN__",
156 "4.94065645841246544176568792868221e-324L");
157 Define(Defs, "__LDBL_DIG__", "31");
158 Define(Defs, "__LDBL_EPSILON__",
159 "4.94065645841246544176568792868221e-324L");
160 Define(Defs, "__LDBL_HAS_INFINITY__");
161 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
162 Define(Defs, "__LDBL_MANT_DIG__", "106");
163 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
164 Define(Defs, "__LDBL_MAX_EXP__", "1024");
165 Define(Defs, "__LDBL_MAX__",
166 "1.79769313486231580793728971405301e+308L");
167 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
168 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
169 Define(Defs, "__LDBL_MIN__",
170 "2.00416836000897277799610805135016e-292L");
171 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000172}
173
174/// getX86Defines - Return a set of the X86-specific #defines that are
175/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000176static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000177 // Target identification.
178 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000179 Define(Defs, "_LP64");
180 Define(Defs, "__LP64__");
181 Define(Defs, "__amd64__");
182 Define(Defs, "__amd64");
183 Define(Defs, "__x86_64");
184 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000185 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000186 Define(Defs, "__i386__");
187 Define(Defs, "__i386");
188 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000189 }
190
191 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000192 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000193
194 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000195 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
196 Define(Defs, "__INTMAX_TYPE__", "long int");
197 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
198 Define(Defs, "__PTRDIFF_TYPE__", "long int");
199 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000200 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000201 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
202 Define(Defs, "__INTMAX_TYPE__", "long long int");
203 Define(Defs, "__LONG_MAX__", "2147483647L");
204 Define(Defs, "__PTRDIFF_TYPE__", "int");
205 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000206 }
Anders Carlsson82b26282008-07-22 17:16:13 +0000207 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner0db667a2007-10-06 06:57:34 +0000208 Define(Defs, "__CHAR_BIT__", "8");
209 Define(Defs, "__INT_MAX__", "2147483647");
210 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
211 Define(Defs, "__SCHAR_MAX__", "127");
212 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner4b009652007-07-25 00:24:17 +0000213
214 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000215 Define(Defs, "__nocona");
216 Define(Defs, "__nocona__");
217 Define(Defs, "__tune_nocona__");
218 Define(Defs, "__SSE2_MATH__");
219 Define(Defs, "__SSE2__");
220 Define(Defs, "__SSE_MATH__");
221 Define(Defs, "__SSE__");
222 Define(Defs, "__MMX__");
223 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000224
Chris Lattner0db667a2007-10-06 06:57:34 +0000225 Define(Defs, "__WCHAR_MAX__", "2147483647");
226 Define(Defs, "__WCHAR_TYPE__", "int");
227 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000228
229 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000230 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
231 Define(Defs, "__FLT_DIG__", "6");
232 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
233 Define(Defs, "__FLT_EVAL_METHOD__", "0");
234 Define(Defs, "__FLT_HAS_INFINITY__");
235 Define(Defs, "__FLT_HAS_QUIET_NAN__");
236 Define(Defs, "__FLT_MANT_DIG__", "24");
237 Define(Defs, "__FLT_MAX_10_EXP__", "38");
238 Define(Defs, "__FLT_MAX_EXP__", "128");
239 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
240 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
241 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
242 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
243 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000244
245 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000246 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
247 Define(Defs, "__DBL_DIG__", "15");
248 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
249 Define(Defs, "__DBL_HAS_INFINITY__");
250 Define(Defs, "__DBL_HAS_QUIET_NAN__");
251 Define(Defs, "__DBL_MANT_DIG__", "53");
252 Define(Defs, "__DBL_MAX_10_EXP__", "308");
253 Define(Defs, "__DBL_MAX_EXP__", "1024");
254 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
255 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
256 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
257 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
258 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000259
260 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000261 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
262 Define(Defs, "__LDBL_DIG__", "18");
263 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
264 Define(Defs, "__LDBL_HAS_INFINITY__");
265 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
266 Define(Defs, "__LDBL_MANT_DIG__", "64");
267 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
268 Define(Defs, "__LDBL_MAX_EXP__", "16384");
269 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
270 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
271 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
272 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000273}
274
Chris Lattnerb6444052008-04-21 20:19:54 +0000275/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000276/// not tied to a specific subtarget.
277static void getARMDefines(std::vector<char> &Defs) {
278 // Target identification.
279 Define(Defs, "__arm");
280 Define(Defs, "__arm__");
281
282 // Target properties.
283 Define(Defs, "__LITTLE_ENDIAN__");
284
285 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
286 Define(Defs, "__INTMAX_TYPE__", "long long int");
287 Define(Defs, "__LONG_MAX__", "2147483647L");
288 Define(Defs, "__PTRDIFF_TYPE__", "int");
289 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
290 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
291
292 Define(Defs, "__CHAR_BIT__", "8");
293 Define(Defs, "__INT_MAX__", "2147483647");
294 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
295 Define(Defs, "__SCHAR_MAX__", "127");
296 Define(Defs, "__SHRT_MAX__", "32767");
297
298 // Subtarget options. [hard coded to v6 for now]
299 Define(Defs, "__ARM_ARCH_6K__");
300 Define(Defs, "__ARMEL__");
301 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
302
303 Define(Defs, "__WCHAR_MAX__", "2147483647");
304 Define(Defs, "__WCHAR_TYPE__", "int");
305 Define(Defs, "__WINT_TYPE__", "int");
306 Define(Defs, "__DECIMAL_DIG__", "17");
307 Define(Defs, "__FLT_RADIX__", "2");
308
309 // Float macros.
310 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
311 Define(Defs, "__FLT_DIG__", "6");
312 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
313 Define(Defs, "__FLT_EVAL_METHOD__", "0");
314 Define(Defs, "__FLT_HAS_INFINITY__");
315 Define(Defs, "__FLT_HAS_QUIET_NAN__");
316 Define(Defs, "__FLT_MANT_DIG__", "24");
317 Define(Defs, "__FLT_MAX_10_EXP__", "38");
318 Define(Defs, "__FLT_MAX_EXP__", "128");
319 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
320 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
321 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
322 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
323
324 // Double macros.
325 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
326 Define(Defs, "__DBL_DIG__", "15");
327 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
328 Define(Defs, "__DBL_HAS_INFINITY__");
329 Define(Defs, "__DBL_HAS_QUIET_NAN__");
330 Define(Defs, "__DBL_MANT_DIG__", "53");
331 Define(Defs, "__DBL_MAX_10_EXP__", "308");
332 Define(Defs, "__DBL_MAX_EXP__", "1024");
333 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
334 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
335 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
336 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
337
338 // 64-bit Long double macros (same as double).
339 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
340 Define(Defs, "__LDBL_DIG__", "15");
341 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
342 Define(Defs, "__LDBL_HAS_INFINITY__");
343 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
344 Define(Defs, "__LDBL_MANT_DIG__", "53");
345 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
346 Define(Defs, "__LDBL_MAX_EXP__", "1024");
347 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
348 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
349 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
350 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
351}
352
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000353//===----------------------------------------------------------------------===//
354// Specific target implementations.
355//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000356
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000357namespace {
358// PPC abstract base class
359class PPCTargetInfo : public TargetInfo {
360 static const Builtin::Info BuiltinInfo[];
361 static const char * const GCCRegNames[];
362 static const TargetInfo::GCCRegAlias GCCRegAliases[];
363
364public:
365 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
366 CharIsSigned = false;
367 }
368 virtual void getTargetBuiltins(const Builtin::Info *&Records,
369 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000370 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000371 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000372 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000373 virtual const char *getVAListDeclaration() const {
374 return "typedef struct __va_list_tag {"
375 " unsigned char gpr;"
376 " unsigned char fpr;"
377 " unsigned short reserved;"
378 " void* overflow_arg_area;"
379 " void* reg_save_area;"
380 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000381 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000382 virtual const char *getTargetPrefix() const {
383 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000384 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000385 virtual void getGCCRegNames(const char * const *&Names,
386 unsigned &NumNames) const;
387 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
388 unsigned &NumAliases) const;
389 virtual bool validateAsmConstraint(char c,
390 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000391 switch (c) {
392 default: return false;
393 case 'O': // Zero
394 return true;
395 case 'b': // Base register
396 case 'f': // Floating point register
397 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
398 return true;
399 }
400 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000401 virtual const char *getClobbers() const {
402 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000403 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000404};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000405
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000406const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
407#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
408#include "clang/AST/PPCBuiltins.def"
409};
Chris Lattner9fd73612008-04-21 18:56:49 +0000410
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000411const char * const PPCTargetInfo::GCCRegNames[] = {
412 "0", "1", "2", "3", "4", "5", "6", "7",
413 "8", "9", "10", "11", "12", "13", "14", "15",
414 "16", "17", "18", "19", "20", "21", "22", "23",
415 "24", "25", "26", "27", "28", "29", "30", "31",
416 "0", "1", "2", "3", "4", "5", "6", "7",
417 "8", "9", "10", "11", "12", "13", "14", "15",
418 "16", "17", "18", "19", "20", "21", "22", "23",
419 "24", "25", "26", "27", "28", "29", "30", "31",
420 "mq", "lr", "ctr", "ap",
421 "0", "1", "2", "3", "4", "5", "6", "7",
422 "xer",
423 "0", "1", "2", "3", "4", "5", "6", "7",
424 "8", "9", "10", "11", "12", "13", "14", "15",
425 "16", "17", "18", "19", "20", "21", "22", "23",
426 "24", "25", "26", "27", "28", "29", "30", "31",
427 "vrsave", "vscr",
428 "spe_acc", "spefscr",
429 "sfp"
430};
Chris Lattner4b009652007-07-25 00:24:17 +0000431
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000432void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
433 unsigned &NumNames) const {
434 Names = GCCRegNames;
435 NumNames = llvm::array_lengthof(GCCRegNames);
436}
Chris Lattner4b009652007-07-25 00:24:17 +0000437
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000438const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
439 // While some of these aliases do map to different registers
440 // they still share the same register name.
441 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
442 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
443 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
444 { { "cr3", "fr3", "r3", "v3"}, "3" },
445 { { "cr4", "fr4", "r4", "v4"}, "4" },
446 { { "cr5", "fr5", "r5", "v5"}, "5" },
447 { { "cr6", "fr6", "r6", "v6"}, "6" },
448 { { "cr7", "fr7", "r7", "v7"}, "7" },
449 { { "fr8", "r8", "v8"}, "8" },
450 { { "fr9", "r9", "v9"}, "9" },
451 { { "fr10", "r10", "v10"}, "10" },
452 { { "fr11", "r11", "v11"}, "11" },
453 { { "fr12", "r12", "v12"}, "12" },
454 { { "fr13", "r13", "v13"}, "13" },
455 { { "fr14", "r14", "v14"}, "14" },
456 { { "fr15", "r15", "v15"}, "15" },
457 { { "fr16", "r16", "v16"}, "16" },
458 { { "fr17", "r17", "v17"}, "17" },
459 { { "fr18", "r18", "v18"}, "18" },
460 { { "fr19", "r19", "v19"}, "19" },
461 { { "fr20", "r20", "v20"}, "20" },
462 { { "fr21", "r21", "v21"}, "21" },
463 { { "fr22", "r22", "v22"}, "22" },
464 { { "fr23", "r23", "v23"}, "23" },
465 { { "fr24", "r24", "v24"}, "24" },
466 { { "fr25", "r25", "v25"}, "25" },
467 { { "fr26", "r26", "v26"}, "26" },
468 { { "fr27", "r27", "v27"}, "27" },
469 { { "fr28", "r28", "v28"}, "28" },
470 { { "fr29", "r29", "v29"}, "29" },
471 { { "fr30", "r30", "v30"}, "30" },
472 { { "fr31", "r31", "v31"}, "31" },
473};
474
475void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
476 unsigned &NumAliases) const {
477 Aliases = GCCRegAliases;
478 NumAliases = llvm::array_lengthof(GCCRegAliases);
479}
480} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000481
482namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000483class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000484public:
Eli Friedman2b161652008-08-21 00:13:15 +0000485 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
486 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
487 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
488 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000489 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000490 getPowerPCDefines(Defines, false);
491 }
Chris Lattner4b009652007-07-25 00:24:17 +0000492};
493} // end anonymous namespace.
494
495namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000496class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000497public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000498 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000499 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000500 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
501 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000502 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000503 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000504 getPowerPCDefines(Defines, true);
505 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000506};
507} // end anonymous namespace.
508
509namespace {
510class DarwinPPCTargetInfo : public PPC32TargetInfo {
511public:
512 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
513 virtual void getTargetDefines(std::vector<char> &Defines) const {
514 PPC32TargetInfo::getTargetDefines(Defines);
515 getDarwinDefines(Defines);
Chris Lattner4b009652007-07-25 00:24:17 +0000516 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000517
518 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000519};
520} // end anonymous namespace.
521
522namespace {
523class DarwinPPC64TargetInfo : public PPC64TargetInfo {
524public:
525 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
526 virtual void getTargetDefines(std::vector<char> &Defines) const {
527 PPC64TargetInfo::getTargetDefines(Defines);
528 getDarwinDefines(Defines);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000529 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000530
531 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000532};
533} // end anonymous namespace.
534
535namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000536// Namespace for x86 abstract base class
537const Builtin::Info BuiltinInfo[] = {
538#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
539#include "clang/AST/X86Builtins.def"
540};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000541
Eli Friedman872996c2008-08-20 02:34:37 +0000542const char *GCCRegNames[] = {
543 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
544 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
545 "argp", "flags", "fspr", "dirflag", "frame",
546 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
547 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
548 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
549 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
550};
551
552const TargetInfo::GCCRegAlias GCCRegAliases[] = {
553 { { "al", "ah", "eax", "rax" }, "ax" },
554 { { "bl", "bh", "ebx", "rbx" }, "bx" },
555 { { "cl", "ch", "ecx", "rcx" }, "cx" },
556 { { "dl", "dh", "edx", "rdx" }, "dx" },
557 { { "esi", "rsi" }, "si" },
558 { { "edi", "rdi" }, "di" },
559 { { "esp", "rsp" }, "sp" },
560 { { "ebp", "rbp" }, "bp" },
561};
562
563// X86 target abstract base class; x86-32 and x86-64 are very close, so
564// most of the implementation can be shared.
565class X86TargetInfo : public TargetInfo {
566public:
567 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
568 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000569 }
570 virtual void getTargetBuiltins(const Builtin::Info *&Records,
571 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000572 Records = BuiltinInfo;
573 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000574 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000575 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000576 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000577 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000578 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000579 unsigned &NumNames) const {
580 Names = GCCRegNames;
581 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000582 }
583 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
584 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000585 Aliases = GCCRegAliases;
586 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000587 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000588 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000589 TargetInfo::ConstraintInfo &info) const;
590 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000591 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000592 return "~{dirflag},~{fpsr},~{flags}";
593 }
Chris Lattner4b009652007-07-25 00:24:17 +0000594};
Eli Friedman872996c2008-08-20 02:34:37 +0000595
596bool
597X86TargetInfo::validateAsmConstraint(char c,
598 TargetInfo::ConstraintInfo &info) const {
599 switch (c) {
600 default: return false;
601 case 'a': // eax.
602 case 'b': // ebx.
603 case 'c': // ecx.
604 case 'd': // edx.
605 case 'S': // esi.
606 case 'D': // edi.
607 case 'A': // edx:eax.
608 case 't': // top of floating point stack.
609 case 'u': // second from top of floating point stack.
610 case 'q': // Any register accessible as [r]l: a, b, c, and d.
611 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
612 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
613 // instructions.
614 case 'N': // unsigned 8-bit integer constant for use with in and out
615 // instructions.
616 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
617 return true;
618 }
619}
620
621std::string
622X86TargetInfo::convertConstraint(const char Constraint) const {
623 switch (Constraint) {
624 case 'a': return std::string("{ax}");
625 case 'b': return std::string("{bx}");
626 case 'c': return std::string("{cx}");
627 case 'd': return std::string("{dx}");
628 case 'S': return std::string("{si}");
629 case 'D': return std::string("{di}");
630 case 't': // top of floating point stack.
631 return std::string("{st}");
632 case 'u': // second from top of floating point stack.
633 return std::string("{st(1)}"); // second from top of floating point stack.
634 default:
635 return std::string(1, Constraint);
636 }
637}
Eli Friedman872996c2008-08-20 02:34:37 +0000638} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000639
640namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000641// X86-32 generic target
642class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000643public:
Eli Friedman872996c2008-08-20 02:34:37 +0000644 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
645 DoubleAlign = LongLongAlign = 32;
646 LongDoubleWidth = 96;
647 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000648 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
649 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
650 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000651 }
652 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000653 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000654 }
655 virtual void getTargetDefines(std::vector<char> &Defines) const {
656 getX86Defines(Defines, false);
657 }
658};
659} // end anonymous namespace
660
661namespace {
662// x86-32 Darwin (OS X) target
663class DarwinI386TargetInfo : public X86_32TargetInfo {
664public:
665 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
666 LongDoubleWidth = 128;
667 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000668 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
669 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
670 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000671 }
672 virtual void getTargetDefines(std::vector<char> &Defines) const {
673 X86_32TargetInfo::getTargetDefines(Defines);
674 getDarwinDefines(Defines);
675 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000676 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +0000677};
678} // end anonymous namespace
679
680namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000681// x86-32 DragonFly target
682class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
683public:
684 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
685 }
686 virtual void getTargetDefines(std::vector<char> &Defines) const {
687 X86_32TargetInfo::getTargetDefines(Defines);
688 getDragonFlyDefines(Defines);
689 }
690};
691} // end anonymous namespace
692
693namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000694// x86-32 Linux target
695class LinuxX86_32TargetInfo : public X86_32TargetInfo {
696public:
697 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
698 }
699 virtual void getTargetDefines(std::vector<char> &Defines) const {
700 X86_32TargetInfo::getTargetDefines(Defines);
701 getLinuxDefines(Defines);
Eli Friedman762fecf2008-09-06 01:37:51 +0000702 Define(Defines, "__USER_LABEL_PREFIX__", "");
Eli Friedman5fb0a022008-08-21 00:24:02 +0000703 }
704};
705} // end anonymous namespace
706
707namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000708// x86-32 Windows target
709class WindowsX86_32TargetInfo : public X86_32TargetInfo {
710public:
711 WindowsX86_32TargetInfo(const std::string& triple)
712 : X86_32TargetInfo(triple) {
713 // FIXME: Fix wchar_t.
714 // FIXME: We should probably enable -fms-extensions by default for
715 // this target.
716 }
717 virtual void getTargetDefines(std::vector<char> &Defines) const {
718 X86_32TargetInfo::getTargetDefines(Defines);
719 // This list is based off of the the list of things MingW defines
720 Define(Defines, "__WIN32__");
721 Define(Defines, "__WIN32");
722 Define(Defines, "_WIN32");
723 Define(Defines, "WIN32");
724 Define(Defines, "__WINNT__");
725 Define(Defines, "__WINNT");
726 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000727 Define(Defines, "_X86_");
728 Define(Defines, "__MSVCRT__");
Eli Friedman762fecf2008-09-06 01:37:51 +0000729 Define(Defines, "__USER_LABEL_PREFIX__", "_");
Eli Friedman23cb7912008-08-21 01:40:19 +0000730 }
731};
732} // end anonymous namespace
733
734namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000735// x86-64 generic target
736class X86_64TargetInfo : public X86TargetInfo {
737public:
738 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000739 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000740 LongDoubleWidth = 128;
741 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000742 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
743 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
744 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000745 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000746 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000747 return "typedef struct __va_list_tag {"
748 " unsigned gp_offset;"
749 " unsigned fp_offset;"
750 " void* overflow_arg_area;"
751 " void* reg_save_area;"
752 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000753 }
Eli Friedman872996c2008-08-20 02:34:37 +0000754 virtual void getTargetDefines(std::vector<char> &Defines) const {
755 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000756 }
Eli Friedman872996c2008-08-20 02:34:37 +0000757};
758} // end anonymous namespace
759
760namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000761// x86-64 Linux target
762class LinuxX86_64TargetInfo : public X86_64TargetInfo {
763public:
764 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
765 }
766 virtual void getTargetDefines(std::vector<char> &Defines) const {
767 X86_64TargetInfo::getTargetDefines(Defines);
768 getLinuxDefines(Defines);
769 Define(Defines, "__USER_LABEL_PREFIX__", "");
770 }
771};
772} // end anonymous namespace
773
774namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000775// x86-64 Darwin (OS X) target
776class DarwinX86_64TargetInfo : public X86_64TargetInfo {
777public:
778 DarwinX86_64TargetInfo(const std::string& triple) :
779 X86_64TargetInfo(triple) {}
780
781 virtual void getTargetDefines(std::vector<char> &Defines) const {
782 X86_64TargetInfo::getTargetDefines(Defines);
783 getDarwinDefines(Defines);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000784 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000785
786 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000787};
788} // end anonymous namespace.
789
Chris Lattner9fd73612008-04-21 18:56:49 +0000790namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000791class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000792public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000793 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
794 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000795 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
796 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000797 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000798 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000799 getARMDefines(Defines);
800 }
801 virtual void getTargetBuiltins(const Builtin::Info *&Records,
802 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000803 // FIXME: Implement.
804 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000805 NumRecords = 0;
806 }
807 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000808 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000809 }
810 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000811 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000812 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000813 virtual void getGCCRegNames(const char * const *&Names,
814 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000815 // FIXME: Implement.
816 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000817 NumNames = 0;
818 }
819 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
820 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000821 // FIXME: Implement.
822 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000823 NumAliases = 0;
824 }
825 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000826 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000827 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000828 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000829 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000830 case 'l': // r0-r7
831 case 'h': // r8-r15
832 case 'w': // VFP Floating point register single precision
833 case 'P': // VFP Floating point register double precision
834 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
835 return true;
836 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000837 return false;
838 }
839 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000840 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000841 return "";
842 }
843};
844} // end anonymous namespace.
845
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000846
847namespace {
848class DarwinARMTargetInfo : public ARMTargetInfo {
849public:
850 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
851
852 virtual void getTargetDefines(std::vector<char> &Defines) const {
853 ARMTargetInfo::getTargetDefines(Defines);
854 getDarwinDefines(Defines);
855 }
856};
857} // end anonymous namespace.
858
Chris Lattner4b009652007-07-25 00:24:17 +0000859namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000860class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000861public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000862 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
863 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000864 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
865 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000866 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000867 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000868 // FIXME: This is missing a lot of important defines; some of the
869 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000870 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000871 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000872 Define(Defines, "__sparcv8");
873 }
874 virtual void getTargetBuiltins(const Builtin::Info *&Records,
875 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000876 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000877 }
878 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000879 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000880 }
881 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000882 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000883 }
884 virtual void getGCCRegNames(const char * const *&Names,
885 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000886 // FIXME: Implement!
887 Names = 0;
888 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000889 }
890 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
891 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000892 // FIXME: Implement!
893 Aliases = 0;
894 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000895 }
896 virtual bool validateAsmConstraint(char c,
897 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000898 // FIXME: Implement!
899 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000900 }
901 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000902 // FIXME: Implement!
903 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000904 }
905};
906
907} // end anonymous namespace.
908
Eli Friedmanff158dd2008-08-20 07:28:14 +0000909namespace {
910class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
911public:
912 SolarisSparcV8TargetInfo(const std::string& triple) :
913 SparcV8TargetInfo(triple) {}
914
915 virtual void getTargetDefines(std::vector<char> &Defines) const {
916 SparcV8TargetInfo::getTargetDefines(Defines);
917 getSolarisDefines(Defines);
918 }
919};
920} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000921
Chris Lattner85970f32008-05-08 05:58:21 +0000922namespace {
923 class PIC16TargetInfo : public TargetInfo{
924 public:
925 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000926 // FIXME: Is IntAlign really supposed to be 16? There seems
927 // little point on a platform with 8-bit loads.
928 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
929 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000930 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000931 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000932 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
933 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000934 virtual void getTargetDefines(std::vector<char> &Defines) const {
935 Define(Defines, "__pic16");
936 }
937 virtual void getTargetBuiltins(const Builtin::Info *&Records,
938 unsigned &NumRecords) const {}
939 virtual const char *getVAListDeclaration() const { return "";}
940 virtual const char *getClobbers() const {return "";}
941 virtual const char *getTargetPrefix() const {return "";}
942 virtual void getGCCRegNames(const char * const *&Names,
943 unsigned &NumNames) const {}
944 virtual bool validateAsmConstraint(char c,
945 TargetInfo::ConstraintInfo &info) const {
946 return true;
947 }
948 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
949 unsigned &NumAliases) const {}
950 virtual bool useGlobalsForAutomaticVariables() const {return true;}
951 };
952}
953
Chris Lattner4b009652007-07-25 00:24:17 +0000954//===----------------------------------------------------------------------===//
955// Driver code
956//===----------------------------------------------------------------------===//
957
Ted Kremenekb97d7672007-12-04 17:07:35 +0000958static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000959 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
960 TT[4] == '-' && TT[1] - '3' < 6);
961}
962
Chris Lattnerfc457002008-03-05 01:18:20 +0000963/// CreateTargetInfo - Return the target info object for the specified target
964/// triple.
965TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000966 // OS detection; this isn't really anywhere near complete.
967 // Additions and corrections are welcome.
968 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000969 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000970 bool isSolaris = T.find("-solaris") != std::string::npos;
971 bool isLinux = T.find("-linux") != std::string::npos;
972 bool isWindows = T.find("-windows") != std::string::npos ||
973 T.find("-win32") != std::string::npos ||
974 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000975
Eli Friedman2b161652008-08-21 00:13:15 +0000976 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
977 if (isDarwin)
978 return new DarwinPPCTargetInfo(T);
979 return new PPC32TargetInfo(T);
980 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000981
Eli Friedman2b161652008-08-21 00:13:15 +0000982 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
983 if (isDarwin)
984 return new DarwinPPC64TargetInfo(T);
985 return new PPC64TargetInfo(T);
986 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000987
Eli Friedman2b161652008-08-21 00:13:15 +0000988 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
989 if (isDarwin)
990 return new DarwinARMTargetInfo(T);
991 return new ARMTargetInfo(T);
992 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000993
Eli Friedman2b161652008-08-21 00:13:15 +0000994 if (T.find("sparc-") == 0) {
995 if (isSolaris)
996 return new SolarisSparcV8TargetInfo(T);
997 return new SparcV8TargetInfo(T);
998 }
999
1000 if (T.find("x86_64-") == 0) {
1001 if (isDarwin)
1002 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001003 if (isLinux)
1004 return new LinuxX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001005 return new X86_64TargetInfo(T);
1006 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001007
Chris Lattner85970f32008-05-08 05:58:21 +00001008 if (T.find("pic16-") == 0)
1009 return new PIC16TargetInfo(T);
1010
Eli Friedman2b161652008-08-21 00:13:15 +00001011 if (IsX86(T)) {
1012 if (isDarwin)
1013 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001014 if (isLinux)
1015 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001016 if (isDragonFly)
1017 return new DragonFlyX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001018 if (isWindows)
1019 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001020 return new X86_32TargetInfo(T);
1021 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001022
Chris Lattnerfc457002008-03-05 01:18:20 +00001023 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001024}
Ted Kremenekd507bab2008-03-04 17:47:18 +00001025