blob: 382bba0e71569f6aac3b0812def524fe79f42ea1 [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"
Nick Lewyckye275a662008-09-30 07:18:57 +000020#include <cstdlib>
Ted Kremenekb0615542007-12-03 22:06:55 +000021
Chris Lattner5ba61f02006-10-14 07:39:34 +000022using namespace clang;
23
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000025// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000026//===----------------------------------------------------------------------===//
27
Chris Lattnerb2d486a2007-10-06 06:57:34 +000028static void Define(std::vector<char> &Buf, const char *Macro,
29 const char *Val = "1") {
30 const char *Def = "#define ";
31 Buf.insert(Buf.end(), Def, Def+strlen(Def));
32 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
33 Buf.push_back(' ');
34 Buf.insert(Buf.end(), Val, Val+strlen(Val));
35 Buf.push_back('\n');
36}
37
Eli Friedmanda8f5a92008-08-20 07:28:14 +000038static void getSolarisDefines(std::vector<char> &Defs) {
39 Define(Defs, "__SUN__");
40 Define(Defs, "__SOLARIS__");
41}
Chris Lattner5ba61f02006-10-14 07:39:34 +000042
Chris Lattnerb3793bb2008-09-30 01:00:25 +000043static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +000044 Define(Defs, "__APPLE__");
45 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-09-30 01:00:25 +000046
47 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
48 const char *Darwin = strstr(Triple, "-darwin");
49 if (Darwin) {
50 Darwin += strlen("-darwin");
51 if (Darwin[0] >= '1' && Darwin[0] <= '9') {
52 unsigned DarwinNo = atoi(Darwin);
53 if (DarwinNo > 4) {
54 char DarwinStr[] = "10x0";
55 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
56 DarwinStr[2] = '0' + DarwinNo-4;
57 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",DarwinStr);
58 }
59 }
60 }
Eli Friedman3fd920a2008-08-20 02:34:37 +000061}
Chris Lattner5ba61f02006-10-14 07:39:34 +000062
Chris Lattner5637ef52008-08-23 18:23:14 +000063static void getDragonFlyDefines(std::vector<char> &Defs) {
64 // DragonFly defines; list based off of gcc output
65 Define(Defs, "__DragonFly__");
66 Define(Defs, "__DragonFly_cc_version", "100001");
67 Define(Defs, "__ELF__");
68 Define(Defs, "__KPRINTF_ATTRIBUTE__");
69 Define(Defs, "__tune_i386__");
70 Define(Defs, "unix");
71 Define(Defs, "__unix");
72 Define(Defs, "__unix__");
73}
74
Eli Friedmanff594f22008-08-21 00:24:02 +000075static void getLinuxDefines(std::vector<char> &Defs) {
76 // Linux defines; list based off of gcc output
77 Define(Defs, "__unix__");
78 Define(Defs, "__unix");
79 Define(Defs, "unix");
80 Define(Defs, "__linux__");
81 Define(Defs, "__linux");
82 Define(Defs, "linux");
83 Define(Defs, "__gnu_linux__");
84}
85
Chris Lattner1f5ad112006-10-14 18:32:12 +000086/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
87/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000088static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +000089 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000090 Define(Defs, "__ppc__");
91 Define(Defs, "_ARCH_PPC");
92 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +000093 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000094 Define(Defs, "_ARCH_PPC64");
95 Define(Defs, "_LP64");
96 Define(Defs, "__LP64__");
97 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +000098 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000099 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000100 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000101
Chris Lattner9c837532006-10-15 01:05:46 +0000102 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000103 Define(Defs, "_BIG_ENDIAN");
104 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000105
106 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000107 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
108 Define(Defs, "__INTMAX_TYPE__", "long int");
109 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
110 Define(Defs, "__PTRDIFF_TYPE__", "long int");
111 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000112 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000113 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
114 Define(Defs, "__INTMAX_TYPE__", "long long int");
115 Define(Defs, "__LONG_MAX__", "2147483647L");
116 Define(Defs, "__PTRDIFF_TYPE__", "int");
117 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000118 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000119 Define(Defs, "__INT_MAX__", "2147483647");
120 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
121 Define(Defs, "__CHAR_BIT__", "8");
122 Define(Defs, "__SCHAR_MAX__", "127");
123 Define(Defs, "__SHRT_MAX__", "32767");
124 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000125
126 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000127 Define(Defs, "__USER_LABEL_PREFIX__", "_");
128 Define(Defs, "__NATURAL_ALIGNMENT__");
129 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000130
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000131 Define(Defs, "__WCHAR_MAX__", "2147483647");
132 Define(Defs, "__WCHAR_TYPE__", "int");
133 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000134
135 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000136 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
137 Define(Defs, "__FLT_DIG__", "6");
138 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
139 Define(Defs, "__FLT_EVAL_METHOD__", "0");
140 Define(Defs, "__FLT_HAS_INFINITY__");
141 Define(Defs, "__FLT_HAS_QUIET_NAN__");
142 Define(Defs, "__FLT_MANT_DIG__", "24");
143 Define(Defs, "__FLT_MAX_10_EXP__", "38");
144 Define(Defs, "__FLT_MAX_EXP__", "128");
145 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
146 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
147 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
148 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
149 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000150
151 // double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000152 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
153 Define(Defs, "__DBL_DIG__", "15");
154 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
155 Define(Defs, "__DBL_HAS_INFINITY__");
156 Define(Defs, "__DBL_HAS_QUIET_NAN__");
157 Define(Defs, "__DBL_MANT_DIG__", "53");
158 Define(Defs, "__DBL_MAX_10_EXP__", "308");
159 Define(Defs, "__DBL_MAX_EXP__", "1024");
160 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
161 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
162 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
163 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
164 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner9c837532006-10-15 01:05:46 +0000165
166 // 128-bit long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000167 Define(Defs, "__LDBL_DENORM_MIN__",
168 "4.94065645841246544176568792868221e-324L");
169 Define(Defs, "__LDBL_DIG__", "31");
170 Define(Defs, "__LDBL_EPSILON__",
171 "4.94065645841246544176568792868221e-324L");
172 Define(Defs, "__LDBL_HAS_INFINITY__");
173 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
174 Define(Defs, "__LDBL_MANT_DIG__", "106");
175 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
176 Define(Defs, "__LDBL_MAX_EXP__", "1024");
177 Define(Defs, "__LDBL_MAX__",
178 "1.79769313486231580793728971405301e+308L");
179 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
180 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
181 Define(Defs, "__LDBL_MIN__",
182 "2.00416836000897277799610805135016e-292L");
183 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000184}
185
186/// getX86Defines - Return a set of the X86-specific #defines that are
187/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000188static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000189 // Target identification.
190 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000191 Define(Defs, "_LP64");
192 Define(Defs, "__LP64__");
193 Define(Defs, "__amd64__");
194 Define(Defs, "__amd64");
195 Define(Defs, "__x86_64");
196 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000197 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000198 Define(Defs, "__i386__");
199 Define(Defs, "__i386");
200 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000201 }
202
203 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000204 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000205
206 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000207 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
208 Define(Defs, "__INTMAX_TYPE__", "long int");
209 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
210 Define(Defs, "__PTRDIFF_TYPE__", "long int");
211 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000212 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000213 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
214 Define(Defs, "__INTMAX_TYPE__", "long long int");
215 Define(Defs, "__LONG_MAX__", "2147483647L");
216 Define(Defs, "__PTRDIFF_TYPE__", "int");
217 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000218 }
Anders Carlsson35a56362008-07-22 17:16:13 +0000219 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000220 Define(Defs, "__CHAR_BIT__", "8");
221 Define(Defs, "__INT_MAX__", "2147483647");
222 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
223 Define(Defs, "__SCHAR_MAX__", "127");
224 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner9c837532006-10-15 01:05:46 +0000225
226 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000227 Define(Defs, "__nocona");
228 Define(Defs, "__nocona__");
229 Define(Defs, "__tune_nocona__");
230 Define(Defs, "__SSE2_MATH__");
231 Define(Defs, "__SSE2__");
232 Define(Defs, "__SSE_MATH__");
233 Define(Defs, "__SSE__");
234 Define(Defs, "__MMX__");
235 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000236
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000237 Define(Defs, "__WCHAR_MAX__", "2147483647");
238 Define(Defs, "__WCHAR_TYPE__", "int");
239 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000240
241 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000242 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
243 Define(Defs, "__FLT_DIG__", "6");
244 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
245 Define(Defs, "__FLT_EVAL_METHOD__", "0");
246 Define(Defs, "__FLT_HAS_INFINITY__");
247 Define(Defs, "__FLT_HAS_QUIET_NAN__");
248 Define(Defs, "__FLT_MANT_DIG__", "24");
249 Define(Defs, "__FLT_MAX_10_EXP__", "38");
250 Define(Defs, "__FLT_MAX_EXP__", "128");
251 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
252 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
253 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
254 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
255 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000256
257 // Double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000258 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
259 Define(Defs, "__DBL_DIG__", "15");
260 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
261 Define(Defs, "__DBL_HAS_INFINITY__");
262 Define(Defs, "__DBL_HAS_QUIET_NAN__");
263 Define(Defs, "__DBL_MANT_DIG__", "53");
264 Define(Defs, "__DBL_MAX_10_EXP__", "308");
265 Define(Defs, "__DBL_MAX_EXP__", "1024");
266 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
267 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
268 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
269 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
270 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner9c837532006-10-15 01:05:46 +0000271
272 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000273 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
274 Define(Defs, "__LDBL_DIG__", "18");
275 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
276 Define(Defs, "__LDBL_HAS_INFINITY__");
277 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
278 Define(Defs, "__LDBL_MANT_DIG__", "64");
279 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
280 Define(Defs, "__LDBL_MAX_EXP__", "16384");
281 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
282 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
283 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
284 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000285}
286
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000287/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000288/// not tied to a specific subtarget.
289static void getARMDefines(std::vector<char> &Defs) {
290 // Target identification.
291 Define(Defs, "__arm");
292 Define(Defs, "__arm__");
293
294 // Target properties.
295 Define(Defs, "__LITTLE_ENDIAN__");
296
297 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
298 Define(Defs, "__INTMAX_TYPE__", "long long int");
299 Define(Defs, "__LONG_MAX__", "2147483647L");
300 Define(Defs, "__PTRDIFF_TYPE__", "int");
301 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
302 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
303
304 Define(Defs, "__CHAR_BIT__", "8");
305 Define(Defs, "__INT_MAX__", "2147483647");
306 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
307 Define(Defs, "__SCHAR_MAX__", "127");
308 Define(Defs, "__SHRT_MAX__", "32767");
309
310 // Subtarget options. [hard coded to v6 for now]
311 Define(Defs, "__ARM_ARCH_6K__");
312 Define(Defs, "__ARMEL__");
313 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
314
315 Define(Defs, "__WCHAR_MAX__", "2147483647");
316 Define(Defs, "__WCHAR_TYPE__", "int");
317 Define(Defs, "__WINT_TYPE__", "int");
318 Define(Defs, "__DECIMAL_DIG__", "17");
319 Define(Defs, "__FLT_RADIX__", "2");
320
321 // Float macros.
322 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
323 Define(Defs, "__FLT_DIG__", "6");
324 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
325 Define(Defs, "__FLT_EVAL_METHOD__", "0");
326 Define(Defs, "__FLT_HAS_INFINITY__");
327 Define(Defs, "__FLT_HAS_QUIET_NAN__");
328 Define(Defs, "__FLT_MANT_DIG__", "24");
329 Define(Defs, "__FLT_MAX_10_EXP__", "38");
330 Define(Defs, "__FLT_MAX_EXP__", "128");
331 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
332 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
333 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
334 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
335
336 // Double macros.
337 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
338 Define(Defs, "__DBL_DIG__", "15");
339 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
340 Define(Defs, "__DBL_HAS_INFINITY__");
341 Define(Defs, "__DBL_HAS_QUIET_NAN__");
342 Define(Defs, "__DBL_MANT_DIG__", "53");
343 Define(Defs, "__DBL_MAX_10_EXP__", "308");
344 Define(Defs, "__DBL_MAX_EXP__", "1024");
345 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
346 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
347 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
348 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
349
350 // 64-bit Long double macros (same as double).
351 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
352 Define(Defs, "__LDBL_DIG__", "15");
353 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
354 Define(Defs, "__LDBL_HAS_INFINITY__");
355 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
356 Define(Defs, "__LDBL_MANT_DIG__", "53");
357 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
358 Define(Defs, "__LDBL_MAX_EXP__", "1024");
359 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
360 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
361 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
362 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
363}
364
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000365//===----------------------------------------------------------------------===//
366// Specific target implementations.
367//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000368
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000369namespace {
370// PPC abstract base class
371class PPCTargetInfo : public TargetInfo {
372 static const Builtin::Info BuiltinInfo[];
373 static const char * const GCCRegNames[];
374 static const TargetInfo::GCCRegAlias GCCRegAliases[];
375
376public:
377 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
378 CharIsSigned = false;
379 }
380 virtual void getTargetBuiltins(const Builtin::Info *&Records,
381 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000382 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000383 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000384 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000385 virtual const char *getVAListDeclaration() const {
386 return "typedef struct __va_list_tag {"
387 " unsigned char gpr;"
388 " unsigned char fpr;"
389 " unsigned short reserved;"
390 " void* overflow_arg_area;"
391 " void* reg_save_area;"
392 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000393 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000394 virtual const char *getTargetPrefix() const {
395 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000396 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000397 virtual void getGCCRegNames(const char * const *&Names,
398 unsigned &NumNames) const;
399 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
400 unsigned &NumAliases) const;
401 virtual bool validateAsmConstraint(char c,
402 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000403 switch (c) {
404 default: return false;
405 case 'O': // Zero
406 return true;
407 case 'b': // Base register
408 case 'f': // Floating point register
409 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
410 return true;
411 }
412 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000413 virtual const char *getClobbers() const {
414 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000415 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000416};
Anders Carlssonf511f642007-11-27 04:11:28 +0000417
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000418const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
419#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
420#include "clang/AST/PPCBuiltins.def"
421};
Chris Lattner17df24e2008-04-21 18:56:49 +0000422
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000423const char * const PPCTargetInfo::GCCRegNames[] = {
424 "0", "1", "2", "3", "4", "5", "6", "7",
425 "8", "9", "10", "11", "12", "13", "14", "15",
426 "16", "17", "18", "19", "20", "21", "22", "23",
427 "24", "25", "26", "27", "28", "29", "30", "31",
428 "0", "1", "2", "3", "4", "5", "6", "7",
429 "8", "9", "10", "11", "12", "13", "14", "15",
430 "16", "17", "18", "19", "20", "21", "22", "23",
431 "24", "25", "26", "27", "28", "29", "30", "31",
432 "mq", "lr", "ctr", "ap",
433 "0", "1", "2", "3", "4", "5", "6", "7",
434 "xer",
435 "0", "1", "2", "3", "4", "5", "6", "7",
436 "8", "9", "10", "11", "12", "13", "14", "15",
437 "16", "17", "18", "19", "20", "21", "22", "23",
438 "24", "25", "26", "27", "28", "29", "30", "31",
439 "vrsave", "vscr",
440 "spe_acc", "spefscr",
441 "sfp"
442};
Chris Lattner10a5b382007-01-29 05:24:35 +0000443
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000444void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
445 unsigned &NumNames) const {
446 Names = GCCRegNames;
447 NumNames = llvm::array_lengthof(GCCRegNames);
448}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000449
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000450const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
451 // While some of these aliases do map to different registers
452 // they still share the same register name.
453 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
454 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
455 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
456 { { "cr3", "fr3", "r3", "v3"}, "3" },
457 { { "cr4", "fr4", "r4", "v4"}, "4" },
458 { { "cr5", "fr5", "r5", "v5"}, "5" },
459 { { "cr6", "fr6", "r6", "v6"}, "6" },
460 { { "cr7", "fr7", "r7", "v7"}, "7" },
461 { { "fr8", "r8", "v8"}, "8" },
462 { { "fr9", "r9", "v9"}, "9" },
463 { { "fr10", "r10", "v10"}, "10" },
464 { { "fr11", "r11", "v11"}, "11" },
465 { { "fr12", "r12", "v12"}, "12" },
466 { { "fr13", "r13", "v13"}, "13" },
467 { { "fr14", "r14", "v14"}, "14" },
468 { { "fr15", "r15", "v15"}, "15" },
469 { { "fr16", "r16", "v16"}, "16" },
470 { { "fr17", "r17", "v17"}, "17" },
471 { { "fr18", "r18", "v18"}, "18" },
472 { { "fr19", "r19", "v19"}, "19" },
473 { { "fr20", "r20", "v20"}, "20" },
474 { { "fr21", "r21", "v21"}, "21" },
475 { { "fr22", "r22", "v22"}, "22" },
476 { { "fr23", "r23", "v23"}, "23" },
477 { { "fr24", "r24", "v24"}, "24" },
478 { { "fr25", "r25", "v25"}, "25" },
479 { { "fr26", "r26", "v26"}, "26" },
480 { { "fr27", "r27", "v27"}, "27" },
481 { { "fr28", "r28", "v28"}, "28" },
482 { { "fr29", "r29", "v29"}, "29" },
483 { { "fr30", "r30", "v30"}, "30" },
484 { { "fr31", "r31", "v31"}, "31" },
485};
486
487void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
488 unsigned &NumAliases) const {
489 Aliases = GCCRegAliases;
490 NumAliases = llvm::array_lengthof(GCCRegAliases);
491}
492} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000493
Chris Lattner5ba61f02006-10-14 07:39:34 +0000494namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000495class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000496public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000497 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
498 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
499 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
500 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000501 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000502 getPowerPCDefines(Defines, false);
503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000504};
505} // end anonymous namespace.
506
507namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000508class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000509public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000510 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000512 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
513 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000514 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000515 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000516 getPowerPCDefines(Defines, true);
517 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000518};
519} // end anonymous namespace.
520
521namespace {
522class DarwinPPCTargetInfo : public PPC32TargetInfo {
523public:
524 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
525 virtual void getTargetDefines(std::vector<char> &Defines) const {
526 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000527 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000528 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000529
530 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000531};
532} // end anonymous namespace.
533
534namespace {
535class DarwinPPC64TargetInfo : public PPC64TargetInfo {
536public:
537 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
538 virtual void getTargetDefines(std::vector<char> &Defines) const {
539 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000540 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000541 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000542
543 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000544};
545} // end anonymous namespace.
546
547namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000548// Namespace for x86 abstract base class
549const Builtin::Info BuiltinInfo[] = {
550#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
551#include "clang/AST/X86Builtins.def"
552};
Eli Friedmanb5366062008-05-20 14:21:01 +0000553
Eli Friedman3fd920a2008-08-20 02:34:37 +0000554const char *GCCRegNames[] = {
555 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
556 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
557 "argp", "flags", "fspr", "dirflag", "frame",
558 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
559 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
560 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
561 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
562};
563
564const TargetInfo::GCCRegAlias GCCRegAliases[] = {
565 { { "al", "ah", "eax", "rax" }, "ax" },
566 { { "bl", "bh", "ebx", "rbx" }, "bx" },
567 { { "cl", "ch", "ecx", "rcx" }, "cx" },
568 { { "dl", "dh", "edx", "rdx" }, "dx" },
569 { { "esi", "rsi" }, "si" },
570 { { "edi", "rdi" }, "di" },
571 { { "esp", "rsp" }, "sp" },
572 { { "ebp", "rbp" }, "bp" },
573};
574
575// X86 target abstract base class; x86-32 and x86-64 are very close, so
576// most of the implementation can be shared.
577class X86TargetInfo : public TargetInfo {
578public:
579 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
580 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000581 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000582 virtual void getTargetBuiltins(const Builtin::Info *&Records,
583 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000584 Records = BuiltinInfo;
585 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000586 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000587 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000588 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000589 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000590 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000591 unsigned &NumNames) const {
592 Names = GCCRegNames;
593 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000594 }
595 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
596 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000597 Aliases = GCCRegAliases;
598 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000599 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000600 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000601 TargetInfo::ConstraintInfo &info) const;
602 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000603 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000604 return "~{dirflag},~{fpsr},~{flags}";
605 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000606};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000607
608bool
609X86TargetInfo::validateAsmConstraint(char c,
610 TargetInfo::ConstraintInfo &info) const {
611 switch (c) {
612 default: return false;
613 case 'a': // eax.
614 case 'b': // ebx.
615 case 'c': // ecx.
616 case 'd': // edx.
617 case 'S': // esi.
618 case 'D': // edi.
619 case 'A': // edx:eax.
620 case 't': // top of floating point stack.
621 case 'u': // second from top of floating point stack.
622 case 'q': // Any register accessible as [r]l: a, b, c, and d.
623 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
624 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
625 // instructions.
626 case 'N': // unsigned 8-bit integer constant for use with in and out
627 // instructions.
628 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
629 return true;
630 }
631}
632
633std::string
634X86TargetInfo::convertConstraint(const char Constraint) const {
635 switch (Constraint) {
636 case 'a': return std::string("{ax}");
637 case 'b': return std::string("{bx}");
638 case 'c': return std::string("{cx}");
639 case 'd': return std::string("{dx}");
640 case 'S': return std::string("{si}");
641 case 'D': return std::string("{di}");
642 case 't': // top of floating point stack.
643 return std::string("{st}");
644 case 'u': // second from top of floating point stack.
645 return std::string("{st(1)}"); // second from top of floating point stack.
646 default:
647 return std::string(1, Constraint);
648 }
649}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000650} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000651
652namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000653// X86-32 generic target
654class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000655public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000656 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
657 DoubleAlign = LongLongAlign = 32;
658 LongDoubleWidth = 96;
659 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000660 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
661 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
662 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000663 }
664 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000665 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000666 }
667 virtual void getTargetDefines(std::vector<char> &Defines) const {
668 getX86Defines(Defines, false);
669 }
670};
671} // end anonymous namespace
672
673namespace {
674// x86-32 Darwin (OS X) target
675class DarwinI386TargetInfo : public X86_32TargetInfo {
676public:
677 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
678 LongDoubleWidth = 128;
679 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000680 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
681 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
682 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000683 }
684 virtual void getTargetDefines(std::vector<char> &Defines) const {
685 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000686 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000687 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000688 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000689};
690} // end anonymous namespace
691
692namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000693// x86-32 DragonFly target
694class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
695public:
696 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
697 }
698 virtual void getTargetDefines(std::vector<char> &Defines) const {
699 X86_32TargetInfo::getTargetDefines(Defines);
700 getDragonFlyDefines(Defines);
701 }
702};
703} // end anonymous namespace
704
705namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000706// x86-32 Linux target
707class LinuxX86_32TargetInfo : public X86_32TargetInfo {
708public:
709 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
710 }
711 virtual void getTargetDefines(std::vector<char> &Defines) const {
712 X86_32TargetInfo::getTargetDefines(Defines);
713 getLinuxDefines(Defines);
Eli Friedman6565d452008-09-06 01:37:51 +0000714 Define(Defines, "__USER_LABEL_PREFIX__", "");
Eli Friedmanff594f22008-08-21 00:24:02 +0000715 }
716};
717} // end anonymous namespace
718
719namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000720// x86-32 Windows target
721class WindowsX86_32TargetInfo : public X86_32TargetInfo {
722public:
723 WindowsX86_32TargetInfo(const std::string& triple)
724 : X86_32TargetInfo(triple) {
725 // FIXME: Fix wchar_t.
726 // FIXME: We should probably enable -fms-extensions by default for
727 // this target.
728 }
729 virtual void getTargetDefines(std::vector<char> &Defines) const {
730 X86_32TargetInfo::getTargetDefines(Defines);
731 // This list is based off of the the list of things MingW defines
732 Define(Defines, "__WIN32__");
733 Define(Defines, "__WIN32");
734 Define(Defines, "_WIN32");
735 Define(Defines, "WIN32");
736 Define(Defines, "__WINNT__");
737 Define(Defines, "__WINNT");
738 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000739 Define(Defines, "_X86_");
740 Define(Defines, "__MSVCRT__");
Eli Friedman6565d452008-09-06 01:37:51 +0000741 Define(Defines, "__USER_LABEL_PREFIX__", "_");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000742 }
743};
744} // end anonymous namespace
745
746namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000747// x86-64 generic target
748class X86_64TargetInfo : public X86TargetInfo {
749public:
750 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000751 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000752 LongDoubleWidth = 128;
753 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000754 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
755 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
756 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000757 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000758 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000759 return "typedef struct __va_list_tag {"
760 " unsigned gp_offset;"
761 " unsigned fp_offset;"
762 " void* overflow_arg_area;"
763 " void* reg_save_area;"
764 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000765 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000766 virtual void getTargetDefines(std::vector<char> &Defines) const {
767 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000768 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000769};
770} // end anonymous namespace
771
772namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000773// x86-64 Linux target
774class LinuxX86_64TargetInfo : public X86_64TargetInfo {
775public:
776 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
777 }
778 virtual void getTargetDefines(std::vector<char> &Defines) const {
779 X86_64TargetInfo::getTargetDefines(Defines);
780 getLinuxDefines(Defines);
781 Define(Defines, "__USER_LABEL_PREFIX__", "");
782 }
783};
784} // end anonymous namespace
785
786namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000787// x86-64 Darwin (OS X) target
788class DarwinX86_64TargetInfo : public X86_64TargetInfo {
789public:
790 DarwinX86_64TargetInfo(const std::string& triple) :
791 X86_64TargetInfo(triple) {}
792
793 virtual void getTargetDefines(std::vector<char> &Defines) const {
794 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000795 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000796 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000797
798 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000799};
800} // end anonymous namespace.
801
Chris Lattner17df24e2008-04-21 18:56:49 +0000802namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000803class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000804public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000805 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
806 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000807 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
808 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000809 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000810 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000811 getARMDefines(Defines);
812 }
813 virtual void getTargetBuiltins(const Builtin::Info *&Records,
814 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000815 // FIXME: Implement.
816 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000817 NumRecords = 0;
818 }
819 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000820 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000821 }
822 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000823 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000824 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000825 virtual void getGCCRegNames(const char * const *&Names,
826 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000827 // FIXME: Implement.
828 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000829 NumNames = 0;
830 }
831 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
832 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000833 // FIXME: Implement.
834 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000835 NumAliases = 0;
836 }
837 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000838 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000839 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000840 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000841 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000842 case 'l': // r0-r7
843 case 'h': // r8-r15
844 case 'w': // VFP Floating point register single precision
845 case 'P': // VFP Floating point register double precision
846 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
847 return true;
848 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000849 return false;
850 }
851 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000852 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000853 return "";
854 }
855};
856} // end anonymous namespace.
857
Eli Friedmanf05b7722008-08-20 07:44:10 +0000858
859namespace {
860class DarwinARMTargetInfo : public ARMTargetInfo {
861public:
862 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
863
864 virtual void getTargetDefines(std::vector<char> &Defines) const {
865 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000866 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000867 }
868};
869} // end anonymous namespace.
870
Chris Lattner5ba61f02006-10-14 07:39:34 +0000871namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000872class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000873public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000874 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
875 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000876 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
877 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000878 }
Gabor Greif49991682008-02-21 16:29:08 +0000879 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000880 // FIXME: This is missing a lot of important defines; some of the
881 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000882 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000883 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000884 Define(Defines, "__sparcv8");
885 }
886 virtual void getTargetBuiltins(const Builtin::Info *&Records,
887 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000888 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000889 }
890 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000891 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000892 }
893 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000894 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000895 }
896 virtual void getGCCRegNames(const char * const *&Names,
897 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000898 // FIXME: Implement!
899 Names = 0;
900 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000901 }
902 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
903 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000904 // FIXME: Implement!
905 Aliases = 0;
906 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000907 }
908 virtual bool validateAsmConstraint(char c,
909 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000910 // FIXME: Implement!
911 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000912 }
913 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000914 // FIXME: Implement!
915 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000916 }
917};
918
919} // end anonymous namespace.
920
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000921namespace {
922class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
923public:
924 SolarisSparcV8TargetInfo(const std::string& triple) :
925 SparcV8TargetInfo(triple) {}
926
927 virtual void getTargetDefines(std::vector<char> &Defines) const {
928 SparcV8TargetInfo::getTargetDefines(Defines);
929 getSolarisDefines(Defines);
930 }
931};
932} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000933
Chris Lattnerb781dc792008-05-08 05:58:21 +0000934namespace {
935 class PIC16TargetInfo : public TargetInfo{
936 public:
937 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000938 // FIXME: Is IntAlign really supposed to be 16? There seems
939 // little point on a platform with 8-bit loads.
940 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
941 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000942 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000943 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000944 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
945 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000946 virtual void getTargetDefines(std::vector<char> &Defines) const {
947 Define(Defines, "__pic16");
948 }
949 virtual void getTargetBuiltins(const Builtin::Info *&Records,
950 unsigned &NumRecords) const {}
951 virtual const char *getVAListDeclaration() const { return "";}
952 virtual const char *getClobbers() const {return "";}
953 virtual const char *getTargetPrefix() const {return "";}
954 virtual void getGCCRegNames(const char * const *&Names,
955 unsigned &NumNames) const {}
956 virtual bool validateAsmConstraint(char c,
957 TargetInfo::ConstraintInfo &info) const {
958 return true;
959 }
960 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
961 unsigned &NumAliases) const {}
962 virtual bool useGlobalsForAutomaticVariables() const {return true;}
963 };
964}
965
Chris Lattner5ba61f02006-10-14 07:39:34 +0000966//===----------------------------------------------------------------------===//
967// Driver code
968//===----------------------------------------------------------------------===//
969
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000970static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000971 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
972 TT[4] == '-' && TT[1] - '3' < 6);
973}
974
Chris Lattner855d0242008-03-05 01:18:20 +0000975/// CreateTargetInfo - Return the target info object for the specified target
976/// triple.
977TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000978 // OS detection; this isn't really anywhere near complete.
979 // Additions and corrections are welcome.
980 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000981 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000982 bool isSolaris = T.find("-solaris") != std::string::npos;
983 bool isLinux = T.find("-linux") != std::string::npos;
984 bool isWindows = T.find("-windows") != std::string::npos ||
985 T.find("-win32") != std::string::npos ||
986 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000987
Eli Friedman873f65a2008-08-21 00:13:15 +0000988 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
989 if (isDarwin)
990 return new DarwinPPCTargetInfo(T);
991 return new PPC32TargetInfo(T);
992 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000993
Eli Friedman873f65a2008-08-21 00:13:15 +0000994 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
995 if (isDarwin)
996 return new DarwinPPC64TargetInfo(T);
997 return new PPC64TargetInfo(T);
998 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000999
Eli Friedman873f65a2008-08-21 00:13:15 +00001000 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
1001 if (isDarwin)
1002 return new DarwinARMTargetInfo(T);
1003 return new ARMTargetInfo(T);
1004 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001005
Eli Friedman873f65a2008-08-21 00:13:15 +00001006 if (T.find("sparc-") == 0) {
1007 if (isSolaris)
1008 return new SolarisSparcV8TargetInfo(T);
1009 return new SparcV8TargetInfo(T);
1010 }
1011
1012 if (T.find("x86_64-") == 0) {
1013 if (isDarwin)
1014 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001015 if (isLinux)
1016 return new LinuxX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001017 return new X86_64TargetInfo(T);
1018 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001019
Chris Lattnerb781dc792008-05-08 05:58:21 +00001020 if (T.find("pic16-") == 0)
1021 return new PIC16TargetInfo(T);
1022
Eli Friedman873f65a2008-08-21 00:13:15 +00001023 if (IsX86(T)) {
1024 if (isDarwin)
1025 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001026 if (isLinux)
1027 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001028 if (isDragonFly)
1029 return new DragonFlyX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001030 if (isWindows)
1031 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001032 return new X86_32TargetInfo(T);
1033 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001034
Chris Lattner855d0242008-03-05 01:18:20 +00001035 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001036}
Ted Kremenekc490bdb2008-03-04 17:47:18 +00001037