blob: 73bffd9d310da13559741a8f07c5127cf91397a5 [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 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000504};
505} // end anonymous namespace.
506
507namespace {
508class DarwinPPC64TargetInfo : public PPC64TargetInfo {
509public:
510 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
511 virtual void getTargetDefines(std::vector<char> &Defines) const {
512 PPC64TargetInfo::getTargetDefines(Defines);
513 getDarwinDefines(Defines);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000514 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000515};
516} // end anonymous namespace.
517
518namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000519// Namespace for x86 abstract base class
520const Builtin::Info BuiltinInfo[] = {
521#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
522#include "clang/AST/X86Builtins.def"
523};
Eli Friedmanb5366062008-05-20 14:21:01 +0000524
Eli Friedman3fd920a2008-08-20 02:34:37 +0000525const char *GCCRegNames[] = {
526 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
527 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
528 "argp", "flags", "fspr", "dirflag", "frame",
529 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
530 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
531 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
532 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
533};
534
535const TargetInfo::GCCRegAlias GCCRegAliases[] = {
536 { { "al", "ah", "eax", "rax" }, "ax" },
537 { { "bl", "bh", "ebx", "rbx" }, "bx" },
538 { { "cl", "ch", "ecx", "rcx" }, "cx" },
539 { { "dl", "dh", "edx", "rdx" }, "dx" },
540 { { "esi", "rsi" }, "si" },
541 { { "edi", "rdi" }, "di" },
542 { { "esp", "rsp" }, "sp" },
543 { { "ebp", "rbp" }, "bp" },
544};
545
546// X86 target abstract base class; x86-32 and x86-64 are very close, so
547// most of the implementation can be shared.
548class X86TargetInfo : public TargetInfo {
549public:
550 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
551 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000552 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000553 virtual void getTargetBuiltins(const Builtin::Info *&Records,
554 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000555 Records = BuiltinInfo;
556 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000557 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000558 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000559 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000560 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000561 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000562 unsigned &NumNames) const {
563 Names = GCCRegNames;
564 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000565 }
566 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
567 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000568 Aliases = GCCRegAliases;
569 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000570 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000571 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000572 TargetInfo::ConstraintInfo &info) const;
573 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000574 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000575 return "~{dirflag},~{fpsr},~{flags}";
576 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000577};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000578
579bool
580X86TargetInfo::validateAsmConstraint(char c,
581 TargetInfo::ConstraintInfo &info) const {
582 switch (c) {
583 default: return false;
584 case 'a': // eax.
585 case 'b': // ebx.
586 case 'c': // ecx.
587 case 'd': // edx.
588 case 'S': // esi.
589 case 'D': // edi.
590 case 'A': // edx:eax.
591 case 't': // top of floating point stack.
592 case 'u': // second from top of floating point stack.
593 case 'q': // Any register accessible as [r]l: a, b, c, and d.
594 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
595 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
596 // instructions.
597 case 'N': // unsigned 8-bit integer constant for use with in and out
598 // instructions.
599 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
600 return true;
601 }
602}
603
604std::string
605X86TargetInfo::convertConstraint(const char Constraint) const {
606 switch (Constraint) {
607 case 'a': return std::string("{ax}");
608 case 'b': return std::string("{bx}");
609 case 'c': return std::string("{cx}");
610 case 'd': return std::string("{dx}");
611 case 'S': return std::string("{si}");
612 case 'D': return std::string("{di}");
613 case 't': // top of floating point stack.
614 return std::string("{st}");
615 case 'u': // second from top of floating point stack.
616 return std::string("{st(1)}"); // second from top of floating point stack.
617 default:
618 return std::string(1, Constraint);
619 }
620}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000621} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000622
623namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000624// X86-32 generic target
625class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000626public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000627 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
628 DoubleAlign = LongLongAlign = 32;
629 LongDoubleWidth = 96;
630 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000631 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
632 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
633 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000634 }
635 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000636 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000637 }
638 virtual void getTargetDefines(std::vector<char> &Defines) const {
639 getX86Defines(Defines, false);
640 }
641};
642} // end anonymous namespace
643
644namespace {
645// x86-32 Darwin (OS X) target
646class DarwinI386TargetInfo : public X86_32TargetInfo {
647public:
648 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
649 LongDoubleWidth = 128;
650 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000651 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
652 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
653 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000654 }
655 virtual void getTargetDefines(std::vector<char> &Defines) const {
656 X86_32TargetInfo::getTargetDefines(Defines);
657 getDarwinDefines(Defines);
658 }
659};
660} // end anonymous namespace
661
662namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000663// x86-32 Linux target
664class LinuxX86_32TargetInfo : public X86_32TargetInfo {
665public:
666 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
667 }
668 virtual void getTargetDefines(std::vector<char> &Defines) const {
669 X86_32TargetInfo::getTargetDefines(Defines);
670 getLinuxDefines(Defines);
671 }
672};
673} // end anonymous namespace
674
675namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000676// x86-64 generic target
677class X86_64TargetInfo : public X86TargetInfo {
678public:
679 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000680 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000681 LongDoubleWidth = 128;
682 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000683 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
684 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
685 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000686 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000687 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000688 return "typedef struct __va_list_tag {"
689 " unsigned gp_offset;"
690 " unsigned fp_offset;"
691 " void* overflow_arg_area;"
692 " void* reg_save_area;"
693 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000694 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000695 virtual void getTargetDefines(std::vector<char> &Defines) const {
696 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000697 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000698};
699} // end anonymous namespace
700
701namespace {
702// x86-64 Darwin (OS X) target
703class DarwinX86_64TargetInfo : public X86_64TargetInfo {
704public:
705 DarwinX86_64TargetInfo(const std::string& triple) :
706 X86_64TargetInfo(triple) {}
707
708 virtual void getTargetDefines(std::vector<char> &Defines) const {
709 X86_64TargetInfo::getTargetDefines(Defines);
710 getDarwinDefines(Defines);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000711 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000712};
713} // end anonymous namespace.
714
Chris Lattner17df24e2008-04-21 18:56:49 +0000715namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000716class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000717public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000718 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
719 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000720 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
721 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000722 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000723 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000724 getARMDefines(Defines);
725 }
726 virtual void getTargetBuiltins(const Builtin::Info *&Records,
727 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000728 // FIXME: Implement.
729 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000730 NumRecords = 0;
731 }
732 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000733 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000734 }
735 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000736 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000737 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000738 virtual void getGCCRegNames(const char * const *&Names,
739 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000740 // FIXME: Implement.
741 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000742 NumNames = 0;
743 }
744 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
745 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000746 // FIXME: Implement.
747 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000748 NumAliases = 0;
749 }
750 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000751 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000752 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000753 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000754 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000755 case 'l': // r0-r7
756 case 'h': // r8-r15
757 case 'w': // VFP Floating point register single precision
758 case 'P': // VFP Floating point register double precision
759 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
760 return true;
761 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000762 return false;
763 }
764 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000765 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000766 return "";
767 }
768};
769} // end anonymous namespace.
770
Eli Friedmanf05b7722008-08-20 07:44:10 +0000771
772namespace {
773class DarwinARMTargetInfo : public ARMTargetInfo {
774public:
775 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
776
777 virtual void getTargetDefines(std::vector<char> &Defines) const {
778 ARMTargetInfo::getTargetDefines(Defines);
779 getDarwinDefines(Defines);
780 }
781};
782} // end anonymous namespace.
783
Chris Lattner5ba61f02006-10-14 07:39:34 +0000784namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000785class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000786public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000787 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
788 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000789 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
790 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000791 }
Gabor Greif49991682008-02-21 16:29:08 +0000792 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000793 // FIXME: This is missing a lot of important defines; some of the
794 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000795 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000796 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000797 Define(Defines, "__sparcv8");
798 }
799 virtual void getTargetBuiltins(const Builtin::Info *&Records,
800 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000801 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000802 }
803 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000804 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000805 }
806 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000807 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000808 }
809 virtual void getGCCRegNames(const char * const *&Names,
810 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000811 // FIXME: Implement!
812 Names = 0;
813 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000814 }
815 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
816 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000817 // FIXME: Implement!
818 Aliases = 0;
819 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000820 }
821 virtual bool validateAsmConstraint(char c,
822 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000823 // FIXME: Implement!
824 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000825 }
826 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000827 // FIXME: Implement!
828 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000829 }
830};
831
832} // end anonymous namespace.
833
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000834namespace {
835class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
836public:
837 SolarisSparcV8TargetInfo(const std::string& triple) :
838 SparcV8TargetInfo(triple) {}
839
840 virtual void getTargetDefines(std::vector<char> &Defines) const {
841 SparcV8TargetInfo::getTargetDefines(Defines);
842 getSolarisDefines(Defines);
843 }
844};
845} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000846
Chris Lattnerb781dc792008-05-08 05:58:21 +0000847namespace {
848 class PIC16TargetInfo : public TargetInfo{
849 public:
850 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000851 // FIXME: Is IntAlign really supposed to be 16? There seems
852 // little point on a platform with 8-bit loads.
853 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
854 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000855 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000856 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000857 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
858 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000859 virtual void getTargetDefines(std::vector<char> &Defines) const {
860 Define(Defines, "__pic16");
861 }
862 virtual void getTargetBuiltins(const Builtin::Info *&Records,
863 unsigned &NumRecords) const {}
864 virtual const char *getVAListDeclaration() const { return "";}
865 virtual const char *getClobbers() const {return "";}
866 virtual const char *getTargetPrefix() const {return "";}
867 virtual void getGCCRegNames(const char * const *&Names,
868 unsigned &NumNames) const {}
869 virtual bool validateAsmConstraint(char c,
870 TargetInfo::ConstraintInfo &info) const {
871 return true;
872 }
873 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
874 unsigned &NumAliases) const {}
875 virtual bool useGlobalsForAutomaticVariables() const {return true;}
876 };
877}
878
Chris Lattner5ba61f02006-10-14 07:39:34 +0000879//===----------------------------------------------------------------------===//
880// Driver code
881//===----------------------------------------------------------------------===//
882
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000883static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000884 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
885 TT[4] == '-' && TT[1] - '3' < 6);
886}
887
Chris Lattner855d0242008-03-05 01:18:20 +0000888/// CreateTargetInfo - Return the target info object for the specified target
889/// triple.
890TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000891 // OS detection; this isn't really anywhere near complete.
892 // Additions and corrections are welcome.
893 bool isDarwin = T.find("-darwin") != std::string::npos;
894 bool isSolaris = T.find("-solaris") != std::string::npos;
895 bool isLinux = T.find("-linux") != std::string::npos;
896 bool isWindows = T.find("-windows") != std::string::npos ||
897 T.find("-win32") != std::string::npos ||
898 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000899
Eli Friedman873f65a2008-08-21 00:13:15 +0000900 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
901 if (isDarwin)
902 return new DarwinPPCTargetInfo(T);
903 return new PPC32TargetInfo(T);
904 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000905
Eli Friedman873f65a2008-08-21 00:13:15 +0000906 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
907 if (isDarwin)
908 return new DarwinPPC64TargetInfo(T);
909 return new PPC64TargetInfo(T);
910 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000911
Eli Friedman873f65a2008-08-21 00:13:15 +0000912 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
913 if (isDarwin)
914 return new DarwinARMTargetInfo(T);
915 return new ARMTargetInfo(T);
916 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000917
Eli Friedman873f65a2008-08-21 00:13:15 +0000918 if (T.find("sparc-") == 0) {
919 if (isSolaris)
920 return new SolarisSparcV8TargetInfo(T);
921 return new SparcV8TargetInfo(T);
922 }
923
924 if (T.find("x86_64-") == 0) {
925 if (isDarwin)
926 return new DarwinX86_64TargetInfo(T);
927 return new X86_64TargetInfo(T);
928 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000929
Chris Lattnerb781dc792008-05-08 05:58:21 +0000930 if (T.find("pic16-") == 0)
931 return new PIC16TargetInfo(T);
932
Eli Friedman873f65a2008-08-21 00:13:15 +0000933 if (IsX86(T)) {
934 if (isDarwin)
935 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000936 if (isLinux)
937 return new LinuxX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000938 return new X86_32TargetInfo(T);
939 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000940
Chris Lattner855d0242008-03-05 01:18:20 +0000941 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000942}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000943