blob: 4d3c6b360275fcacc346896096046533366f7cef [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner10a5b382007-01-29 05:24:35 +000015#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000020using namespace clang;
21
Chris Lattner5ba61f02006-10-14 07:39:34 +000022//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000023// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
25
Chris Lattnerb2d486a2007-10-06 06:57:34 +000026static void Define(std::vector<char> &Buf, const char *Macro,
27 const char *Val = "1") {
28 const char *Def = "#define ";
29 Buf.insert(Buf.end(), Def, Def+strlen(Def));
30 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
31 Buf.push_back(' ');
32 Buf.insert(Buf.end(), Val, Val+strlen(Val));
33 Buf.push_back('\n');
34}
35
Eli Friedmanda8f5a92008-08-20 07:28:14 +000036static void getSolarisDefines(std::vector<char> &Defs) {
37 Define(Defs, "__SUN__");
38 Define(Defs, "__SOLARIS__");
39}
Chris Lattner5ba61f02006-10-14 07:39:34 +000040
Chris Lattnerb3793bb2008-09-30 01:00:25 +000041static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +000042 Define(Defs, "__APPLE__");
43 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-09-30 01:00:25 +000044
45 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
46 const char *Darwin = strstr(Triple, "-darwin");
47 if (Darwin) {
Chris Lattner97d74942008-09-30 20:30:12 +000048 char DarwinStr[] = "1000";
Chris Lattnerb3793bb2008-09-30 01:00:25 +000049 Darwin += strlen("-darwin");
Chris Lattner97d74942008-09-30 20:30:12 +000050 if (Darwin[0] >= '0' && Darwin[0] <= '9') {
51 unsigned DarwinNo = Darwin[0]-'0';
52 ++Darwin;
53
54 // Handle "darwin11".
55 if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
56 DarwinNo = 10+Darwin[0]-'0';
57 ++Darwin;
58 }
59
60 if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
Chris Lattnerb3793bb2008-09-30 01:00:25 +000061 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
62 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +000063 }
Chris Lattner97d74942008-09-30 20:30:12 +000064
65 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
66 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
67 Darwin[2] == '\0')
68 DarwinStr[3] = Darwin[1];
69
Chris Lattnerb3793bb2008-09-30 01:00:25 +000070 }
Chris Lattner97d74942008-09-30 20:30:12 +000071 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +000072 }
Eli Friedman3fd920a2008-08-20 02:34:37 +000073}
Chris Lattner5ba61f02006-10-14 07:39:34 +000074
Chris Lattner5637ef52008-08-23 18:23:14 +000075static void getDragonFlyDefines(std::vector<char> &Defs) {
76 // DragonFly defines; list based off of gcc output
77 Define(Defs, "__DragonFly__");
78 Define(Defs, "__DragonFly_cc_version", "100001");
79 Define(Defs, "__ELF__");
80 Define(Defs, "__KPRINTF_ATTRIBUTE__");
81 Define(Defs, "__tune_i386__");
82 Define(Defs, "unix");
83 Define(Defs, "__unix");
84 Define(Defs, "__unix__");
85}
86
Eli Friedmanff594f22008-08-21 00:24:02 +000087static void getLinuxDefines(std::vector<char> &Defs) {
88 // Linux defines; list based off of gcc output
89 Define(Defs, "__unix__");
90 Define(Defs, "__unix");
91 Define(Defs, "unix");
92 Define(Defs, "__linux__");
93 Define(Defs, "__linux");
94 Define(Defs, "linux");
95 Define(Defs, "__gnu_linux__");
96}
97
Chris Lattner1f5ad112006-10-14 18:32:12 +000098/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
99/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000100static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000101 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000102 Define(Defs, "__ppc__");
103 Define(Defs, "_ARCH_PPC");
104 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000105 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000106 Define(Defs, "_ARCH_PPC64");
107 Define(Defs, "_LP64");
108 Define(Defs, "__LP64__");
109 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000110 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000111 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000112 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000113
Chris Lattner9c837532006-10-15 01:05:46 +0000114 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000115 Define(Defs, "_BIG_ENDIAN");
116 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000117
118 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000119 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
120 Define(Defs, "__INTMAX_TYPE__", "long int");
121 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
122 Define(Defs, "__PTRDIFF_TYPE__", "long int");
123 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000124 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000125 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
126 Define(Defs, "__INTMAX_TYPE__", "long long int");
127 Define(Defs, "__LONG_MAX__", "2147483647L");
128 Define(Defs, "__PTRDIFF_TYPE__", "int");
129 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000130 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000131 Define(Defs, "__INT_MAX__", "2147483647");
132 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
133 Define(Defs, "__CHAR_BIT__", "8");
134 Define(Defs, "__SCHAR_MAX__", "127");
135 Define(Defs, "__SHRT_MAX__", "32767");
136 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000137
138 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000139 Define(Defs, "__USER_LABEL_PREFIX__", "_");
140 Define(Defs, "__NATURAL_ALIGNMENT__");
141 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000142
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000143 Define(Defs, "__WCHAR_MAX__", "2147483647");
144 Define(Defs, "__WCHAR_TYPE__", "int");
145 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000146
147 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000148 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
149 Define(Defs, "__FLT_DIG__", "6");
150 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
151 Define(Defs, "__FLT_EVAL_METHOD__", "0");
152 Define(Defs, "__FLT_HAS_INFINITY__");
153 Define(Defs, "__FLT_HAS_QUIET_NAN__");
154 Define(Defs, "__FLT_MANT_DIG__", "24");
155 Define(Defs, "__FLT_MAX_10_EXP__", "38");
156 Define(Defs, "__FLT_MAX_EXP__", "128");
157 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
158 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
159 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
160 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
161 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000162
163 // double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000164 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
165 Define(Defs, "__DBL_DIG__", "15");
166 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
167 Define(Defs, "__DBL_HAS_INFINITY__");
168 Define(Defs, "__DBL_HAS_QUIET_NAN__");
169 Define(Defs, "__DBL_MANT_DIG__", "53");
170 Define(Defs, "__DBL_MAX_10_EXP__", "308");
171 Define(Defs, "__DBL_MAX_EXP__", "1024");
172 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
173 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
174 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
175 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
176 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner9c837532006-10-15 01:05:46 +0000177
178 // 128-bit long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000179 Define(Defs, "__LDBL_DENORM_MIN__",
180 "4.94065645841246544176568792868221e-324L");
181 Define(Defs, "__LDBL_DIG__", "31");
182 Define(Defs, "__LDBL_EPSILON__",
183 "4.94065645841246544176568792868221e-324L");
184 Define(Defs, "__LDBL_HAS_INFINITY__");
185 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
186 Define(Defs, "__LDBL_MANT_DIG__", "106");
187 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
188 Define(Defs, "__LDBL_MAX_EXP__", "1024");
189 Define(Defs, "__LDBL_MAX__",
190 "1.79769313486231580793728971405301e+308L");
191 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
192 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
193 Define(Defs, "__LDBL_MIN__",
194 "2.00416836000897277799610805135016e-292L");
195 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000196}
197
198/// getX86Defines - Return a set of the X86-specific #defines that are
199/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000200static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000201 // Target identification.
202 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000203 Define(Defs, "_LP64");
204 Define(Defs, "__LP64__");
205 Define(Defs, "__amd64__");
206 Define(Defs, "__amd64");
207 Define(Defs, "__x86_64");
208 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000209 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000210 Define(Defs, "__i386__");
211 Define(Defs, "__i386");
212 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000213 }
214
215 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000216 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000217
218 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000219 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
220 Define(Defs, "__INTMAX_TYPE__", "long int");
221 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
222 Define(Defs, "__PTRDIFF_TYPE__", "long int");
223 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000224 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000225 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
226 Define(Defs, "__INTMAX_TYPE__", "long long int");
227 Define(Defs, "__LONG_MAX__", "2147483647L");
228 Define(Defs, "__PTRDIFF_TYPE__", "int");
229 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000230 }
Anders Carlsson35a56362008-07-22 17:16:13 +0000231 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000232 Define(Defs, "__CHAR_BIT__", "8");
233 Define(Defs, "__INT_MAX__", "2147483647");
234 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
235 Define(Defs, "__SCHAR_MAX__", "127");
236 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner9c837532006-10-15 01:05:46 +0000237
238 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000239 Define(Defs, "__nocona");
240 Define(Defs, "__nocona__");
241 Define(Defs, "__tune_nocona__");
242 Define(Defs, "__SSE2_MATH__");
243 Define(Defs, "__SSE2__");
244 Define(Defs, "__SSE_MATH__");
245 Define(Defs, "__SSE__");
246 Define(Defs, "__MMX__");
247 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000248
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000249 Define(Defs, "__WCHAR_MAX__", "2147483647");
250 Define(Defs, "__WCHAR_TYPE__", "int");
251 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000252
253 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000254 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
255 Define(Defs, "__FLT_DIG__", "6");
256 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
257 Define(Defs, "__FLT_EVAL_METHOD__", "0");
258 Define(Defs, "__FLT_HAS_INFINITY__");
259 Define(Defs, "__FLT_HAS_QUIET_NAN__");
260 Define(Defs, "__FLT_MANT_DIG__", "24");
261 Define(Defs, "__FLT_MAX_10_EXP__", "38");
262 Define(Defs, "__FLT_MAX_EXP__", "128");
263 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
264 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
265 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
266 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
267 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000268
269 // Double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000270 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
271 Define(Defs, "__DBL_DIG__", "15");
272 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
273 Define(Defs, "__DBL_HAS_INFINITY__");
274 Define(Defs, "__DBL_HAS_QUIET_NAN__");
275 Define(Defs, "__DBL_MANT_DIG__", "53");
276 Define(Defs, "__DBL_MAX_10_EXP__", "308");
277 Define(Defs, "__DBL_MAX_EXP__", "1024");
278 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
279 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
280 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
281 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
282 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner9c837532006-10-15 01:05:46 +0000283
284 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000285 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
286 Define(Defs, "__LDBL_DIG__", "18");
287 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
288 Define(Defs, "__LDBL_HAS_INFINITY__");
289 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
290 Define(Defs, "__LDBL_MANT_DIG__", "64");
291 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
292 Define(Defs, "__LDBL_MAX_EXP__", "16384");
293 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
294 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
295 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
296 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000297}
298
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000299/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000300/// not tied to a specific subtarget.
301static void getARMDefines(std::vector<char> &Defs) {
302 // Target identification.
303 Define(Defs, "__arm");
304 Define(Defs, "__arm__");
305
306 // Target properties.
307 Define(Defs, "__LITTLE_ENDIAN__");
308
309 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
310 Define(Defs, "__INTMAX_TYPE__", "long long int");
311 Define(Defs, "__LONG_MAX__", "2147483647L");
312 Define(Defs, "__PTRDIFF_TYPE__", "int");
313 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
314 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
315
316 Define(Defs, "__CHAR_BIT__", "8");
317 Define(Defs, "__INT_MAX__", "2147483647");
318 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
319 Define(Defs, "__SCHAR_MAX__", "127");
320 Define(Defs, "__SHRT_MAX__", "32767");
321
322 // Subtarget options. [hard coded to v6 for now]
323 Define(Defs, "__ARM_ARCH_6K__");
324 Define(Defs, "__ARMEL__");
325 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
326
327 Define(Defs, "__WCHAR_MAX__", "2147483647");
328 Define(Defs, "__WCHAR_TYPE__", "int");
329 Define(Defs, "__WINT_TYPE__", "int");
330 Define(Defs, "__DECIMAL_DIG__", "17");
331 Define(Defs, "__FLT_RADIX__", "2");
332
333 // Float macros.
334 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
335 Define(Defs, "__FLT_DIG__", "6");
336 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
337 Define(Defs, "__FLT_EVAL_METHOD__", "0");
338 Define(Defs, "__FLT_HAS_INFINITY__");
339 Define(Defs, "__FLT_HAS_QUIET_NAN__");
340 Define(Defs, "__FLT_MANT_DIG__", "24");
341 Define(Defs, "__FLT_MAX_10_EXP__", "38");
342 Define(Defs, "__FLT_MAX_EXP__", "128");
343 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
344 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
345 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
346 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
347
348 // Double macros.
349 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
350 Define(Defs, "__DBL_DIG__", "15");
351 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
352 Define(Defs, "__DBL_HAS_INFINITY__");
353 Define(Defs, "__DBL_HAS_QUIET_NAN__");
354 Define(Defs, "__DBL_MANT_DIG__", "53");
355 Define(Defs, "__DBL_MAX_10_EXP__", "308");
356 Define(Defs, "__DBL_MAX_EXP__", "1024");
357 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
358 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
359 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
360 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
361
362 // 64-bit Long double macros (same as double).
363 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
364 Define(Defs, "__LDBL_DIG__", "15");
365 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
366 Define(Defs, "__LDBL_HAS_INFINITY__");
367 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
368 Define(Defs, "__LDBL_MANT_DIG__", "53");
369 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
370 Define(Defs, "__LDBL_MAX_EXP__", "1024");
371 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
372 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
373 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
374 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
375}
376
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000377//===----------------------------------------------------------------------===//
378// Specific target implementations.
379//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000380
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000381namespace {
382// PPC abstract base class
383class PPCTargetInfo : public TargetInfo {
384 static const Builtin::Info BuiltinInfo[];
385 static const char * const GCCRegNames[];
386 static const TargetInfo::GCCRegAlias GCCRegAliases[];
387
388public:
389 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
390 CharIsSigned = false;
391 }
392 virtual void getTargetBuiltins(const Builtin::Info *&Records,
393 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000394 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000395 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000396 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000397 virtual const char *getVAListDeclaration() const {
398 return "typedef struct __va_list_tag {"
399 " unsigned char gpr;"
400 " unsigned char fpr;"
401 " unsigned short reserved;"
402 " void* overflow_arg_area;"
403 " void* reg_save_area;"
404 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000405 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000406 virtual const char *getTargetPrefix() const {
407 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000408 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000409 virtual void getGCCRegNames(const char * const *&Names,
410 unsigned &NumNames) const;
411 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
412 unsigned &NumAliases) const;
413 virtual bool validateAsmConstraint(char c,
414 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000415 switch (c) {
416 default: return false;
417 case 'O': // Zero
418 return true;
419 case 'b': // Base register
420 case 'f': // Floating point register
421 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
422 return true;
423 }
424 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000425 virtual const char *getClobbers() const {
426 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000427 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000428};
Anders Carlssonf511f642007-11-27 04:11:28 +0000429
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000430const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
431#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
432#include "clang/AST/PPCBuiltins.def"
433};
Chris Lattner17df24e2008-04-21 18:56:49 +0000434
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000435const char * const PPCTargetInfo::GCCRegNames[] = {
436 "0", "1", "2", "3", "4", "5", "6", "7",
437 "8", "9", "10", "11", "12", "13", "14", "15",
438 "16", "17", "18", "19", "20", "21", "22", "23",
439 "24", "25", "26", "27", "28", "29", "30", "31",
440 "0", "1", "2", "3", "4", "5", "6", "7",
441 "8", "9", "10", "11", "12", "13", "14", "15",
442 "16", "17", "18", "19", "20", "21", "22", "23",
443 "24", "25", "26", "27", "28", "29", "30", "31",
444 "mq", "lr", "ctr", "ap",
445 "0", "1", "2", "3", "4", "5", "6", "7",
446 "xer",
447 "0", "1", "2", "3", "4", "5", "6", "7",
448 "8", "9", "10", "11", "12", "13", "14", "15",
449 "16", "17", "18", "19", "20", "21", "22", "23",
450 "24", "25", "26", "27", "28", "29", "30", "31",
451 "vrsave", "vscr",
452 "spe_acc", "spefscr",
453 "sfp"
454};
Chris Lattner10a5b382007-01-29 05:24:35 +0000455
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000456void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
457 unsigned &NumNames) const {
458 Names = GCCRegNames;
459 NumNames = llvm::array_lengthof(GCCRegNames);
460}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000461
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000462const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
463 // While some of these aliases do map to different registers
464 // they still share the same register name.
465 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
466 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
467 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
468 { { "cr3", "fr3", "r3", "v3"}, "3" },
469 { { "cr4", "fr4", "r4", "v4"}, "4" },
470 { { "cr5", "fr5", "r5", "v5"}, "5" },
471 { { "cr6", "fr6", "r6", "v6"}, "6" },
472 { { "cr7", "fr7", "r7", "v7"}, "7" },
473 { { "fr8", "r8", "v8"}, "8" },
474 { { "fr9", "r9", "v9"}, "9" },
475 { { "fr10", "r10", "v10"}, "10" },
476 { { "fr11", "r11", "v11"}, "11" },
477 { { "fr12", "r12", "v12"}, "12" },
478 { { "fr13", "r13", "v13"}, "13" },
479 { { "fr14", "r14", "v14"}, "14" },
480 { { "fr15", "r15", "v15"}, "15" },
481 { { "fr16", "r16", "v16"}, "16" },
482 { { "fr17", "r17", "v17"}, "17" },
483 { { "fr18", "r18", "v18"}, "18" },
484 { { "fr19", "r19", "v19"}, "19" },
485 { { "fr20", "r20", "v20"}, "20" },
486 { { "fr21", "r21", "v21"}, "21" },
487 { { "fr22", "r22", "v22"}, "22" },
488 { { "fr23", "r23", "v23"}, "23" },
489 { { "fr24", "r24", "v24"}, "24" },
490 { { "fr25", "r25", "v25"}, "25" },
491 { { "fr26", "r26", "v26"}, "26" },
492 { { "fr27", "r27", "v27"}, "27" },
493 { { "fr28", "r28", "v28"}, "28" },
494 { { "fr29", "r29", "v29"}, "29" },
495 { { "fr30", "r30", "v30"}, "30" },
496 { { "fr31", "r31", "v31"}, "31" },
497};
498
499void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
500 unsigned &NumAliases) const {
501 Aliases = GCCRegAliases;
502 NumAliases = llvm::array_lengthof(GCCRegAliases);
503}
504} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000505
Chris Lattner5ba61f02006-10-14 07:39:34 +0000506namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000507class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000508public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000509 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
510 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
511 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
512 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000513 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000514 getPowerPCDefines(Defines, false);
515 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000516};
517} // end anonymous namespace.
518
519namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000520class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000521public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000522 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000523 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000524 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
525 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000526 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000527 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000528 getPowerPCDefines(Defines, true);
529 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000530};
531} // end anonymous namespace.
532
533namespace {
534class DarwinPPCTargetInfo : public PPC32TargetInfo {
535public:
536 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
537 virtual void getTargetDefines(std::vector<char> &Defines) const {
538 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000539 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000540 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000541
542 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000543};
544} // end anonymous namespace.
545
546namespace {
547class DarwinPPC64TargetInfo : public PPC64TargetInfo {
548public:
549 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
550 virtual void getTargetDefines(std::vector<char> &Defines) const {
551 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000552 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000553 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000554
555 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000556};
557} // end anonymous namespace.
558
559namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000560// Namespace for x86 abstract base class
561const Builtin::Info BuiltinInfo[] = {
562#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
563#include "clang/AST/X86Builtins.def"
564};
Eli Friedmanb5366062008-05-20 14:21:01 +0000565
Eli Friedman3fd920a2008-08-20 02:34:37 +0000566const char *GCCRegNames[] = {
567 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
568 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
569 "argp", "flags", "fspr", "dirflag", "frame",
570 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
571 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
572 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
573 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
574};
575
576const TargetInfo::GCCRegAlias GCCRegAliases[] = {
577 { { "al", "ah", "eax", "rax" }, "ax" },
578 { { "bl", "bh", "ebx", "rbx" }, "bx" },
579 { { "cl", "ch", "ecx", "rcx" }, "cx" },
580 { { "dl", "dh", "edx", "rdx" }, "dx" },
581 { { "esi", "rsi" }, "si" },
582 { { "edi", "rdi" }, "di" },
583 { { "esp", "rsp" }, "sp" },
584 { { "ebp", "rbp" }, "bp" },
585};
586
587// X86 target abstract base class; x86-32 and x86-64 are very close, so
588// most of the implementation can be shared.
589class X86TargetInfo : public TargetInfo {
590public:
591 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
592 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000593 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000594 virtual void getTargetBuiltins(const Builtin::Info *&Records,
595 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000596 Records = BuiltinInfo;
597 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000598 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000599 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000600 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000601 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000602 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000603 unsigned &NumNames) const {
604 Names = GCCRegNames;
605 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000606 }
607 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
608 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000609 Aliases = GCCRegAliases;
610 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000611 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000612 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000613 TargetInfo::ConstraintInfo &info) const;
614 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000615 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000616 return "~{dirflag},~{fpsr},~{flags}";
617 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000618};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000619
620bool
621X86TargetInfo::validateAsmConstraint(char c,
622 TargetInfo::ConstraintInfo &info) const {
623 switch (c) {
624 default: return false;
625 case 'a': // eax.
626 case 'b': // ebx.
627 case 'c': // ecx.
628 case 'd': // edx.
629 case 'S': // esi.
630 case 'D': // edi.
631 case 'A': // edx:eax.
632 case 't': // top of floating point stack.
633 case 'u': // second from top of floating point stack.
634 case 'q': // Any register accessible as [r]l: a, b, c, and d.
635 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
636 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
637 // instructions.
638 case 'N': // unsigned 8-bit integer constant for use with in and out
639 // instructions.
640 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
641 return true;
642 }
643}
644
645std::string
646X86TargetInfo::convertConstraint(const char Constraint) const {
647 switch (Constraint) {
648 case 'a': return std::string("{ax}");
649 case 'b': return std::string("{bx}");
650 case 'c': return std::string("{cx}");
651 case 'd': return std::string("{dx}");
652 case 'S': return std::string("{si}");
653 case 'D': return std::string("{di}");
654 case 't': // top of floating point stack.
655 return std::string("{st}");
656 case 'u': // second from top of floating point stack.
657 return std::string("{st(1)}"); // second from top of floating point stack.
658 default:
659 return std::string(1, Constraint);
660 }
661}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000662} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000663
664namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000665// X86-32 generic target
666class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000667public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000668 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
669 DoubleAlign = LongLongAlign = 32;
670 LongDoubleWidth = 96;
671 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000672 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
673 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
674 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000675 }
676 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000677 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000678 }
679 virtual void getTargetDefines(std::vector<char> &Defines) const {
680 getX86Defines(Defines, false);
681 }
682};
683} // end anonymous namespace
684
685namespace {
686// x86-32 Darwin (OS X) target
687class DarwinI386TargetInfo : public X86_32TargetInfo {
688public:
689 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
690 LongDoubleWidth = 128;
691 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000692 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
693 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
694 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000695 }
696 virtual void getTargetDefines(std::vector<char> &Defines) const {
697 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000698 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000699 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000700 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000701};
702} // end anonymous namespace
703
704namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000705// x86-32 DragonFly target
706class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
707public:
708 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
709 }
710 virtual void getTargetDefines(std::vector<char> &Defines) const {
711 X86_32TargetInfo::getTargetDefines(Defines);
712 getDragonFlyDefines(Defines);
713 }
714};
715} // end anonymous namespace
716
717namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000718// x86-32 Linux target
719class LinuxX86_32TargetInfo : public X86_32TargetInfo {
720public:
721 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
722 }
723 virtual void getTargetDefines(std::vector<char> &Defines) const {
724 X86_32TargetInfo::getTargetDefines(Defines);
725 getLinuxDefines(Defines);
Eli Friedman6565d452008-09-06 01:37:51 +0000726 Define(Defines, "__USER_LABEL_PREFIX__", "");
Eli Friedmanff594f22008-08-21 00:24:02 +0000727 }
728};
729} // end anonymous namespace
730
731namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000732// x86-32 Windows target
733class WindowsX86_32TargetInfo : public X86_32TargetInfo {
734public:
735 WindowsX86_32TargetInfo(const std::string& triple)
736 : X86_32TargetInfo(triple) {
737 // FIXME: Fix wchar_t.
738 // FIXME: We should probably enable -fms-extensions by default for
739 // this target.
740 }
741 virtual void getTargetDefines(std::vector<char> &Defines) const {
742 X86_32TargetInfo::getTargetDefines(Defines);
743 // This list is based off of the the list of things MingW defines
744 Define(Defines, "__WIN32__");
745 Define(Defines, "__WIN32");
746 Define(Defines, "_WIN32");
747 Define(Defines, "WIN32");
748 Define(Defines, "__WINNT__");
749 Define(Defines, "__WINNT");
750 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000751 Define(Defines, "_X86_");
752 Define(Defines, "__MSVCRT__");
Eli Friedman6565d452008-09-06 01:37:51 +0000753 Define(Defines, "__USER_LABEL_PREFIX__", "_");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000754 }
755};
756} // end anonymous namespace
757
758namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000759// x86-64 generic target
760class X86_64TargetInfo : public X86TargetInfo {
761public:
762 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000763 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000764 LongDoubleWidth = 128;
765 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000766 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
767 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
768 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000769 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000770 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000771 return "typedef struct __va_list_tag {"
772 " unsigned gp_offset;"
773 " unsigned fp_offset;"
774 " void* overflow_arg_area;"
775 " void* reg_save_area;"
776 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000777 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000778 virtual void getTargetDefines(std::vector<char> &Defines) const {
779 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000780 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000781};
782} // end anonymous namespace
783
784namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000785// x86-64 Linux target
786class LinuxX86_64TargetInfo : public X86_64TargetInfo {
787public:
788 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
789 }
790 virtual void getTargetDefines(std::vector<char> &Defines) const {
791 X86_64TargetInfo::getTargetDefines(Defines);
792 getLinuxDefines(Defines);
793 Define(Defines, "__USER_LABEL_PREFIX__", "");
794 }
795};
796} // end anonymous namespace
797
798namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000799// x86-64 Darwin (OS X) target
800class DarwinX86_64TargetInfo : public X86_64TargetInfo {
801public:
802 DarwinX86_64TargetInfo(const std::string& triple) :
803 X86_64TargetInfo(triple) {}
804
805 virtual void getTargetDefines(std::vector<char> &Defines) const {
806 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000807 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000808 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000809
810 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000811};
812} // end anonymous namespace.
813
Chris Lattner17df24e2008-04-21 18:56:49 +0000814namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000815class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000816public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000817 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
818 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000819 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
820 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000821 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000822 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000823 getARMDefines(Defines);
824 }
825 virtual void getTargetBuiltins(const Builtin::Info *&Records,
826 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000827 // FIXME: Implement.
828 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000829 NumRecords = 0;
830 }
831 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000832 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000833 }
834 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000835 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000836 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000837 virtual void getGCCRegNames(const char * const *&Names,
838 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000839 // FIXME: Implement.
840 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000841 NumNames = 0;
842 }
843 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
844 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000845 // FIXME: Implement.
846 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000847 NumAliases = 0;
848 }
849 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000850 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000851 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000852 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000853 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000854 case 'l': // r0-r7
855 case 'h': // r8-r15
856 case 'w': // VFP Floating point register single precision
857 case 'P': // VFP Floating point register double precision
858 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
859 return true;
860 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000861 return false;
862 }
863 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000864 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000865 return "";
866 }
867};
868} // end anonymous namespace.
869
Eli Friedmanf05b7722008-08-20 07:44:10 +0000870
871namespace {
872class DarwinARMTargetInfo : public ARMTargetInfo {
873public:
874 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
875
876 virtual void getTargetDefines(std::vector<char> &Defines) const {
877 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000878 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000879 }
880};
881} // end anonymous namespace.
882
Chris Lattner5ba61f02006-10-14 07:39:34 +0000883namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000884class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000885public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000886 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
887 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000888 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
889 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000890 }
Gabor Greif49991682008-02-21 16:29:08 +0000891 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000892 // FIXME: This is missing a lot of important defines; some of the
893 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000894 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000895 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000896 Define(Defines, "__sparcv8");
897 }
898 virtual void getTargetBuiltins(const Builtin::Info *&Records,
899 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000900 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000901 }
902 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000903 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000904 }
905 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000906 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000907 }
908 virtual void getGCCRegNames(const char * const *&Names,
909 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000910 // FIXME: Implement!
911 Names = 0;
912 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000913 }
914 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
915 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000916 // FIXME: Implement!
917 Aliases = 0;
918 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000919 }
920 virtual bool validateAsmConstraint(char c,
921 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000922 // FIXME: Implement!
923 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000924 }
925 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000926 // FIXME: Implement!
927 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000928 }
929};
930
931} // end anonymous namespace.
932
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000933namespace {
934class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
935public:
936 SolarisSparcV8TargetInfo(const std::string& triple) :
937 SparcV8TargetInfo(triple) {}
938
939 virtual void getTargetDefines(std::vector<char> &Defines) const {
940 SparcV8TargetInfo::getTargetDefines(Defines);
941 getSolarisDefines(Defines);
942 }
943};
944} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000945
Chris Lattnerb781dc792008-05-08 05:58:21 +0000946namespace {
947 class PIC16TargetInfo : public TargetInfo{
948 public:
949 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000950 // FIXME: Is IntAlign really supposed to be 16? There seems
951 // little point on a platform with 8-bit loads.
952 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
953 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000954 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000955 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000956 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
957 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000958 virtual void getTargetDefines(std::vector<char> &Defines) const {
959 Define(Defines, "__pic16");
960 }
961 virtual void getTargetBuiltins(const Builtin::Info *&Records,
962 unsigned &NumRecords) const {}
963 virtual const char *getVAListDeclaration() const { return "";}
964 virtual const char *getClobbers() const {return "";}
965 virtual const char *getTargetPrefix() const {return "";}
966 virtual void getGCCRegNames(const char * const *&Names,
967 unsigned &NumNames) const {}
968 virtual bool validateAsmConstraint(char c,
969 TargetInfo::ConstraintInfo &info) const {
970 return true;
971 }
972 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
973 unsigned &NumAliases) const {}
974 virtual bool useGlobalsForAutomaticVariables() const {return true;}
975 };
976}
977
Chris Lattner5ba61f02006-10-14 07:39:34 +0000978//===----------------------------------------------------------------------===//
979// Driver code
980//===----------------------------------------------------------------------===//
981
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000982static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000983 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
984 TT[4] == '-' && TT[1] - '3' < 6);
985}
986
Chris Lattner855d0242008-03-05 01:18:20 +0000987/// CreateTargetInfo - Return the target info object for the specified target
988/// triple.
989TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000990 // OS detection; this isn't really anywhere near complete.
991 // Additions and corrections are welcome.
992 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000993 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000994 bool isSolaris = T.find("-solaris") != std::string::npos;
995 bool isLinux = T.find("-linux") != std::string::npos;
996 bool isWindows = T.find("-windows") != std::string::npos ||
997 T.find("-win32") != std::string::npos ||
998 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000999
Eli Friedman873f65a2008-08-21 00:13:15 +00001000 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1001 if (isDarwin)
1002 return new DarwinPPCTargetInfo(T);
1003 return new PPC32TargetInfo(T);
1004 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001005
Eli Friedman873f65a2008-08-21 00:13:15 +00001006 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1007 if (isDarwin)
1008 return new DarwinPPC64TargetInfo(T);
1009 return new PPC64TargetInfo(T);
1010 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001011
Eli Friedman873f65a2008-08-21 00:13:15 +00001012 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
1013 if (isDarwin)
1014 return new DarwinARMTargetInfo(T);
1015 return new ARMTargetInfo(T);
1016 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001017
Eli Friedman873f65a2008-08-21 00:13:15 +00001018 if (T.find("sparc-") == 0) {
1019 if (isSolaris)
1020 return new SolarisSparcV8TargetInfo(T);
1021 return new SparcV8TargetInfo(T);
1022 }
1023
1024 if (T.find("x86_64-") == 0) {
1025 if (isDarwin)
1026 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001027 if (isLinux)
1028 return new LinuxX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001029 return new X86_64TargetInfo(T);
1030 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001031
Chris Lattnerb781dc792008-05-08 05:58:21 +00001032 if (T.find("pic16-") == 0)
1033 return new PIC16TargetInfo(T);
1034
Eli Friedman873f65a2008-08-21 00:13:15 +00001035 if (IsX86(T)) {
1036 if (isDarwin)
1037 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001038 if (isLinux)
1039 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001040 if (isDragonFly)
1041 return new DragonFlyX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001042 if (isWindows)
1043 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001044 return new X86_32TargetInfo(T);
1045 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001046
Chris Lattner855d0242008-03-05 01:18:20 +00001047 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001048}
Ted Kremenekc490bdb2008-03-04 17:47:18 +00001049