blob: f5b936754b26fd22842b583a3f6fdcc67e9caa86 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek38591a22007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Chris Lattner4b009652007-07-25 00:24:17 +000020using namespace clang;
21
Chris Lattner4b009652007-07-25 00:24:17 +000022//===----------------------------------------------------------------------===//
23// Common code shared among targets.
24//===----------------------------------------------------------------------===//
25
Chris Lattner0db667a2007-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 Friedmanff158dd2008-08-20 07:28:14 +000036static void getSolarisDefines(std::vector<char> &Defs) {
37 Define(Defs, "__SUN__");
38 Define(Defs, "__SOLARIS__");
39}
Chris Lattner4b009652007-07-25 00:24:17 +000040
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000041static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +000042 Define(Defs, "__APPLE__");
43 Define(Defs, "__MACH__");
Chris Lattnerc5dc8eb2008-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 Lattnerd376f6d2008-09-30 20:30:12 +000048 char DarwinStr[] = "1000";
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000049 Darwin += strlen("-darwin");
Chris Lattnerd376f6d2008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +000061 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
62 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000063 }
Chris Lattnerd376f6d2008-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 Lattnerc5dc8eb2008-09-30 01:00:25 +000070 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +000071 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000072 }
Eli Friedman872996c2008-08-20 02:34:37 +000073}
Chris Lattner4b009652007-07-25 00:24:17 +000074
Chris Lattnerd4faca42008-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 Friedman5fb0a022008-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 Lattner4b009652007-07-25 00:24:17 +000098/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
99/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000100static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000101 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000102 Define(Defs, "__ppc__");
103 Define(Defs, "_ARCH_PPC");
104 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000105 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000106 Define(Defs, "_ARCH_PPC64");
107 Define(Defs, "_LP64");
108 Define(Defs, "__LP64__");
109 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000110 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000111 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000112 }
113
114 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000115 Define(Defs, "_BIG_ENDIAN");
116 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000117
Chris Lattner4b009652007-07-25 00:24:17 +0000118 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000119 Define(Defs, "__NATURAL_ALIGNMENT__");
120 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000121
Chris Lattner4b009652007-07-25 00:24:17 +0000122 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000123 Define(Defs, "__FLT_DIG__", "6");
124 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
125 Define(Defs, "__FLT_EVAL_METHOD__", "0");
126 Define(Defs, "__FLT_HAS_INFINITY__");
127 Define(Defs, "__FLT_HAS_QUIET_NAN__");
128 Define(Defs, "__FLT_MANT_DIG__", "24");
129 Define(Defs, "__FLT_MAX_10_EXP__", "38");
130 Define(Defs, "__FLT_MAX_EXP__", "128");
131 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
132 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
133 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
134 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
135 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000136
137 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000138 Define(Defs, "__DBL_DIG__", "15");
139 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
140 Define(Defs, "__DBL_HAS_INFINITY__");
141 Define(Defs, "__DBL_HAS_QUIET_NAN__");
142 Define(Defs, "__DBL_MANT_DIG__", "53");
143 Define(Defs, "__DBL_MAX_10_EXP__", "308");
144 Define(Defs, "__DBL_MAX_EXP__", "1024");
145 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
146 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
147 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
148 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
149 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000150
151 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000152 Define(Defs, "__LDBL_DIG__", "31");
153 Define(Defs, "__LDBL_EPSILON__",
154 "4.94065645841246544176568792868221e-324L");
155 Define(Defs, "__LDBL_HAS_INFINITY__");
156 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
157 Define(Defs, "__LDBL_MANT_DIG__", "106");
158 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
159 Define(Defs, "__LDBL_MAX_EXP__", "1024");
160 Define(Defs, "__LDBL_MAX__",
161 "1.79769313486231580793728971405301e+308L");
162 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
163 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
164 Define(Defs, "__LDBL_MIN__",
165 "2.00416836000897277799610805135016e-292L");
166 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000167}
168
169/// getX86Defines - Return a set of the X86-specific #defines that are
170/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000171static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000172 // Target identification.
173 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000174 Define(Defs, "_LP64");
175 Define(Defs, "__LP64__");
176 Define(Defs, "__amd64__");
177 Define(Defs, "__amd64");
178 Define(Defs, "__x86_64");
179 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000180 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000181 Define(Defs, "__i386__");
182 Define(Defs, "__i386");
183 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000184 }
185
186 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000187 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000188
Chris Lattner4b009652007-07-25 00:24:17 +0000189 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000190 Define(Defs, "__nocona");
191 Define(Defs, "__nocona__");
192 Define(Defs, "__tune_nocona__");
193 Define(Defs, "__SSE2_MATH__");
194 Define(Defs, "__SSE2__");
195 Define(Defs, "__SSE_MATH__");
196 Define(Defs, "__SSE__");
197 Define(Defs, "__MMX__");
198 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000199
Chris Lattner4b009652007-07-25 00:24:17 +0000200
201 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000202 Define(Defs, "__FLT_DIG__", "6");
203 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
204 Define(Defs, "__FLT_EVAL_METHOD__", "0");
205 Define(Defs, "__FLT_HAS_INFINITY__");
206 Define(Defs, "__FLT_HAS_QUIET_NAN__");
207 Define(Defs, "__FLT_MANT_DIG__", "24");
208 Define(Defs, "__FLT_MAX_10_EXP__", "38");
209 Define(Defs, "__FLT_MAX_EXP__", "128");
210 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
211 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
212 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
213 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
214 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000215
216 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000217 Define(Defs, "__DBL_DIG__", "15");
218 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
219 Define(Defs, "__DBL_HAS_INFINITY__");
220 Define(Defs, "__DBL_HAS_QUIET_NAN__");
221 Define(Defs, "__DBL_MANT_DIG__", "53");
222 Define(Defs, "__DBL_MAX_10_EXP__", "308");
223 Define(Defs, "__DBL_MAX_EXP__", "1024");
224 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
225 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
226 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
227 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
228 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000229
230 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000231 Define(Defs, "__LDBL_DIG__", "18");
232 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
233 Define(Defs, "__LDBL_HAS_INFINITY__");
234 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
235 Define(Defs, "__LDBL_MANT_DIG__", "64");
236 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
237 Define(Defs, "__LDBL_MAX_EXP__", "16384");
238 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
239 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
240 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
241 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000242}
243
Chris Lattnerb6444052008-04-21 20:19:54 +0000244/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000245/// not tied to a specific subtarget.
246static void getARMDefines(std::vector<char> &Defs) {
247 // Target identification.
248 Define(Defs, "__arm");
249 Define(Defs, "__arm__");
250
251 // Target properties.
252 Define(Defs, "__LITTLE_ENDIAN__");
253
Chris Lattner9fd73612008-04-21 18:56:49 +0000254 // Subtarget options. [hard coded to v6 for now]
255 Define(Defs, "__ARM_ARCH_6K__");
256 Define(Defs, "__ARMEL__");
257 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
258
Chris Lattner9fd73612008-04-21 18:56:49 +0000259 Define(Defs, "__DECIMAL_DIG__", "17");
260 Define(Defs, "__FLT_RADIX__", "2");
261
262 // Float macros.
Chris Lattner9fd73612008-04-21 18:56:49 +0000263 Define(Defs, "__FLT_DIG__", "6");
264 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
265 Define(Defs, "__FLT_EVAL_METHOD__", "0");
266 Define(Defs, "__FLT_HAS_INFINITY__");
267 Define(Defs, "__FLT_HAS_QUIET_NAN__");
268 Define(Defs, "__FLT_MANT_DIG__", "24");
269 Define(Defs, "__FLT_MAX_10_EXP__", "38");
270 Define(Defs, "__FLT_MAX_EXP__", "128");
271 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
272 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
273 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
274 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
275
276 // Double macros.
Chris Lattner9fd73612008-04-21 18:56:49 +0000277 Define(Defs, "__DBL_DIG__", "15");
278 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
279 Define(Defs, "__DBL_HAS_INFINITY__");
280 Define(Defs, "__DBL_HAS_QUIET_NAN__");
281 Define(Defs, "__DBL_MANT_DIG__", "53");
282 Define(Defs, "__DBL_MAX_10_EXP__", "308");
283 Define(Defs, "__DBL_MAX_EXP__", "1024");
284 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
285 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
286 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
287 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
288
289 // 64-bit Long double macros (same as double).
Chris Lattner9fd73612008-04-21 18:56:49 +0000290 Define(Defs, "__LDBL_DIG__", "15");
291 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
292 Define(Defs, "__LDBL_HAS_INFINITY__");
293 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
294 Define(Defs, "__LDBL_MANT_DIG__", "53");
295 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
296 Define(Defs, "__LDBL_MAX_EXP__", "1024");
297 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
298 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
299 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
300 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
301}
302
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000303//===----------------------------------------------------------------------===//
304// Specific target implementations.
305//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000306
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000307namespace {
308// PPC abstract base class
309class PPCTargetInfo : public TargetInfo {
310 static const Builtin::Info BuiltinInfo[];
311 static const char * const GCCRegNames[];
312 static const TargetInfo::GCCRegAlias GCCRegAliases[];
313
314public:
315 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
316 CharIsSigned = false;
317 }
318 virtual void getTargetBuiltins(const Builtin::Info *&Records,
319 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000320 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000321 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000322 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000323 virtual const char *getVAListDeclaration() const {
324 return "typedef struct __va_list_tag {"
325 " unsigned char gpr;"
326 " unsigned char fpr;"
327 " unsigned short reserved;"
328 " void* overflow_arg_area;"
329 " void* reg_save_area;"
330 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000331 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000332 virtual const char *getTargetPrefix() const {
333 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000334 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000335 virtual void getGCCRegNames(const char * const *&Names,
336 unsigned &NumNames) const;
337 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
338 unsigned &NumAliases) const;
339 virtual bool validateAsmConstraint(char c,
340 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000341 switch (c) {
342 default: return false;
343 case 'O': // Zero
344 return true;
345 case 'b': // Base register
346 case 'f': // Floating point register
347 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
348 return true;
349 }
350 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000351 virtual const char *getClobbers() const {
352 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000353 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000354};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000355
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000356const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
357#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
358#include "clang/AST/PPCBuiltins.def"
359};
Chris Lattner9fd73612008-04-21 18:56:49 +0000360
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000361const char * const PPCTargetInfo::GCCRegNames[] = {
362 "0", "1", "2", "3", "4", "5", "6", "7",
363 "8", "9", "10", "11", "12", "13", "14", "15",
364 "16", "17", "18", "19", "20", "21", "22", "23",
365 "24", "25", "26", "27", "28", "29", "30", "31",
366 "0", "1", "2", "3", "4", "5", "6", "7",
367 "8", "9", "10", "11", "12", "13", "14", "15",
368 "16", "17", "18", "19", "20", "21", "22", "23",
369 "24", "25", "26", "27", "28", "29", "30", "31",
370 "mq", "lr", "ctr", "ap",
371 "0", "1", "2", "3", "4", "5", "6", "7",
372 "xer",
373 "0", "1", "2", "3", "4", "5", "6", "7",
374 "8", "9", "10", "11", "12", "13", "14", "15",
375 "16", "17", "18", "19", "20", "21", "22", "23",
376 "24", "25", "26", "27", "28", "29", "30", "31",
377 "vrsave", "vscr",
378 "spe_acc", "spefscr",
379 "sfp"
380};
Chris Lattner4b009652007-07-25 00:24:17 +0000381
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000382void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
383 unsigned &NumNames) const {
384 Names = GCCRegNames;
385 NumNames = llvm::array_lengthof(GCCRegNames);
386}
Chris Lattner4b009652007-07-25 00:24:17 +0000387
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000388const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
389 // While some of these aliases do map to different registers
390 // they still share the same register name.
391 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
392 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
393 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
394 { { "cr3", "fr3", "r3", "v3"}, "3" },
395 { { "cr4", "fr4", "r4", "v4"}, "4" },
396 { { "cr5", "fr5", "r5", "v5"}, "5" },
397 { { "cr6", "fr6", "r6", "v6"}, "6" },
398 { { "cr7", "fr7", "r7", "v7"}, "7" },
399 { { "fr8", "r8", "v8"}, "8" },
400 { { "fr9", "r9", "v9"}, "9" },
401 { { "fr10", "r10", "v10"}, "10" },
402 { { "fr11", "r11", "v11"}, "11" },
403 { { "fr12", "r12", "v12"}, "12" },
404 { { "fr13", "r13", "v13"}, "13" },
405 { { "fr14", "r14", "v14"}, "14" },
406 { { "fr15", "r15", "v15"}, "15" },
407 { { "fr16", "r16", "v16"}, "16" },
408 { { "fr17", "r17", "v17"}, "17" },
409 { { "fr18", "r18", "v18"}, "18" },
410 { { "fr19", "r19", "v19"}, "19" },
411 { { "fr20", "r20", "v20"}, "20" },
412 { { "fr21", "r21", "v21"}, "21" },
413 { { "fr22", "r22", "v22"}, "22" },
414 { { "fr23", "r23", "v23"}, "23" },
415 { { "fr24", "r24", "v24"}, "24" },
416 { { "fr25", "r25", "v25"}, "25" },
417 { { "fr26", "r26", "v26"}, "26" },
418 { { "fr27", "r27", "v27"}, "27" },
419 { { "fr28", "r28", "v28"}, "28" },
420 { { "fr29", "r29", "v29"}, "29" },
421 { { "fr30", "r30", "v30"}, "30" },
422 { { "fr31", "r31", "v31"}, "31" },
423};
424
425void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
426 unsigned &NumAliases) const {
427 Aliases = GCCRegAliases;
428 NumAliases = llvm::array_lengthof(GCCRegAliases);
429}
430} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000431
432namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000433class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000434public:
Eli Friedman2b161652008-08-21 00:13:15 +0000435 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
436 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
437 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
438 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000439 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000440 getPowerPCDefines(Defines, false);
441 }
Chris Lattner4b009652007-07-25 00:24:17 +0000442};
443} // end anonymous namespace.
444
445namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000446class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000447public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000448 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000449 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000450 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
451 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000452 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000453 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000454 getPowerPCDefines(Defines, true);
455 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000456};
457} // end anonymous namespace.
458
459namespace {
460class DarwinPPCTargetInfo : public PPC32TargetInfo {
461public:
462 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
463 virtual void getTargetDefines(std::vector<char> &Defines) const {
464 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000465 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000466 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000467
468 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000469};
470} // end anonymous namespace.
471
472namespace {
473class DarwinPPC64TargetInfo : public PPC64TargetInfo {
474public:
475 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
476 virtual void getTargetDefines(std::vector<char> &Defines) const {
477 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000478 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000479 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000480
481 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000482};
483} // end anonymous namespace.
484
485namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000486// Namespace for x86 abstract base class
487const Builtin::Info BuiltinInfo[] = {
488#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
489#include "clang/AST/X86Builtins.def"
490};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000491
Eli Friedman872996c2008-08-20 02:34:37 +0000492const char *GCCRegNames[] = {
493 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
494 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
495 "argp", "flags", "fspr", "dirflag", "frame",
496 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
497 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
498 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
499 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
500};
501
502const TargetInfo::GCCRegAlias GCCRegAliases[] = {
503 { { "al", "ah", "eax", "rax" }, "ax" },
504 { { "bl", "bh", "ebx", "rbx" }, "bx" },
505 { { "cl", "ch", "ecx", "rcx" }, "cx" },
506 { { "dl", "dh", "edx", "rdx" }, "dx" },
507 { { "esi", "rsi" }, "si" },
508 { { "edi", "rdi" }, "di" },
509 { { "esp", "rsp" }, "sp" },
510 { { "ebp", "rbp" }, "bp" },
511};
512
513// X86 target abstract base class; x86-32 and x86-64 are very close, so
514// most of the implementation can be shared.
515class X86TargetInfo : public TargetInfo {
516public:
517 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
518 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000519 }
520 virtual void getTargetBuiltins(const Builtin::Info *&Records,
521 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000522 Records = BuiltinInfo;
523 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000524 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000525 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000526 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000527 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000528 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000529 unsigned &NumNames) const {
530 Names = GCCRegNames;
531 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000532 }
533 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
534 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000535 Aliases = GCCRegAliases;
536 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000537 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000538 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000539 TargetInfo::ConstraintInfo &info) const;
540 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000541 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000542 return "~{dirflag},~{fpsr},~{flags}";
543 }
Chris Lattner4b009652007-07-25 00:24:17 +0000544};
Eli Friedman872996c2008-08-20 02:34:37 +0000545
546bool
547X86TargetInfo::validateAsmConstraint(char c,
548 TargetInfo::ConstraintInfo &info) const {
549 switch (c) {
550 default: return false;
551 case 'a': // eax.
552 case 'b': // ebx.
553 case 'c': // ecx.
554 case 'd': // edx.
555 case 'S': // esi.
556 case 'D': // edi.
557 case 'A': // edx:eax.
558 case 't': // top of floating point stack.
559 case 'u': // second from top of floating point stack.
560 case 'q': // Any register accessible as [r]l: a, b, c, and d.
561 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
562 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
563 // instructions.
564 case 'N': // unsigned 8-bit integer constant for use with in and out
565 // instructions.
566 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
567 return true;
568 }
569}
570
571std::string
572X86TargetInfo::convertConstraint(const char Constraint) const {
573 switch (Constraint) {
574 case 'a': return std::string("{ax}");
575 case 'b': return std::string("{bx}");
576 case 'c': return std::string("{cx}");
577 case 'd': return std::string("{dx}");
578 case 'S': return std::string("{si}");
579 case 'D': return std::string("{di}");
580 case 't': // top of floating point stack.
581 return std::string("{st}");
582 case 'u': // second from top of floating point stack.
583 return std::string("{st(1)}"); // second from top of floating point stack.
584 default:
585 return std::string(1, Constraint);
586 }
587}
Eli Friedman872996c2008-08-20 02:34:37 +0000588} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000589
590namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000591// X86-32 generic target
592class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000593public:
Eli Friedman872996c2008-08-20 02:34:37 +0000594 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
595 DoubleAlign = LongLongAlign = 32;
596 LongDoubleWidth = 96;
597 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000598 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
599 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
600 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000601 }
602 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000603 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000604 }
605 virtual void getTargetDefines(std::vector<char> &Defines) const {
606 getX86Defines(Defines, false);
607 }
608};
609} // end anonymous namespace
610
611namespace {
612// x86-32 Darwin (OS X) target
613class DarwinI386TargetInfo : public X86_32TargetInfo {
614public:
615 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
616 LongDoubleWidth = 128;
617 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000618 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
619 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
620 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000621 }
622 virtual void getTargetDefines(std::vector<char> &Defines) const {
623 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000624 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000625 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000626 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +0000627};
628} // end anonymous namespace
629
630namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000631// x86-32 DragonFly target
632class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
633public:
634 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
635 }
636 virtual void getTargetDefines(std::vector<char> &Defines) const {
637 X86_32TargetInfo::getTargetDefines(Defines);
638 getDragonFlyDefines(Defines);
639 }
640};
641} // end anonymous namespace
642
643namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000644// x86-32 Linux target
645class LinuxX86_32TargetInfo : public X86_32TargetInfo {
646public:
647 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000648 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000649 }
650 virtual void getTargetDefines(std::vector<char> &Defines) const {
651 X86_32TargetInfo::getTargetDefines(Defines);
652 getLinuxDefines(Defines);
653 }
654};
655} // end anonymous namespace
656
657namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000658// x86-32 Windows target
659class WindowsX86_32TargetInfo : public X86_32TargetInfo {
660public:
661 WindowsX86_32TargetInfo(const std::string& triple)
662 : X86_32TargetInfo(triple) {
663 // FIXME: Fix wchar_t.
664 // FIXME: We should probably enable -fms-extensions by default for
665 // this target.
666 }
667 virtual void getTargetDefines(std::vector<char> &Defines) const {
668 X86_32TargetInfo::getTargetDefines(Defines);
669 // This list is based off of the the list of things MingW defines
670 Define(Defines, "__WIN32__");
671 Define(Defines, "__WIN32");
672 Define(Defines, "_WIN32");
673 Define(Defines, "WIN32");
674 Define(Defines, "__WINNT__");
675 Define(Defines, "__WINNT");
676 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000677 Define(Defines, "_X86_");
678 Define(Defines, "__MSVCRT__");
679 }
680};
681} // end anonymous namespace
682
683namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000684// x86-64 generic target
685class X86_64TargetInfo : public X86TargetInfo {
686public:
687 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000688 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000689 LongDoubleWidth = 128;
690 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000691 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
692 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
693 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000694 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000695 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000696 return "typedef struct __va_list_tag {"
697 " unsigned gp_offset;"
698 " unsigned fp_offset;"
699 " void* overflow_arg_area;"
700 " void* reg_save_area;"
701 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000702 }
Eli Friedman872996c2008-08-20 02:34:37 +0000703 virtual void getTargetDefines(std::vector<char> &Defines) const {
704 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000705 }
Eli Friedman872996c2008-08-20 02:34:37 +0000706};
707} // end anonymous namespace
708
709namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000710// x86-64 Linux target
711class LinuxX86_64TargetInfo : public X86_64TargetInfo {
712public:
713 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000714 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000715 }
716 virtual void getTargetDefines(std::vector<char> &Defines) const {
717 X86_64TargetInfo::getTargetDefines(Defines);
718 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000719 }
720};
721} // end anonymous namespace
722
723namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000724// x86-64 Darwin (OS X) target
725class DarwinX86_64TargetInfo : public X86_64TargetInfo {
726public:
727 DarwinX86_64TargetInfo(const std::string& triple) :
728 X86_64TargetInfo(triple) {}
729
730 virtual void getTargetDefines(std::vector<char> &Defines) const {
731 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000732 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000733 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000734
735 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner4b009652007-07-25 00:24:17 +0000736};
737} // end anonymous namespace.
738
Chris Lattner9fd73612008-04-21 18:56:49 +0000739namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000740class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000741public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000742 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
743 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000744 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
745 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000746 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000747 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000748 getARMDefines(Defines);
749 }
750 virtual void getTargetBuiltins(const Builtin::Info *&Records,
751 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000752 // FIXME: Implement.
753 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000754 NumRecords = 0;
755 }
756 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000757 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000758 }
759 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000760 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000761 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000762 virtual void getGCCRegNames(const char * const *&Names,
763 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000764 // FIXME: Implement.
765 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000766 NumNames = 0;
767 }
768 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
769 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000770 // FIXME: Implement.
771 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000772 NumAliases = 0;
773 }
774 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000775 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000776 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000777 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000778 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000779 case 'l': // r0-r7
780 case 'h': // r8-r15
781 case 'w': // VFP Floating point register single precision
782 case 'P': // VFP Floating point register double precision
783 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
784 return true;
785 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000786 return false;
787 }
788 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000789 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000790 return "";
791 }
792};
793} // end anonymous namespace.
794
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000795
796namespace {
797class DarwinARMTargetInfo : public ARMTargetInfo {
798public:
799 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
800
801 virtual void getTargetDefines(std::vector<char> &Defines) const {
802 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000803 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000804 }
805};
806} // end anonymous namespace.
807
Chris Lattner4b009652007-07-25 00:24:17 +0000808namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000809class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000810public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000811 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
812 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000813 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
814 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000815 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000816 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000817 // FIXME: This is missing a lot of important defines; some of the
818 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000819 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000820 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000821 Define(Defines, "__sparcv8");
822 }
823 virtual void getTargetBuiltins(const Builtin::Info *&Records,
824 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000825 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000826 }
827 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000828 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000829 }
830 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000831 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000832 }
833 virtual void getGCCRegNames(const char * const *&Names,
834 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000835 // FIXME: Implement!
836 Names = 0;
837 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000838 }
839 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
840 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000841 // FIXME: Implement!
842 Aliases = 0;
843 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000844 }
845 virtual bool validateAsmConstraint(char c,
846 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000847 // FIXME: Implement!
848 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000849 }
850 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000851 // FIXME: Implement!
852 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000853 }
854};
855
856} // end anonymous namespace.
857
Eli Friedmanff158dd2008-08-20 07:28:14 +0000858namespace {
859class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
860public:
861 SolarisSparcV8TargetInfo(const std::string& triple) :
862 SparcV8TargetInfo(triple) {}
863
864 virtual void getTargetDefines(std::vector<char> &Defines) const {
865 SparcV8TargetInfo::getTargetDefines(Defines);
866 getSolarisDefines(Defines);
867 }
868};
869} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000870
Chris Lattner85970f32008-05-08 05:58:21 +0000871namespace {
872 class PIC16TargetInfo : public TargetInfo{
873 public:
874 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000875 // FIXME: Is IntAlign really supposed to be 16? There seems
876 // little point on a platform with 8-bit loads.
877 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner1be8bb92008-10-05 20:06:37 +0000878 LongWidth = 16;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000879 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000880 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000881 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000882 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
883 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000884 virtual void getTargetDefines(std::vector<char> &Defines) const {
885 Define(Defines, "__pic16");
886 }
887 virtual void getTargetBuiltins(const Builtin::Info *&Records,
888 unsigned &NumRecords) const {}
889 virtual const char *getVAListDeclaration() const { return "";}
890 virtual const char *getClobbers() const {return "";}
891 virtual const char *getTargetPrefix() const {return "";}
892 virtual void getGCCRegNames(const char * const *&Names,
893 unsigned &NumNames) const {}
894 virtual bool validateAsmConstraint(char c,
895 TargetInfo::ConstraintInfo &info) const {
896 return true;
897 }
898 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
899 unsigned &NumAliases) const {}
900 virtual bool useGlobalsForAutomaticVariables() const {return true;}
901 };
902}
903
Chris Lattner4b009652007-07-25 00:24:17 +0000904//===----------------------------------------------------------------------===//
905// Driver code
906//===----------------------------------------------------------------------===//
907
Ted Kremenekb97d7672007-12-04 17:07:35 +0000908static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000909 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
910 TT[4] == '-' && TT[1] - '3' < 6);
911}
912
Chris Lattnerfc457002008-03-05 01:18:20 +0000913/// CreateTargetInfo - Return the target info object for the specified target
914/// triple.
915TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000916 // OS detection; this isn't really anywhere near complete.
917 // Additions and corrections are welcome.
918 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000919 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000920 bool isSolaris = T.find("-solaris") != std::string::npos;
921 bool isLinux = T.find("-linux") != std::string::npos;
922 bool isWindows = T.find("-windows") != std::string::npos ||
923 T.find("-win32") != std::string::npos ||
924 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000925
Eli Friedman2b161652008-08-21 00:13:15 +0000926 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
927 if (isDarwin)
928 return new DarwinPPCTargetInfo(T);
929 return new PPC32TargetInfo(T);
930 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000931
Eli Friedman2b161652008-08-21 00:13:15 +0000932 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
933 if (isDarwin)
934 return new DarwinPPC64TargetInfo(T);
935 return new PPC64TargetInfo(T);
936 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000937
Eli Friedman2b161652008-08-21 00:13:15 +0000938 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
939 if (isDarwin)
940 return new DarwinARMTargetInfo(T);
941 return new ARMTargetInfo(T);
942 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000943
Eli Friedman2b161652008-08-21 00:13:15 +0000944 if (T.find("sparc-") == 0) {
945 if (isSolaris)
946 return new SolarisSparcV8TargetInfo(T);
947 return new SparcV8TargetInfo(T);
948 }
949
950 if (T.find("x86_64-") == 0) {
951 if (isDarwin)
952 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000953 if (isLinux)
954 return new LinuxX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000955 return new X86_64TargetInfo(T);
956 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000957
Chris Lattner85970f32008-05-08 05:58:21 +0000958 if (T.find("pic16-") == 0)
959 return new PIC16TargetInfo(T);
960
Eli Friedman2b161652008-08-21 00:13:15 +0000961 if (IsX86(T)) {
962 if (isDarwin)
963 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000964 if (isLinux)
965 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000966 if (isDragonFly)
967 return new DragonFlyX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +0000968 if (isWindows)
969 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000970 return new X86_32TargetInfo(T);
971 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000972
Chris Lattnerfc457002008-03-05 01:18:20 +0000973 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000974}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000975