blob: fae0a71d60617c304a7550fd42ef928e8c2253c8 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner10a5b382007-01-29 05:24:35 +000015#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Ted Kremenekb0615542007-12-03 22:06:55 +000020
Chris Lattner5ba61f02006-10-14 07:39:34 +000021using namespace clang;
22
Chris Lattner5ba61f02006-10-14 07:39:34 +000023//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000024// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000025//===----------------------------------------------------------------------===//
26
Chris Lattnerb2d486a2007-10-06 06:57:34 +000027static void Define(std::vector<char> &Buf, const char *Macro,
28 const char *Val = "1") {
29 const char *Def = "#define ";
30 Buf.insert(Buf.end(), Def, Def+strlen(Def));
31 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
32 Buf.push_back(' ');
33 Buf.insert(Buf.end(), Val, Val+strlen(Val));
34 Buf.push_back('\n');
35}
36
Eli Friedmanda8f5a92008-08-20 07:28:14 +000037static void getSolarisDefines(std::vector<char> &Defs) {
38 Define(Defs, "__SUN__");
39 Define(Defs, "__SOLARIS__");
40}
Chris Lattner5ba61f02006-10-14 07:39:34 +000041
Eli Friedman3fd920a2008-08-20 02:34:37 +000042static void getDarwinDefines(std::vector<char> &Defs) {
43 Define(Defs, "__APPLE__");
44 Define(Defs, "__MACH__");
45
46 if (0) // darwin_pascal_strings
47 Define(Defs, "__PASCAL_STRINGS__");
48}
Chris Lattner5ba61f02006-10-14 07:39:34 +000049
Eli Friedmanff594f22008-08-21 00:24:02 +000050static void getLinuxDefines(std::vector<char> &Defs) {
51 // Linux defines; list based off of gcc output
52 Define(Defs, "__unix__");
53 Define(Defs, "__unix");
54 Define(Defs, "unix");
55 Define(Defs, "__linux__");
56 Define(Defs, "__linux");
57 Define(Defs, "linux");
58 Define(Defs, "__gnu_linux__");
59}
60
Chris Lattner1f5ad112006-10-14 18:32:12 +000061/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
62/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000063static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +000064 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000065 Define(Defs, "__ppc__");
66 Define(Defs, "_ARCH_PPC");
67 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +000068 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000069 Define(Defs, "_ARCH_PPC64");
70 Define(Defs, "_LP64");
71 Define(Defs, "__LP64__");
72 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +000073 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000074 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +000075 }
Chris Lattner1f5ad112006-10-14 18:32:12 +000076
Chris Lattner9c837532006-10-15 01:05:46 +000077 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000078 Define(Defs, "_BIG_ENDIAN");
79 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +000080
81 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000082 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
83 Define(Defs, "__INTMAX_TYPE__", "long int");
84 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
85 Define(Defs, "__PTRDIFF_TYPE__", "long int");
86 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +000087 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000088 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
89 Define(Defs, "__INTMAX_TYPE__", "long long int");
90 Define(Defs, "__LONG_MAX__", "2147483647L");
91 Define(Defs, "__PTRDIFF_TYPE__", "int");
92 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +000093 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +000094 Define(Defs, "__INT_MAX__", "2147483647");
95 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
96 Define(Defs, "__CHAR_BIT__", "8");
97 Define(Defs, "__SCHAR_MAX__", "127");
98 Define(Defs, "__SHRT_MAX__", "32767");
99 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000100
101 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000102 Define(Defs, "__USER_LABEL_PREFIX__", "_");
103 Define(Defs, "__NATURAL_ALIGNMENT__");
104 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000105
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000106 Define(Defs, "__WCHAR_MAX__", "2147483647");
107 Define(Defs, "__WCHAR_TYPE__", "int");
108 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000109
110 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000111 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
112 Define(Defs, "__FLT_DIG__", "6");
113 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
114 Define(Defs, "__FLT_EVAL_METHOD__", "0");
115 Define(Defs, "__FLT_HAS_INFINITY__");
116 Define(Defs, "__FLT_HAS_QUIET_NAN__");
117 Define(Defs, "__FLT_MANT_DIG__", "24");
118 Define(Defs, "__FLT_MAX_10_EXP__", "38");
119 Define(Defs, "__FLT_MAX_EXP__", "128");
120 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
121 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
122 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
123 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
124 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000125
126 // double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000127 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
128 Define(Defs, "__DBL_DIG__", "15");
129 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
130 Define(Defs, "__DBL_HAS_INFINITY__");
131 Define(Defs, "__DBL_HAS_QUIET_NAN__");
132 Define(Defs, "__DBL_MANT_DIG__", "53");
133 Define(Defs, "__DBL_MAX_10_EXP__", "308");
134 Define(Defs, "__DBL_MAX_EXP__", "1024");
135 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
136 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
137 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
138 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
139 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner9c837532006-10-15 01:05:46 +0000140
141 // 128-bit long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000142 Define(Defs, "__LDBL_DENORM_MIN__",
143 "4.94065645841246544176568792868221e-324L");
144 Define(Defs, "__LDBL_DIG__", "31");
145 Define(Defs, "__LDBL_EPSILON__",
146 "4.94065645841246544176568792868221e-324L");
147 Define(Defs, "__LDBL_HAS_INFINITY__");
148 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
149 Define(Defs, "__LDBL_MANT_DIG__", "106");
150 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
151 Define(Defs, "__LDBL_MAX_EXP__", "1024");
152 Define(Defs, "__LDBL_MAX__",
153 "1.79769313486231580793728971405301e+308L");
154 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
155 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
156 Define(Defs, "__LDBL_MIN__",
157 "2.00416836000897277799610805135016e-292L");
158 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000159}
160
161/// getX86Defines - Return a set of the X86-specific #defines that are
162/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000163static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000164 // Target identification.
165 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000166 Define(Defs, "_LP64");
167 Define(Defs, "__LP64__");
168 Define(Defs, "__amd64__");
169 Define(Defs, "__amd64");
170 Define(Defs, "__x86_64");
171 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000172 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000173 Define(Defs, "__i386__");
174 Define(Defs, "__i386");
175 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000176 }
177
178 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000179 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000180
181 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000182 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
183 Define(Defs, "__INTMAX_TYPE__", "long int");
184 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
185 Define(Defs, "__PTRDIFF_TYPE__", "long int");
186 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000187 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000188 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
189 Define(Defs, "__INTMAX_TYPE__", "long long int");
190 Define(Defs, "__LONG_MAX__", "2147483647L");
191 Define(Defs, "__PTRDIFF_TYPE__", "int");
192 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000193 }
Anders Carlsson35a56362008-07-22 17:16:13 +0000194 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000195 Define(Defs, "__CHAR_BIT__", "8");
196 Define(Defs, "__INT_MAX__", "2147483647");
197 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
198 Define(Defs, "__SCHAR_MAX__", "127");
199 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner9c837532006-10-15 01:05:46 +0000200
201 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000202 Define(Defs, "__nocona");
203 Define(Defs, "__nocona__");
204 Define(Defs, "__tune_nocona__");
205 Define(Defs, "__SSE2_MATH__");
206 Define(Defs, "__SSE2__");
207 Define(Defs, "__SSE_MATH__");
208 Define(Defs, "__SSE__");
209 Define(Defs, "__MMX__");
210 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000211
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000212 Define(Defs, "__WCHAR_MAX__", "2147483647");
213 Define(Defs, "__WCHAR_TYPE__", "int");
214 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000215
216 // Float macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000217 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
218 Define(Defs, "__FLT_DIG__", "6");
219 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
220 Define(Defs, "__FLT_EVAL_METHOD__", "0");
221 Define(Defs, "__FLT_HAS_INFINITY__");
222 Define(Defs, "__FLT_HAS_QUIET_NAN__");
223 Define(Defs, "__FLT_MANT_DIG__", "24");
224 Define(Defs, "__FLT_MAX_10_EXP__", "38");
225 Define(Defs, "__FLT_MAX_EXP__", "128");
226 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
227 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
228 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
229 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
230 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner9c837532006-10-15 01:05:46 +0000231
232 // Double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000233 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
234 Define(Defs, "__DBL_DIG__", "15");
235 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
236 Define(Defs, "__DBL_HAS_INFINITY__");
237 Define(Defs, "__DBL_HAS_QUIET_NAN__");
238 Define(Defs, "__DBL_MANT_DIG__", "53");
239 Define(Defs, "__DBL_MAX_10_EXP__", "308");
240 Define(Defs, "__DBL_MAX_EXP__", "1024");
241 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
242 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
243 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
244 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
245 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner9c837532006-10-15 01:05:46 +0000246
247 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000248 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
249 Define(Defs, "__LDBL_DIG__", "18");
250 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
251 Define(Defs, "__LDBL_HAS_INFINITY__");
252 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
253 Define(Defs, "__LDBL_MANT_DIG__", "64");
254 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
255 Define(Defs, "__LDBL_MAX_EXP__", "16384");
256 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
257 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
258 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
259 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000260}
261
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000262/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000263/// not tied to a specific subtarget.
264static void getARMDefines(std::vector<char> &Defs) {
265 // Target identification.
266 Define(Defs, "__arm");
267 Define(Defs, "__arm__");
268
269 // Target properties.
270 Define(Defs, "__LITTLE_ENDIAN__");
271
272 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
273 Define(Defs, "__INTMAX_TYPE__", "long long int");
274 Define(Defs, "__LONG_MAX__", "2147483647L");
275 Define(Defs, "__PTRDIFF_TYPE__", "int");
276 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
277 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
278
279 Define(Defs, "__CHAR_BIT__", "8");
280 Define(Defs, "__INT_MAX__", "2147483647");
281 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
282 Define(Defs, "__SCHAR_MAX__", "127");
283 Define(Defs, "__SHRT_MAX__", "32767");
284
285 // Subtarget options. [hard coded to v6 for now]
286 Define(Defs, "__ARM_ARCH_6K__");
287 Define(Defs, "__ARMEL__");
288 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
289
290 Define(Defs, "__WCHAR_MAX__", "2147483647");
291 Define(Defs, "__WCHAR_TYPE__", "int");
292 Define(Defs, "__WINT_TYPE__", "int");
293 Define(Defs, "__DECIMAL_DIG__", "17");
294 Define(Defs, "__FLT_RADIX__", "2");
295
296 // Float macros.
297 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
298 Define(Defs, "__FLT_DIG__", "6");
299 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
300 Define(Defs, "__FLT_EVAL_METHOD__", "0");
301 Define(Defs, "__FLT_HAS_INFINITY__");
302 Define(Defs, "__FLT_HAS_QUIET_NAN__");
303 Define(Defs, "__FLT_MANT_DIG__", "24");
304 Define(Defs, "__FLT_MAX_10_EXP__", "38");
305 Define(Defs, "__FLT_MAX_EXP__", "128");
306 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
307 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
308 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
309 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
310
311 // Double macros.
312 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
313 Define(Defs, "__DBL_DIG__", "15");
314 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
315 Define(Defs, "__DBL_HAS_INFINITY__");
316 Define(Defs, "__DBL_HAS_QUIET_NAN__");
317 Define(Defs, "__DBL_MANT_DIG__", "53");
318 Define(Defs, "__DBL_MAX_10_EXP__", "308");
319 Define(Defs, "__DBL_MAX_EXP__", "1024");
320 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
321 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
322 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
323 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
324
325 // 64-bit Long double macros (same as double).
326 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
327 Define(Defs, "__LDBL_DIG__", "15");
328 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
329 Define(Defs, "__LDBL_HAS_INFINITY__");
330 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
331 Define(Defs, "__LDBL_MANT_DIG__", "53");
332 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
333 Define(Defs, "__LDBL_MAX_EXP__", "1024");
334 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
335 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
336 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
337 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
338}
339
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000340//===----------------------------------------------------------------------===//
341// Specific target implementations.
342//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000343
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000344namespace {
345// PPC abstract base class
346class PPCTargetInfo : public TargetInfo {
347 static const Builtin::Info BuiltinInfo[];
348 static const char * const GCCRegNames[];
349 static const TargetInfo::GCCRegAlias GCCRegAliases[];
350
351public:
352 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
353 CharIsSigned = false;
354 }
355 virtual void getTargetBuiltins(const Builtin::Info *&Records,
356 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000357 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000358 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000359 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000360 virtual const char *getVAListDeclaration() const {
361 return "typedef struct __va_list_tag {"
362 " unsigned char gpr;"
363 " unsigned char fpr;"
364 " unsigned short reserved;"
365 " void* overflow_arg_area;"
366 " void* reg_save_area;"
367 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000368 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000369 virtual const char *getTargetPrefix() const {
370 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000371 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000372 virtual void getGCCRegNames(const char * const *&Names,
373 unsigned &NumNames) const;
374 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
375 unsigned &NumAliases) const;
376 virtual bool validateAsmConstraint(char c,
377 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000378 switch (c) {
379 default: return false;
380 case 'O': // Zero
381 return true;
382 case 'b': // Base register
383 case 'f': // Floating point register
384 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
385 return true;
386 }
387 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000388 virtual const char *getClobbers() const {
389 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000390 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000391};
Anders Carlssonf511f642007-11-27 04:11:28 +0000392
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000393const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
394#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
395#include "clang/AST/PPCBuiltins.def"
396};
Chris Lattner17df24e2008-04-21 18:56:49 +0000397
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000398const char * const PPCTargetInfo::GCCRegNames[] = {
399 "0", "1", "2", "3", "4", "5", "6", "7",
400 "8", "9", "10", "11", "12", "13", "14", "15",
401 "16", "17", "18", "19", "20", "21", "22", "23",
402 "24", "25", "26", "27", "28", "29", "30", "31",
403 "0", "1", "2", "3", "4", "5", "6", "7",
404 "8", "9", "10", "11", "12", "13", "14", "15",
405 "16", "17", "18", "19", "20", "21", "22", "23",
406 "24", "25", "26", "27", "28", "29", "30", "31",
407 "mq", "lr", "ctr", "ap",
408 "0", "1", "2", "3", "4", "5", "6", "7",
409 "xer",
410 "0", "1", "2", "3", "4", "5", "6", "7",
411 "8", "9", "10", "11", "12", "13", "14", "15",
412 "16", "17", "18", "19", "20", "21", "22", "23",
413 "24", "25", "26", "27", "28", "29", "30", "31",
414 "vrsave", "vscr",
415 "spe_acc", "spefscr",
416 "sfp"
417};
Chris Lattner10a5b382007-01-29 05:24:35 +0000418
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000419void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
420 unsigned &NumNames) const {
421 Names = GCCRegNames;
422 NumNames = llvm::array_lengthof(GCCRegNames);
423}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000424
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000425const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
426 // While some of these aliases do map to different registers
427 // they still share the same register name.
428 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
429 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
430 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
431 { { "cr3", "fr3", "r3", "v3"}, "3" },
432 { { "cr4", "fr4", "r4", "v4"}, "4" },
433 { { "cr5", "fr5", "r5", "v5"}, "5" },
434 { { "cr6", "fr6", "r6", "v6"}, "6" },
435 { { "cr7", "fr7", "r7", "v7"}, "7" },
436 { { "fr8", "r8", "v8"}, "8" },
437 { { "fr9", "r9", "v9"}, "9" },
438 { { "fr10", "r10", "v10"}, "10" },
439 { { "fr11", "r11", "v11"}, "11" },
440 { { "fr12", "r12", "v12"}, "12" },
441 { { "fr13", "r13", "v13"}, "13" },
442 { { "fr14", "r14", "v14"}, "14" },
443 { { "fr15", "r15", "v15"}, "15" },
444 { { "fr16", "r16", "v16"}, "16" },
445 { { "fr17", "r17", "v17"}, "17" },
446 { { "fr18", "r18", "v18"}, "18" },
447 { { "fr19", "r19", "v19"}, "19" },
448 { { "fr20", "r20", "v20"}, "20" },
449 { { "fr21", "r21", "v21"}, "21" },
450 { { "fr22", "r22", "v22"}, "22" },
451 { { "fr23", "r23", "v23"}, "23" },
452 { { "fr24", "r24", "v24"}, "24" },
453 { { "fr25", "r25", "v25"}, "25" },
454 { { "fr26", "r26", "v26"}, "26" },
455 { { "fr27", "r27", "v27"}, "27" },
456 { { "fr28", "r28", "v28"}, "28" },
457 { { "fr29", "r29", "v29"}, "29" },
458 { { "fr30", "r30", "v30"}, "30" },
459 { { "fr31", "r31", "v31"}, "31" },
460};
461
462void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
463 unsigned &NumAliases) const {
464 Aliases = GCCRegAliases;
465 NumAliases = llvm::array_lengthof(GCCRegAliases);
466}
467} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000468
Chris Lattner5ba61f02006-10-14 07:39:34 +0000469namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000470class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000471public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000472 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
473 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
474 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
475 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000476 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000477 getPowerPCDefines(Defines, false);
478 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000479};
480} // end anonymous namespace.
481
482namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000483class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000484public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000485 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000486 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000487 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
488 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000489 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000490 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000491 getPowerPCDefines(Defines, true);
492 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000493};
494} // end anonymous namespace.
495
496namespace {
497class DarwinPPCTargetInfo : public PPC32TargetInfo {
498public:
499 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
500 virtual void getTargetDefines(std::vector<char> &Defines) const {
501 PPC32TargetInfo::getTargetDefines(Defines);
502 getDarwinDefines(Defines);
Chris Lattner10a5b382007-01-29 05:24:35 +0000503 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000504
505 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000506};
507} // end anonymous namespace.
508
509namespace {
510class DarwinPPC64TargetInfo : public PPC64TargetInfo {
511public:
512 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
513 virtual void getTargetDefines(std::vector<char> &Defines) const {
514 PPC64TargetInfo::getTargetDefines(Defines);
515 getDarwinDefines(Defines);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000516 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000517
518 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000519};
520} // end anonymous namespace.
521
522namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000523// Namespace for x86 abstract base class
524const Builtin::Info BuiltinInfo[] = {
525#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
526#include "clang/AST/X86Builtins.def"
527};
Eli Friedmanb5366062008-05-20 14:21:01 +0000528
Eli Friedman3fd920a2008-08-20 02:34:37 +0000529const char *GCCRegNames[] = {
530 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
531 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
532 "argp", "flags", "fspr", "dirflag", "frame",
533 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
534 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
535 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
536 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
537};
538
539const TargetInfo::GCCRegAlias GCCRegAliases[] = {
540 { { "al", "ah", "eax", "rax" }, "ax" },
541 { { "bl", "bh", "ebx", "rbx" }, "bx" },
542 { { "cl", "ch", "ecx", "rcx" }, "cx" },
543 { { "dl", "dh", "edx", "rdx" }, "dx" },
544 { { "esi", "rsi" }, "si" },
545 { { "edi", "rdi" }, "di" },
546 { { "esp", "rsp" }, "sp" },
547 { { "ebp", "rbp" }, "bp" },
548};
549
550// X86 target abstract base class; x86-32 and x86-64 are very close, so
551// most of the implementation can be shared.
552class X86TargetInfo : public TargetInfo {
553public:
554 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
555 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000556 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000557 virtual void getTargetBuiltins(const Builtin::Info *&Records,
558 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000559 Records = BuiltinInfo;
560 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000561 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000562 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000563 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000564 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000565 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000566 unsigned &NumNames) const {
567 Names = GCCRegNames;
568 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000569 }
570 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
571 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000572 Aliases = GCCRegAliases;
573 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000574 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000575 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000576 TargetInfo::ConstraintInfo &info) const;
577 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000578 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000579 return "~{dirflag},~{fpsr},~{flags}";
580 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000581};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000582
583bool
584X86TargetInfo::validateAsmConstraint(char c,
585 TargetInfo::ConstraintInfo &info) const {
586 switch (c) {
587 default: return false;
588 case 'a': // eax.
589 case 'b': // ebx.
590 case 'c': // ecx.
591 case 'd': // edx.
592 case 'S': // esi.
593 case 'D': // edi.
594 case 'A': // edx:eax.
595 case 't': // top of floating point stack.
596 case 'u': // second from top of floating point stack.
597 case 'q': // Any register accessible as [r]l: a, b, c, and d.
598 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
599 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
600 // instructions.
601 case 'N': // unsigned 8-bit integer constant for use with in and out
602 // instructions.
603 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
604 return true;
605 }
606}
607
608std::string
609X86TargetInfo::convertConstraint(const char Constraint) const {
610 switch (Constraint) {
611 case 'a': return std::string("{ax}");
612 case 'b': return std::string("{bx}");
613 case 'c': return std::string("{cx}");
614 case 'd': return std::string("{dx}");
615 case 'S': return std::string("{si}");
616 case 'D': return std::string("{di}");
617 case 't': // top of floating point stack.
618 return std::string("{st}");
619 case 'u': // second from top of floating point stack.
620 return std::string("{st(1)}"); // second from top of floating point stack.
621 default:
622 return std::string(1, Constraint);
623 }
624}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000625} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000626
627namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000628// X86-32 generic target
629class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000630public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000631 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
632 DoubleAlign = LongLongAlign = 32;
633 LongDoubleWidth = 96;
634 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000635 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
636 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
637 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000638 }
639 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000640 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000641 }
642 virtual void getTargetDefines(std::vector<char> &Defines) const {
643 getX86Defines(Defines, false);
644 }
645};
646} // end anonymous namespace
647
648namespace {
649// x86-32 Darwin (OS X) target
650class DarwinI386TargetInfo : public X86_32TargetInfo {
651public:
652 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
653 LongDoubleWidth = 128;
654 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000655 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
656 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
657 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000658 }
659 virtual void getTargetDefines(std::vector<char> &Defines) const {
660 X86_32TargetInfo::getTargetDefines(Defines);
661 getDarwinDefines(Defines);
662 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000663 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000664};
665} // end anonymous namespace
666
667namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000668// x86-32 Linux target
669class LinuxX86_32TargetInfo : public X86_32TargetInfo {
670public:
671 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
672 }
673 virtual void getTargetDefines(std::vector<char> &Defines) const {
674 X86_32TargetInfo::getTargetDefines(Defines);
675 getLinuxDefines(Defines);
676 }
677};
678} // end anonymous namespace
679
680namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000681// x86-32 Windows target
682class WindowsX86_32TargetInfo : public X86_32TargetInfo {
683public:
684 WindowsX86_32TargetInfo(const std::string& triple)
685 : X86_32TargetInfo(triple) {
686 // FIXME: Fix wchar_t.
687 // FIXME: We should probably enable -fms-extensions by default for
688 // this target.
689 }
690 virtual void getTargetDefines(std::vector<char> &Defines) const {
691 X86_32TargetInfo::getTargetDefines(Defines);
692 // This list is based off of the the list of things MingW defines
693 Define(Defines, "__WIN32__");
694 Define(Defines, "__WIN32");
695 Define(Defines, "_WIN32");
696 Define(Defines, "WIN32");
697 Define(Defines, "__WINNT__");
698 Define(Defines, "__WINNT");
699 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000700 Define(Defines, "_X86_");
701 Define(Defines, "__MSVCRT__");
702 }
703};
704} // end anonymous namespace
705
706namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000707// x86-64 generic target
708class X86_64TargetInfo : public X86TargetInfo {
709public:
710 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000711 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000712 LongDoubleWidth = 128;
713 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000714 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
715 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
716 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000717 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000718 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000719 return "typedef struct __va_list_tag {"
720 " unsigned gp_offset;"
721 " unsigned fp_offset;"
722 " void* overflow_arg_area;"
723 " void* reg_save_area;"
724 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000725 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000726 virtual void getTargetDefines(std::vector<char> &Defines) const {
727 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000728 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000729};
730} // end anonymous namespace
731
732namespace {
733// x86-64 Darwin (OS X) target
734class DarwinX86_64TargetInfo : public X86_64TargetInfo {
735public:
736 DarwinX86_64TargetInfo(const std::string& triple) :
737 X86_64TargetInfo(triple) {}
738
739 virtual void getTargetDefines(std::vector<char> &Defines) const {
740 X86_64TargetInfo::getTargetDefines(Defines);
741 getDarwinDefines(Defines);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000742 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000743
744 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000745};
746} // end anonymous namespace.
747
Chris Lattner17df24e2008-04-21 18:56:49 +0000748namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000749class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000750public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000751 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
752 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000753 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
754 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000755 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000756 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000757 getARMDefines(Defines);
758 }
759 virtual void getTargetBuiltins(const Builtin::Info *&Records,
760 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000761 // FIXME: Implement.
762 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000763 NumRecords = 0;
764 }
765 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000766 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000767 }
768 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000769 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000770 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000771 virtual void getGCCRegNames(const char * const *&Names,
772 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000773 // FIXME: Implement.
774 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000775 NumNames = 0;
776 }
777 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
778 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000779 // FIXME: Implement.
780 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000781 NumAliases = 0;
782 }
783 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000784 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000785 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000786 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000787 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000788 case 'l': // r0-r7
789 case 'h': // r8-r15
790 case 'w': // VFP Floating point register single precision
791 case 'P': // VFP Floating point register double precision
792 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
793 return true;
794 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000795 return false;
796 }
797 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000798 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000799 return "";
800 }
801};
802} // end anonymous namespace.
803
Eli Friedmanf05b7722008-08-20 07:44:10 +0000804
805namespace {
806class DarwinARMTargetInfo : public ARMTargetInfo {
807public:
808 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
809
810 virtual void getTargetDefines(std::vector<char> &Defines) const {
811 ARMTargetInfo::getTargetDefines(Defines);
812 getDarwinDefines(Defines);
813 }
814};
815} // end anonymous namespace.
816
Chris Lattner5ba61f02006-10-14 07:39:34 +0000817namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000818class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000819public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000820 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
821 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000822 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
823 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000824 }
Gabor Greif49991682008-02-21 16:29:08 +0000825 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000826 // FIXME: This is missing a lot of important defines; some of the
827 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000828 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000829 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000830 Define(Defines, "__sparcv8");
831 }
832 virtual void getTargetBuiltins(const Builtin::Info *&Records,
833 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000834 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000835 }
836 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000837 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000838 }
839 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000840 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000841 }
842 virtual void getGCCRegNames(const char * const *&Names,
843 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000844 // FIXME: Implement!
845 Names = 0;
846 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000847 }
848 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
849 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000850 // FIXME: Implement!
851 Aliases = 0;
852 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000853 }
854 virtual bool validateAsmConstraint(char c,
855 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000856 // FIXME: Implement!
857 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000858 }
859 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000860 // FIXME: Implement!
861 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000862 }
863};
864
865} // end anonymous namespace.
866
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000867namespace {
868class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
869public:
870 SolarisSparcV8TargetInfo(const std::string& triple) :
871 SparcV8TargetInfo(triple) {}
872
873 virtual void getTargetDefines(std::vector<char> &Defines) const {
874 SparcV8TargetInfo::getTargetDefines(Defines);
875 getSolarisDefines(Defines);
876 }
877};
878} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000879
Chris Lattnerb781dc792008-05-08 05:58:21 +0000880namespace {
881 class PIC16TargetInfo : public TargetInfo{
882 public:
883 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000884 // FIXME: Is IntAlign really supposed to be 16? There seems
885 // little point on a platform with 8-bit loads.
886 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
887 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000888 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000889 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000890 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
891 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000892 virtual void getTargetDefines(std::vector<char> &Defines) const {
893 Define(Defines, "__pic16");
894 }
895 virtual void getTargetBuiltins(const Builtin::Info *&Records,
896 unsigned &NumRecords) const {}
897 virtual const char *getVAListDeclaration() const { return "";}
898 virtual const char *getClobbers() const {return "";}
899 virtual const char *getTargetPrefix() const {return "";}
900 virtual void getGCCRegNames(const char * const *&Names,
901 unsigned &NumNames) const {}
902 virtual bool validateAsmConstraint(char c,
903 TargetInfo::ConstraintInfo &info) const {
904 return true;
905 }
906 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
907 unsigned &NumAliases) const {}
908 virtual bool useGlobalsForAutomaticVariables() const {return true;}
909 };
910}
911
Chris Lattner5ba61f02006-10-14 07:39:34 +0000912//===----------------------------------------------------------------------===//
913// Driver code
914//===----------------------------------------------------------------------===//
915
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000916static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000917 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
918 TT[4] == '-' && TT[1] - '3' < 6);
919}
920
Chris Lattner855d0242008-03-05 01:18:20 +0000921/// CreateTargetInfo - Return the target info object for the specified target
922/// triple.
923TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000924 // OS detection; this isn't really anywhere near complete.
925 // Additions and corrections are welcome.
926 bool isDarwin = T.find("-darwin") != std::string::npos;
927 bool isSolaris = T.find("-solaris") != std::string::npos;
928 bool isLinux = T.find("-linux") != std::string::npos;
929 bool isWindows = T.find("-windows") != std::string::npos ||
930 T.find("-win32") != std::string::npos ||
931 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000932
Eli Friedman873f65a2008-08-21 00:13:15 +0000933 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
934 if (isDarwin)
935 return new DarwinPPCTargetInfo(T);
936 return new PPC32TargetInfo(T);
937 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000938
Eli Friedman873f65a2008-08-21 00:13:15 +0000939 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
940 if (isDarwin)
941 return new DarwinPPC64TargetInfo(T);
942 return new PPC64TargetInfo(T);
943 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000944
Eli Friedman873f65a2008-08-21 00:13:15 +0000945 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
946 if (isDarwin)
947 return new DarwinARMTargetInfo(T);
948 return new ARMTargetInfo(T);
949 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000950
Eli Friedman873f65a2008-08-21 00:13:15 +0000951 if (T.find("sparc-") == 0) {
952 if (isSolaris)
953 return new SolarisSparcV8TargetInfo(T);
954 return new SparcV8TargetInfo(T);
955 }
956
957 if (T.find("x86_64-") == 0) {
958 if (isDarwin)
959 return new DarwinX86_64TargetInfo(T);
960 return new X86_64TargetInfo(T);
961 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000962
Chris Lattnerb781dc792008-05-08 05:58:21 +0000963 if (T.find("pic16-") == 0)
964 return new PIC16TargetInfo(T);
965
Eli Friedman873f65a2008-08-21 00:13:15 +0000966 if (IsX86(T)) {
967 if (isDarwin)
968 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000969 if (isLinux)
970 return new LinuxX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000971 if (isWindows)
972 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000973 return new X86_32TargetInfo(T);
974 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000975
Chris Lattner855d0242008-03-05 01:18:20 +0000976 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000977}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000978