blob: 7aad3e86545fc9615e598a21264c88e26ed39716 [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");
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000132 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000133
134 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000135 Define(Defs, "__NATURAL_ALIGNMENT__");
136 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000137
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000138 Define(Defs, "__WCHAR_MAX__", "2147483647");
139 Define(Defs, "__WCHAR_TYPE__", "int");
140 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000141
142 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000143 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
144 Define(Defs, "__FLT_DIG__", "6");
145 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
146 Define(Defs, "__FLT_EVAL_METHOD__", "0");
147 Define(Defs, "__FLT_HAS_INFINITY__");
148 Define(Defs, "__FLT_HAS_QUIET_NAN__");
149 Define(Defs, "__FLT_MANT_DIG__", "24");
150 Define(Defs, "__FLT_MAX_10_EXP__", "38");
151 Define(Defs, "__FLT_MAX_EXP__", "128");
152 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
153 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
154 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
155 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
156 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000157
158 // double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000159 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
160 Define(Defs, "__DBL_DIG__", "15");
161 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
162 Define(Defs, "__DBL_HAS_INFINITY__");
163 Define(Defs, "__DBL_HAS_QUIET_NAN__");
164 Define(Defs, "__DBL_MANT_DIG__", "53");
165 Define(Defs, "__DBL_MAX_10_EXP__", "308");
166 Define(Defs, "__DBL_MAX_EXP__", "1024");
167 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
168 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
169 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
170 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
171 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner9c837532006-10-15 01:05:46 +0000172
173 // 128-bit long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000174 Define(Defs, "__LDBL_DENORM_MIN__",
175 "4.94065645841246544176568792868221e-324L");
176 Define(Defs, "__LDBL_DIG__", "31");
177 Define(Defs, "__LDBL_EPSILON__",
178 "4.94065645841246544176568792868221e-324L");
179 Define(Defs, "__LDBL_HAS_INFINITY__");
180 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
181 Define(Defs, "__LDBL_MANT_DIG__", "106");
182 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
183 Define(Defs, "__LDBL_MAX_EXP__", "1024");
184 Define(Defs, "__LDBL_MAX__",
185 "1.79769313486231580793728971405301e+308L");
186 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
187 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
188 Define(Defs, "__LDBL_MIN__",
189 "2.00416836000897277799610805135016e-292L");
190 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000191}
192
193/// getX86Defines - Return a set of the X86-specific #defines that are
194/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000195static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000196 // Target identification.
197 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000198 Define(Defs, "_LP64");
199 Define(Defs, "__LP64__");
200 Define(Defs, "__amd64__");
201 Define(Defs, "__amd64");
202 Define(Defs, "__x86_64");
203 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000204 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000205 Define(Defs, "__i386__");
206 Define(Defs, "__i386");
207 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000208 }
209
210 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000211 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000212
213 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000214 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
215 Define(Defs, "__INTMAX_TYPE__", "long int");
216 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
217 Define(Defs, "__PTRDIFF_TYPE__", "long int");
218 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000219 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000220 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
221 Define(Defs, "__INTMAX_TYPE__", "long long int");
222 Define(Defs, "__LONG_MAX__", "2147483647L");
223 Define(Defs, "__PTRDIFF_TYPE__", "int");
224 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000225 }
Anders Carlsson35a56362008-07-22 17:16:13 +0000226 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000227 Define(Defs, "__INT_MAX__", "2147483647");
Chris Lattner9c837532006-10-15 01:05:46 +0000228
229 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000230 Define(Defs, "__nocona");
231 Define(Defs, "__nocona__");
232 Define(Defs, "__tune_nocona__");
233 Define(Defs, "__SSE2_MATH__");
234 Define(Defs, "__SSE2__");
235 Define(Defs, "__SSE_MATH__");
236 Define(Defs, "__SSE__");
237 Define(Defs, "__MMX__");
238 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000239
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000240 Define(Defs, "__WCHAR_MAX__", "2147483647");
241 Define(Defs, "__WCHAR_TYPE__", "int");
242 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000243
244 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000245 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
246 Define(Defs, "__FLT_DIG__", "6");
247 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
248 Define(Defs, "__FLT_EVAL_METHOD__", "0");
249 Define(Defs, "__FLT_HAS_INFINITY__");
250 Define(Defs, "__FLT_HAS_QUIET_NAN__");
251 Define(Defs, "__FLT_MANT_DIG__", "24");
252 Define(Defs, "__FLT_MAX_10_EXP__", "38");
253 Define(Defs, "__FLT_MAX_EXP__", "128");
254 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
255 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
256 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
257 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
258 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000259
260 // Double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000261 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
262 Define(Defs, "__DBL_DIG__", "15");
263 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
264 Define(Defs, "__DBL_HAS_INFINITY__");
265 Define(Defs, "__DBL_HAS_QUIET_NAN__");
266 Define(Defs, "__DBL_MANT_DIG__", "53");
267 Define(Defs, "__DBL_MAX_10_EXP__", "308");
268 Define(Defs, "__DBL_MAX_EXP__", "1024");
269 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
270 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
271 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
272 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
273 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner9c837532006-10-15 01:05:46 +0000274
275 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000276 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
277 Define(Defs, "__LDBL_DIG__", "18");
278 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
279 Define(Defs, "__LDBL_HAS_INFINITY__");
280 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
281 Define(Defs, "__LDBL_MANT_DIG__", "64");
282 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
283 Define(Defs, "__LDBL_MAX_EXP__", "16384");
284 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
285 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
286 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
287 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000288}
289
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000290/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000291/// not tied to a specific subtarget.
292static void getARMDefines(std::vector<char> &Defs) {
293 // Target identification.
294 Define(Defs, "__arm");
295 Define(Defs, "__arm__");
296
297 // Target properties.
298 Define(Defs, "__LITTLE_ENDIAN__");
299
300 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
301 Define(Defs, "__INTMAX_TYPE__", "long long int");
302 Define(Defs, "__LONG_MAX__", "2147483647L");
303 Define(Defs, "__PTRDIFF_TYPE__", "int");
304 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
305 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
306
Chris Lattner17df24e2008-04-21 18:56:49 +0000307 Define(Defs, "__INT_MAX__", "2147483647");
Chris Lattner17df24e2008-04-21 18:56:49 +0000308
309 // Subtarget options. [hard coded to v6 for now]
310 Define(Defs, "__ARM_ARCH_6K__");
311 Define(Defs, "__ARMEL__");
312 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
313
314 Define(Defs, "__WCHAR_MAX__", "2147483647");
315 Define(Defs, "__WCHAR_TYPE__", "int");
316 Define(Defs, "__WINT_TYPE__", "int");
317 Define(Defs, "__DECIMAL_DIG__", "17");
318 Define(Defs, "__FLT_RADIX__", "2");
319
320 // Float macros.
321 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
322 Define(Defs, "__FLT_DIG__", "6");
323 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
324 Define(Defs, "__FLT_EVAL_METHOD__", "0");
325 Define(Defs, "__FLT_HAS_INFINITY__");
326 Define(Defs, "__FLT_HAS_QUIET_NAN__");
327 Define(Defs, "__FLT_MANT_DIG__", "24");
328 Define(Defs, "__FLT_MAX_10_EXP__", "38");
329 Define(Defs, "__FLT_MAX_EXP__", "128");
330 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
331 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
332 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
333 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
334
335 // Double macros.
336 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
337 Define(Defs, "__DBL_DIG__", "15");
338 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
339 Define(Defs, "__DBL_HAS_INFINITY__");
340 Define(Defs, "__DBL_HAS_QUIET_NAN__");
341 Define(Defs, "__DBL_MANT_DIG__", "53");
342 Define(Defs, "__DBL_MAX_10_EXP__", "308");
343 Define(Defs, "__DBL_MAX_EXP__", "1024");
344 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
345 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
346 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
347 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
348
349 // 64-bit Long double macros (same as double).
350 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
351 Define(Defs, "__LDBL_DIG__", "15");
352 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
353 Define(Defs, "__LDBL_HAS_INFINITY__");
354 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
355 Define(Defs, "__LDBL_MANT_DIG__", "53");
356 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
357 Define(Defs, "__LDBL_MAX_EXP__", "1024");
358 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
359 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
360 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
361 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
362}
363
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000364//===----------------------------------------------------------------------===//
365// Specific target implementations.
366//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000367
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000368namespace {
369// PPC abstract base class
370class PPCTargetInfo : public TargetInfo {
371 static const Builtin::Info BuiltinInfo[];
372 static const char * const GCCRegNames[];
373 static const TargetInfo::GCCRegAlias GCCRegAliases[];
374
375public:
376 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
377 CharIsSigned = false;
378 }
379 virtual void getTargetBuiltins(const Builtin::Info *&Records,
380 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000381 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000382 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000383 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000384 virtual const char *getVAListDeclaration() const {
385 return "typedef struct __va_list_tag {"
386 " unsigned char gpr;"
387 " unsigned char fpr;"
388 " unsigned short reserved;"
389 " void* overflow_arg_area;"
390 " void* reg_save_area;"
391 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000392 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000393 virtual const char *getTargetPrefix() const {
394 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000395 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000396 virtual void getGCCRegNames(const char * const *&Names,
397 unsigned &NumNames) const;
398 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
399 unsigned &NumAliases) const;
400 virtual bool validateAsmConstraint(char c,
401 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000402 switch (c) {
403 default: return false;
404 case 'O': // Zero
405 return true;
406 case 'b': // Base register
407 case 'f': // Floating point register
408 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
409 return true;
410 }
411 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000412 virtual const char *getClobbers() const {
413 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000414 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000415};
Anders Carlssonf511f642007-11-27 04:11:28 +0000416
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000417const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
418#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
419#include "clang/AST/PPCBuiltins.def"
420};
Chris Lattner17df24e2008-04-21 18:56:49 +0000421
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000422const char * const PPCTargetInfo::GCCRegNames[] = {
423 "0", "1", "2", "3", "4", "5", "6", "7",
424 "8", "9", "10", "11", "12", "13", "14", "15",
425 "16", "17", "18", "19", "20", "21", "22", "23",
426 "24", "25", "26", "27", "28", "29", "30", "31",
427 "0", "1", "2", "3", "4", "5", "6", "7",
428 "8", "9", "10", "11", "12", "13", "14", "15",
429 "16", "17", "18", "19", "20", "21", "22", "23",
430 "24", "25", "26", "27", "28", "29", "30", "31",
431 "mq", "lr", "ctr", "ap",
432 "0", "1", "2", "3", "4", "5", "6", "7",
433 "xer",
434 "0", "1", "2", "3", "4", "5", "6", "7",
435 "8", "9", "10", "11", "12", "13", "14", "15",
436 "16", "17", "18", "19", "20", "21", "22", "23",
437 "24", "25", "26", "27", "28", "29", "30", "31",
438 "vrsave", "vscr",
439 "spe_acc", "spefscr",
440 "sfp"
441};
Chris Lattner10a5b382007-01-29 05:24:35 +0000442
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000443void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
444 unsigned &NumNames) const {
445 Names = GCCRegNames;
446 NumNames = llvm::array_lengthof(GCCRegNames);
447}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000448
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000449const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
450 // While some of these aliases do map to different registers
451 // they still share the same register name.
452 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
453 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
454 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
455 { { "cr3", "fr3", "r3", "v3"}, "3" },
456 { { "cr4", "fr4", "r4", "v4"}, "4" },
457 { { "cr5", "fr5", "r5", "v5"}, "5" },
458 { { "cr6", "fr6", "r6", "v6"}, "6" },
459 { { "cr7", "fr7", "r7", "v7"}, "7" },
460 { { "fr8", "r8", "v8"}, "8" },
461 { { "fr9", "r9", "v9"}, "9" },
462 { { "fr10", "r10", "v10"}, "10" },
463 { { "fr11", "r11", "v11"}, "11" },
464 { { "fr12", "r12", "v12"}, "12" },
465 { { "fr13", "r13", "v13"}, "13" },
466 { { "fr14", "r14", "v14"}, "14" },
467 { { "fr15", "r15", "v15"}, "15" },
468 { { "fr16", "r16", "v16"}, "16" },
469 { { "fr17", "r17", "v17"}, "17" },
470 { { "fr18", "r18", "v18"}, "18" },
471 { { "fr19", "r19", "v19"}, "19" },
472 { { "fr20", "r20", "v20"}, "20" },
473 { { "fr21", "r21", "v21"}, "21" },
474 { { "fr22", "r22", "v22"}, "22" },
475 { { "fr23", "r23", "v23"}, "23" },
476 { { "fr24", "r24", "v24"}, "24" },
477 { { "fr25", "r25", "v25"}, "25" },
478 { { "fr26", "r26", "v26"}, "26" },
479 { { "fr27", "r27", "v27"}, "27" },
480 { { "fr28", "r28", "v28"}, "28" },
481 { { "fr29", "r29", "v29"}, "29" },
482 { { "fr30", "r30", "v30"}, "30" },
483 { { "fr31", "r31", "v31"}, "31" },
484};
485
486void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
487 unsigned &NumAliases) const {
488 Aliases = GCCRegAliases;
489 NumAliases = llvm::array_lengthof(GCCRegAliases);
490}
491} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000492
Chris Lattner5ba61f02006-10-14 07:39:34 +0000493namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000494class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000495public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000496 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
497 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
498 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
499 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000500 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000501 getPowerPCDefines(Defines, false);
502 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000503};
504} // end anonymous namespace.
505
506namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000507class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000508public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000509 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000510 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000511 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
512 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000513 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000514 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000515 getPowerPCDefines(Defines, true);
516 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000517};
518} // end anonymous namespace.
519
520namespace {
521class DarwinPPCTargetInfo : public PPC32TargetInfo {
522public:
523 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
524 virtual void getTargetDefines(std::vector<char> &Defines) const {
525 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000526 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000527 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000528
529 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000530};
531} // end anonymous namespace.
532
533namespace {
534class DarwinPPC64TargetInfo : public PPC64TargetInfo {
535public:
536 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
537 virtual void getTargetDefines(std::vector<char> &Defines) const {
538 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000539 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000540 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000541
542 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000543};
544} // end anonymous namespace.
545
546namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000547// Namespace for x86 abstract base class
548const Builtin::Info BuiltinInfo[] = {
549#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
550#include "clang/AST/X86Builtins.def"
551};
Eli Friedmanb5366062008-05-20 14:21:01 +0000552
Eli Friedman3fd920a2008-08-20 02:34:37 +0000553const char *GCCRegNames[] = {
554 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
555 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
556 "argp", "flags", "fspr", "dirflag", "frame",
557 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
558 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
559 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
560 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
561};
562
563const TargetInfo::GCCRegAlias GCCRegAliases[] = {
564 { { "al", "ah", "eax", "rax" }, "ax" },
565 { { "bl", "bh", "ebx", "rbx" }, "bx" },
566 { { "cl", "ch", "ecx", "rcx" }, "cx" },
567 { { "dl", "dh", "edx", "rdx" }, "dx" },
568 { { "esi", "rsi" }, "si" },
569 { { "edi", "rdi" }, "di" },
570 { { "esp", "rsp" }, "sp" },
571 { { "ebp", "rbp" }, "bp" },
572};
573
574// X86 target abstract base class; x86-32 and x86-64 are very close, so
575// most of the implementation can be shared.
576class X86TargetInfo : public TargetInfo {
577public:
578 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
579 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000580 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000581 virtual void getTargetBuiltins(const Builtin::Info *&Records,
582 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000583 Records = BuiltinInfo;
584 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000585 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000586 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000587 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000588 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000589 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000590 unsigned &NumNames) const {
591 Names = GCCRegNames;
592 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000593 }
594 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
595 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000596 Aliases = GCCRegAliases;
597 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000598 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000599 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000600 TargetInfo::ConstraintInfo &info) const;
601 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000602 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000603 return "~{dirflag},~{fpsr},~{flags}";
604 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000605};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000606
607bool
608X86TargetInfo::validateAsmConstraint(char c,
609 TargetInfo::ConstraintInfo &info) const {
610 switch (c) {
611 default: return false;
612 case 'a': // eax.
613 case 'b': // ebx.
614 case 'c': // ecx.
615 case 'd': // edx.
616 case 'S': // esi.
617 case 'D': // edi.
618 case 'A': // edx:eax.
619 case 't': // top of floating point stack.
620 case 'u': // second from top of floating point stack.
621 case 'q': // Any register accessible as [r]l: a, b, c, and d.
622 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
623 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
624 // instructions.
625 case 'N': // unsigned 8-bit integer constant for use with in and out
626 // instructions.
627 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
628 return true;
629 }
630}
631
632std::string
633X86TargetInfo::convertConstraint(const char Constraint) const {
634 switch (Constraint) {
635 case 'a': return std::string("{ax}");
636 case 'b': return std::string("{bx}");
637 case 'c': return std::string("{cx}");
638 case 'd': return std::string("{dx}");
639 case 'S': return std::string("{si}");
640 case 'D': return std::string("{di}");
641 case 't': // top of floating point stack.
642 return std::string("{st}");
643 case 'u': // second from top of floating point stack.
644 return std::string("{st(1)}"); // second from top of floating point stack.
645 default:
646 return std::string(1, Constraint);
647 }
648}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000649} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000650
651namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000652// X86-32 generic target
653class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000654public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000655 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
656 DoubleAlign = LongLongAlign = 32;
657 LongDoubleWidth = 96;
658 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000659 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
660 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
661 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000662 }
663 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000664 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000665 }
666 virtual void getTargetDefines(std::vector<char> &Defines) const {
667 getX86Defines(Defines, false);
668 }
669};
670} // end anonymous namespace
671
672namespace {
673// x86-32 Darwin (OS X) target
674class DarwinI386TargetInfo : public X86_32TargetInfo {
675public:
676 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
677 LongDoubleWidth = 128;
678 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000679 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
680 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
681 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000682 }
683 virtual void getTargetDefines(std::vector<char> &Defines) const {
684 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000685 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000686 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000687 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000688};
689} // end anonymous namespace
690
691namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000692// x86-32 DragonFly target
693class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
694public:
695 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
696 }
697 virtual void getTargetDefines(std::vector<char> &Defines) const {
698 X86_32TargetInfo::getTargetDefines(Defines);
699 getDragonFlyDefines(Defines);
700 }
701};
702} // end anonymous namespace
703
704namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000705// x86-32 Linux target
706class LinuxX86_32TargetInfo : public X86_32TargetInfo {
707public:
708 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000709 UserLabelPrefix = "";
Eli Friedmanff594f22008-08-21 00:24:02 +0000710 }
711 virtual void getTargetDefines(std::vector<char> &Defines) const {
712 X86_32TargetInfo::getTargetDefines(Defines);
713 getLinuxDefines(Defines);
714 }
715};
716} // end anonymous namespace
717
718namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000719// x86-32 Windows target
720class WindowsX86_32TargetInfo : public X86_32TargetInfo {
721public:
722 WindowsX86_32TargetInfo(const std::string& triple)
723 : X86_32TargetInfo(triple) {
724 // FIXME: Fix wchar_t.
725 // FIXME: We should probably enable -fms-extensions by default for
726 // this target.
727 }
728 virtual void getTargetDefines(std::vector<char> &Defines) const {
729 X86_32TargetInfo::getTargetDefines(Defines);
730 // This list is based off of the the list of things MingW defines
731 Define(Defines, "__WIN32__");
732 Define(Defines, "__WIN32");
733 Define(Defines, "_WIN32");
734 Define(Defines, "WIN32");
735 Define(Defines, "__WINNT__");
736 Define(Defines, "__WINNT");
737 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000738 Define(Defines, "_X86_");
739 Define(Defines, "__MSVCRT__");
740 }
741};
742} // end anonymous namespace
743
744namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000745// x86-64 generic target
746class X86_64TargetInfo : public X86TargetInfo {
747public:
748 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000749 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000750 LongDoubleWidth = 128;
751 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000752 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
753 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
754 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000755 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000756 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000757 return "typedef struct __va_list_tag {"
758 " unsigned gp_offset;"
759 " unsigned fp_offset;"
760 " void* overflow_arg_area;"
761 " void* reg_save_area;"
762 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000763 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000764 virtual void getTargetDefines(std::vector<char> &Defines) const {
765 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000766 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000767};
768} // end anonymous namespace
769
770namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000771// x86-64 Linux target
772class LinuxX86_64TargetInfo : public X86_64TargetInfo {
773public:
774 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000775 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000776 }
777 virtual void getTargetDefines(std::vector<char> &Defines) const {
778 X86_64TargetInfo::getTargetDefines(Defines);
779 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000780 }
781};
782} // end anonymous namespace
783
784namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000785// x86-64 Darwin (OS X) target
786class DarwinX86_64TargetInfo : public X86_64TargetInfo {
787public:
788 DarwinX86_64TargetInfo(const std::string& triple) :
789 X86_64TargetInfo(triple) {}
790
791 virtual void getTargetDefines(std::vector<char> &Defines) const {
792 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000793 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000794 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000795
796 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000797};
798} // end anonymous namespace.
799
Chris Lattner17df24e2008-04-21 18:56:49 +0000800namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000801class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000802public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000803 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
804 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000805 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
806 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000807 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000808 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000809 getARMDefines(Defines);
810 }
811 virtual void getTargetBuiltins(const Builtin::Info *&Records,
812 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000813 // FIXME: Implement.
814 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000815 NumRecords = 0;
816 }
817 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000818 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000819 }
820 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000821 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000822 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000823 virtual void getGCCRegNames(const char * const *&Names,
824 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000825 // FIXME: Implement.
826 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000827 NumNames = 0;
828 }
829 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
830 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000831 // FIXME: Implement.
832 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000833 NumAliases = 0;
834 }
835 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000836 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000837 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000838 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000839 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000840 case 'l': // r0-r7
841 case 'h': // r8-r15
842 case 'w': // VFP Floating point register single precision
843 case 'P': // VFP Floating point register double precision
844 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
845 return true;
846 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000847 return false;
848 }
849 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000850 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000851 return "";
852 }
853};
854} // end anonymous namespace.
855
Eli Friedmanf05b7722008-08-20 07:44:10 +0000856
857namespace {
858class DarwinARMTargetInfo : public ARMTargetInfo {
859public:
860 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
861
862 virtual void getTargetDefines(std::vector<char> &Defines) const {
863 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000864 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000865 }
866};
867} // end anonymous namespace.
868
Chris Lattner5ba61f02006-10-14 07:39:34 +0000869namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000870class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000871public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000872 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
873 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000874 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
875 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000876 }
Gabor Greif49991682008-02-21 16:29:08 +0000877 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000878 // FIXME: This is missing a lot of important defines; some of the
879 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000880 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000881 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000882 Define(Defines, "__sparcv8");
883 }
884 virtual void getTargetBuiltins(const Builtin::Info *&Records,
885 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000886 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000887 }
888 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000889 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000890 }
891 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000892 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000893 }
894 virtual void getGCCRegNames(const char * const *&Names,
895 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000896 // FIXME: Implement!
897 Names = 0;
898 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000899 }
900 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
901 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000902 // FIXME: Implement!
903 Aliases = 0;
904 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000905 }
906 virtual bool validateAsmConstraint(char c,
907 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000908 // FIXME: Implement!
909 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000910 }
911 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000912 // FIXME: Implement!
913 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000914 }
915};
916
917} // end anonymous namespace.
918
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000919namespace {
920class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
921public:
922 SolarisSparcV8TargetInfo(const std::string& triple) :
923 SparcV8TargetInfo(triple) {}
924
925 virtual void getTargetDefines(std::vector<char> &Defines) const {
926 SparcV8TargetInfo::getTargetDefines(Defines);
927 getSolarisDefines(Defines);
928 }
929};
930} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000931
Chris Lattnerb781dc792008-05-08 05:58:21 +0000932namespace {
933 class PIC16TargetInfo : public TargetInfo{
934 public:
935 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000936 // FIXME: Is IntAlign really supposed to be 16? There seems
937 // little point on a platform with 8-bit loads.
938 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
939 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000940 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000941 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000942 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
943 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000944 virtual void getTargetDefines(std::vector<char> &Defines) const {
945 Define(Defines, "__pic16");
946 }
947 virtual void getTargetBuiltins(const Builtin::Info *&Records,
948 unsigned &NumRecords) const {}
949 virtual const char *getVAListDeclaration() const { return "";}
950 virtual const char *getClobbers() const {return "";}
951 virtual const char *getTargetPrefix() const {return "";}
952 virtual void getGCCRegNames(const char * const *&Names,
953 unsigned &NumNames) const {}
954 virtual bool validateAsmConstraint(char c,
955 TargetInfo::ConstraintInfo &info) const {
956 return true;
957 }
958 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
959 unsigned &NumAliases) const {}
960 virtual bool useGlobalsForAutomaticVariables() const {return true;}
961 };
962}
963
Chris Lattner5ba61f02006-10-14 07:39:34 +0000964//===----------------------------------------------------------------------===//
965// Driver code
966//===----------------------------------------------------------------------===//
967
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000968static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000969 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
970 TT[4] == '-' && TT[1] - '3' < 6);
971}
972
Chris Lattner855d0242008-03-05 01:18:20 +0000973/// CreateTargetInfo - Return the target info object for the specified target
974/// triple.
975TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000976 // OS detection; this isn't really anywhere near complete.
977 // Additions and corrections are welcome.
978 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000979 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000980 bool isSolaris = T.find("-solaris") != std::string::npos;
981 bool isLinux = T.find("-linux") != std::string::npos;
982 bool isWindows = T.find("-windows") != std::string::npos ||
983 T.find("-win32") != std::string::npos ||
984 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000985
Eli Friedman873f65a2008-08-21 00:13:15 +0000986 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
987 if (isDarwin)
988 return new DarwinPPCTargetInfo(T);
989 return new PPC32TargetInfo(T);
990 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000991
Eli Friedman873f65a2008-08-21 00:13:15 +0000992 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
993 if (isDarwin)
994 return new DarwinPPC64TargetInfo(T);
995 return new PPC64TargetInfo(T);
996 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000997
Eli Friedman873f65a2008-08-21 00:13:15 +0000998 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
999 if (isDarwin)
1000 return new DarwinARMTargetInfo(T);
1001 return new ARMTargetInfo(T);
1002 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001003
Eli Friedman873f65a2008-08-21 00:13:15 +00001004 if (T.find("sparc-") == 0) {
1005 if (isSolaris)
1006 return new SolarisSparcV8TargetInfo(T);
1007 return new SparcV8TargetInfo(T);
1008 }
1009
1010 if (T.find("x86_64-") == 0) {
1011 if (isDarwin)
1012 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001013 if (isLinux)
1014 return new LinuxX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001015 return new X86_64TargetInfo(T);
1016 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001017
Chris Lattnerb781dc792008-05-08 05:58:21 +00001018 if (T.find("pic16-") == 0)
1019 return new PIC16TargetInfo(T);
1020
Eli Friedman873f65a2008-08-21 00:13:15 +00001021 if (IsX86(T)) {
1022 if (isDarwin)
1023 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001024 if (isLinux)
1025 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001026 if (isDragonFly)
1027 return new DragonFlyX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001028 if (isWindows)
1029 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001030 return new X86_32TargetInfo(T);
1031 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001032
Chris Lattner855d0242008-03-05 01:18:20 +00001033 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001034}
Ted Kremenekc490bdb2008-03-04 17:47:18 +00001035