blob: 455cdfa7ca6d136d5a23949c648b6ad0ef6cea25 [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
Douglas Gregor2e8a7aa2009-02-16 21:58:21 +000015// FIXME: Layering violation
Chris Lattner4b009652007-07-25 00:24:17 +000016#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000017#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000018#include "clang/Basic/TargetInfo.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000019#include "clang/Basic/LangOptions.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000020#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000021#include "llvm/ADT/APFloat.h"
Chris Lattner4b009652007-07-25 00:24:17 +000022using namespace clang;
23
Chris Lattner4b009652007-07-25 00:24:17 +000024//===----------------------------------------------------------------------===//
25// Common code shared among targets.
26//===----------------------------------------------------------------------===//
27
Chris Lattner0db667a2007-10-06 06:57:34 +000028static void Define(std::vector<char> &Buf, const char *Macro,
29 const char *Val = "1") {
30 const char *Def = "#define ";
31 Buf.insert(Buf.end(), Def, Def+strlen(Def));
32 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
33 Buf.push_back(' ');
34 Buf.insert(Buf.end(), Val, Val+strlen(Val));
35 Buf.push_back('\n');
36}
37
Chris Lattnerbd00eb82008-10-05 21:50:58 +000038//===----------------------------------------------------------------------===//
39// Defines specific to certain operating systems.
40//===----------------------------------------------------------------------===//
41
Eli Friedmanff158dd2008-08-20 07:28:14 +000042static void getSolarisDefines(std::vector<char> &Defs) {
43 Define(Defs, "__SUN__");
44 Define(Defs, "__SOLARIS__");
45}
Chris Lattner4b009652007-07-25 00:24:17 +000046
Nate Begemanff1ba1f2009-01-18 01:08:03 +000047static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit,
48 const char *Triple) {
Chris Lattner98cb2a22008-10-16 17:04:31 +000049 // FreeBSD defines; list based off of gcc output
50
51 const char *FreeBSD = strstr(Triple, "-freebsd");
52 FreeBSD += strlen("-freebsd");
53 char release[] = "X";
54 release[0] = FreeBSD[0];
55 char version[] = "X00001";
56 version[0] = FreeBSD[0];
57
58 Define(Defs, "__FreeBSD__", release);
59 Define(Defs, "__FreeBSD_cc_version", version);
60 Define(Defs, "__KPRINTF_ATTRIBUTE__");
61 Define(Defs, "unix");
Anton Korobeynikovfb820852009-02-14 16:42:50 +000062 Define(Defs, "__ELF__", "1");
Chris Lattner98cb2a22008-10-16 17:04:31 +000063 if (is64Bit) {
64 Define(Defs, "__LP64__");
65 }
66}
67
Chris Lattnerbd00eb82008-10-05 21:50:58 +000068static void getDragonFlyDefines(std::vector<char> &Defs) {
69 // DragonFly defines; list based off of gcc output
70 Define(Defs, "__DragonFly__");
71 Define(Defs, "__DragonFly_cc_version", "100001");
72 Define(Defs, "__ELF__");
73 Define(Defs, "__KPRINTF_ATTRIBUTE__");
74 Define(Defs, "__tune_i386__");
75 Define(Defs, "unix");
76 Define(Defs, "__unix");
77 Define(Defs, "__unix__");
78}
79
80static void getLinuxDefines(std::vector<char> &Defs) {
81 // Linux defines; list based off of gcc output
82 Define(Defs, "__unix__");
83 Define(Defs, "__unix");
84 Define(Defs, "unix");
85 Define(Defs, "__linux__");
86 Define(Defs, "__linux");
87 Define(Defs, "linux");
88 Define(Defs, "__gnu_linux__");
Argiris Kirtzidis99de9532009-02-14 15:02:45 +000089 Define(Defs, "__ELF__", "1");
Chris Lattnerbd00eb82008-10-05 21:50:58 +000090}
91
Chris Lattnerd7bc88b2008-12-04 23:20:07 +000092/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
93/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
94/// not defined, return 0's. Return true if we have -darwin in the string or
95/// false otherwise.
96static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
97 Maj = Min = 0;
98 const char *Darwin = strstr(Triple, "-darwin");
99 if (Darwin == 0) return false;
100
101 Darwin += strlen("-darwin");
102 if (Darwin[0] < '0' || Darwin[0] > '9')
103 return true;
104
105 Maj = Darwin[0]-'0';
106 ++Darwin;
107
108 // Handle "darwin11".
109 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
110 Maj = 10+Darwin[0]-'0';
111 ++Darwin;
112 }
113
114 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
115 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
116 Darwin[2] == '\0')
117 Min = Darwin[1]-'0';
118
119 return true;
120}
121
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000122static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +0000123 Define(Defs, "__APPLE__");
124 Define(Defs, "__MACH__");
Chris Lattner8405e092009-02-05 07:19:24 +0000125 Define(Defs, "OBJC_NEW_PROPERTIES");
126
127 // FIXME: OBJC_ZEROCOST_EXCEPTIONS when using zero cost eh.
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000128
129 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000130 unsigned Maj, Min;
131 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000132 char DarwinStr[] = "1000";
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000133 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
134 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
135 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000136 }
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000137
138 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
139 DarwinStr[3] = Min+'0';
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000140 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000141 }
Eli Friedman872996c2008-08-20 02:34:37 +0000142}
Chris Lattner4b009652007-07-25 00:24:17 +0000143
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000144/// GetDarwinLanguageOptions - Set the default language options for darwin.
145static void GetDarwinLanguageOptions(LangOptions &Opts,
146 const char *Triple) {
147 Opts.NeXTRuntime = true;
148
149 unsigned Maj, Min;
150 if (!getDarwinNumber(Triple, Maj, Min))
151 return;
152
153 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahaniand09b9f72009-02-12 17:54:33 +0000154 // As does nonfragile-abi for 64bit mode
Fariborz Jahanian27f58962009-02-24 23:34:44 +0000155 if (Maj > 9)
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000156 Opts.Blocks = 1;
Fariborz Jahanian27f58962009-02-24 23:34:44 +0000157
158 if (Maj >= 9)
Fariborz Jahaniand09b9f72009-02-12 17:54:33 +0000159 if (Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
160 Opts.ObjCNonFragileABI = 1;
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000161}
162
163
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000164//===----------------------------------------------------------------------===//
165// Defines specific to certain architectures.
166//===----------------------------------------------------------------------===//
Eli Friedman5fb0a022008-08-21 00:24:02 +0000167
Chris Lattner4b009652007-07-25 00:24:17 +0000168/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
169/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000170static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000171 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000172 Define(Defs, "__ppc__");
173 Define(Defs, "_ARCH_PPC");
174 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000175 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000176 Define(Defs, "_ARCH_PPC64");
177 Define(Defs, "_LP64");
178 Define(Defs, "__LP64__");
179 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000180 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000181 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000182 }
183
184 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000185 Define(Defs, "_BIG_ENDIAN");
186 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000187
Chris Lattner4b009652007-07-25 00:24:17 +0000188 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000189 Define(Defs, "__NATURAL_ALIGNMENT__");
190 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000191
Chris Lattner3da35682008-10-05 21:49:27 +0000192 // FIXME: Should be controlled by command line option.
Chris Lattner0db667a2007-10-06 06:57:34 +0000193 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000194}
195
196/// getX86Defines - Return a set of the X86-specific #defines that are
197/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000198static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000199 // Target identification.
200 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000201 Define(Defs, "_LP64");
202 Define(Defs, "__LP64__");
203 Define(Defs, "__amd64__");
204 Define(Defs, "__amd64");
205 Define(Defs, "__x86_64");
206 Define(Defs, "__x86_64__");
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000207 Define(Defs, "__SSE3__");
Chris Lattner4b009652007-07-25 00:24:17 +0000208 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000209 Define(Defs, "__i386__");
210 Define(Defs, "__i386");
211 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000212 }
213
214 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000215 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000216
Chris Lattner4b009652007-07-25 00:24:17 +0000217 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000218 Define(Defs, "__nocona");
219 Define(Defs, "__nocona__");
220 Define(Defs, "__tune_nocona__");
221 Define(Defs, "__SSE2_MATH__");
222 Define(Defs, "__SSE2__");
223 Define(Defs, "__SSE_MATH__");
224 Define(Defs, "__SSE__");
225 Define(Defs, "__MMX__");
226 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000227}
228
Chris Lattnerb6444052008-04-21 20:19:54 +0000229/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000230/// not tied to a specific subtarget.
231static void getARMDefines(std::vector<char> &Defs) {
232 // Target identification.
233 Define(Defs, "__arm");
234 Define(Defs, "__arm__");
235
236 // Target properties.
237 Define(Defs, "__LITTLE_ENDIAN__");
238
Chris Lattner9fd73612008-04-21 18:56:49 +0000239 // Subtarget options. [hard coded to v6 for now]
240 Define(Defs, "__ARM_ARCH_6K__");
241 Define(Defs, "__ARMEL__");
242 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner9fd73612008-04-21 18:56:49 +0000243}
244
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000245//===----------------------------------------------------------------------===//
246// Specific target implementations.
247//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000248
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000249namespace {
250// PPC abstract base class
251class PPCTargetInfo : public TargetInfo {
252 static const Builtin::Info BuiltinInfo[];
253 static const char * const GCCRegNames[];
254 static const TargetInfo::GCCRegAlias GCCRegAliases[];
255
256public:
257 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
258 CharIsSigned = false;
259 }
260 virtual void getTargetBuiltins(const Builtin::Info *&Records,
261 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000262 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000263 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000264 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000265 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-10-27 01:11:29 +0000266 return "typedef char* __builtin_va_list;";
267 // This is the right definition for ABI/V4: System V.4/eabi.
268 /*return "typedef struct __va_list_tag {"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000269 " unsigned char gpr;"
270 " unsigned char fpr;"
271 " unsigned short reserved;"
272 " void* overflow_arg_area;"
273 " void* reg_save_area;"
Chris Lattnera07708f2008-10-27 01:11:29 +0000274 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000275 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000276 virtual const char *getTargetPrefix() const {
277 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000278 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000279 virtual void getGCCRegNames(const char * const *&Names,
280 unsigned &NumNames) const;
281 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
282 unsigned &NumAliases) const;
283 virtual bool validateAsmConstraint(char c,
284 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000285 switch (c) {
286 default: return false;
287 case 'O': // Zero
288 return true;
289 case 'b': // Base register
290 case 'f': // Floating point register
291 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
292 return true;
293 }
294 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000295 virtual const char *getClobbers() const {
296 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000297 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000298};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000299
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000300const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-02-16 21:58:21 +0000301#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
302#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000303#include "clang/AST/PPCBuiltins.def"
304};
Chris Lattner9fd73612008-04-21 18:56:49 +0000305
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000306const char * const PPCTargetInfo::GCCRegNames[] = {
307 "0", "1", "2", "3", "4", "5", "6", "7",
308 "8", "9", "10", "11", "12", "13", "14", "15",
309 "16", "17", "18", "19", "20", "21", "22", "23",
310 "24", "25", "26", "27", "28", "29", "30", "31",
311 "0", "1", "2", "3", "4", "5", "6", "7",
312 "8", "9", "10", "11", "12", "13", "14", "15",
313 "16", "17", "18", "19", "20", "21", "22", "23",
314 "24", "25", "26", "27", "28", "29", "30", "31",
315 "mq", "lr", "ctr", "ap",
316 "0", "1", "2", "3", "4", "5", "6", "7",
317 "xer",
318 "0", "1", "2", "3", "4", "5", "6", "7",
319 "8", "9", "10", "11", "12", "13", "14", "15",
320 "16", "17", "18", "19", "20", "21", "22", "23",
321 "24", "25", "26", "27", "28", "29", "30", "31",
322 "vrsave", "vscr",
323 "spe_acc", "spefscr",
324 "sfp"
325};
Chris Lattner4b009652007-07-25 00:24:17 +0000326
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000327void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
328 unsigned &NumNames) const {
329 Names = GCCRegNames;
330 NumNames = llvm::array_lengthof(GCCRegNames);
331}
Chris Lattner4b009652007-07-25 00:24:17 +0000332
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000333const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
334 // While some of these aliases do map to different registers
335 // they still share the same register name.
336 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
337 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
338 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
339 { { "cr3", "fr3", "r3", "v3"}, "3" },
340 { { "cr4", "fr4", "r4", "v4"}, "4" },
341 { { "cr5", "fr5", "r5", "v5"}, "5" },
342 { { "cr6", "fr6", "r6", "v6"}, "6" },
343 { { "cr7", "fr7", "r7", "v7"}, "7" },
344 { { "fr8", "r8", "v8"}, "8" },
345 { { "fr9", "r9", "v9"}, "9" },
346 { { "fr10", "r10", "v10"}, "10" },
347 { { "fr11", "r11", "v11"}, "11" },
348 { { "fr12", "r12", "v12"}, "12" },
349 { { "fr13", "r13", "v13"}, "13" },
350 { { "fr14", "r14", "v14"}, "14" },
351 { { "fr15", "r15", "v15"}, "15" },
352 { { "fr16", "r16", "v16"}, "16" },
353 { { "fr17", "r17", "v17"}, "17" },
354 { { "fr18", "r18", "v18"}, "18" },
355 { { "fr19", "r19", "v19"}, "19" },
356 { { "fr20", "r20", "v20"}, "20" },
357 { { "fr21", "r21", "v21"}, "21" },
358 { { "fr22", "r22", "v22"}, "22" },
359 { { "fr23", "r23", "v23"}, "23" },
360 { { "fr24", "r24", "v24"}, "24" },
361 { { "fr25", "r25", "v25"}, "25" },
362 { { "fr26", "r26", "v26"}, "26" },
363 { { "fr27", "r27", "v27"}, "27" },
364 { { "fr28", "r28", "v28"}, "28" },
365 { { "fr29", "r29", "v29"}, "29" },
366 { { "fr30", "r30", "v30"}, "30" },
367 { { "fr31", "r31", "v31"}, "31" },
368};
369
370void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
371 unsigned &NumAliases) const {
372 Aliases = GCCRegAliases;
373 NumAliases = llvm::array_lengthof(GCCRegAliases);
374}
375} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000376
377namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000378class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000379public:
Eli Friedman2b161652008-08-21 00:13:15 +0000380 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
381 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
382 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
383 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000384 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000385 getPowerPCDefines(Defines, false);
386 }
Chris Lattner4b009652007-07-25 00:24:17 +0000387};
388} // end anonymous namespace.
389
390namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000391class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000392public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000393 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000394 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000395 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
396 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000397 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000398 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000399 getPowerPCDefines(Defines, true);
400 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000401};
402} // end anonymous namespace.
403
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000404
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000405namespace {
406class DarwinPPCTargetInfo : public PPC32TargetInfo {
407public:
408 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
409 virtual void getTargetDefines(std::vector<char> &Defines) const {
410 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000411 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000412 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000413
Chris Lattnerddae7102008-12-04 22:54:33 +0000414 /// getDefaultLangOptions - Allow the target to specify default settings for
415 /// various language options. These may be overridden by command line
416 /// options.
417 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000418 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000419 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000420};
421} // end anonymous namespace.
422
423namespace {
424class DarwinPPC64TargetInfo : public PPC64TargetInfo {
425public:
426 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
427 virtual void getTargetDefines(std::vector<char> &Defines) const {
428 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000429 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000430 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000431
Chris Lattnerddae7102008-12-04 22:54:33 +0000432 /// getDefaultLangOptions - Allow the target to specify default settings for
433 /// various language options. These may be overridden by command line
434 /// options.
435 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000436 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000437 }
Chris Lattner4b009652007-07-25 00:24:17 +0000438};
439} // end anonymous namespace.
440
441namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000442// Namespace for x86 abstract base class
443const Builtin::Info BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-02-16 21:58:21 +0000444#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
445#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedman872996c2008-08-20 02:34:37 +0000446#include "clang/AST/X86Builtins.def"
447};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000448
Eli Friedman872996c2008-08-20 02:34:37 +0000449const char *GCCRegNames[] = {
450 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
451 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
452 "argp", "flags", "fspr", "dirflag", "frame",
453 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
454 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
455 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
456 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
457};
458
459const TargetInfo::GCCRegAlias GCCRegAliases[] = {
460 { { "al", "ah", "eax", "rax" }, "ax" },
461 { { "bl", "bh", "ebx", "rbx" }, "bx" },
462 { { "cl", "ch", "ecx", "rcx" }, "cx" },
463 { { "dl", "dh", "edx", "rdx" }, "dx" },
464 { { "esi", "rsi" }, "si" },
465 { { "edi", "rdi" }, "di" },
466 { { "esp", "rsp" }, "sp" },
467 { { "ebp", "rbp" }, "bp" },
468};
469
470// X86 target abstract base class; x86-32 and x86-64 are very close, so
471// most of the implementation can be shared.
472class X86TargetInfo : public TargetInfo {
473public:
474 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
475 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000476 }
477 virtual void getTargetBuiltins(const Builtin::Info *&Records,
478 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000479 Records = BuiltinInfo;
480 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000481 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000482 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000483 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000484 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000485 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000486 unsigned &NumNames) const {
487 Names = GCCRegNames;
488 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000489 }
490 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
491 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000492 Aliases = GCCRegAliases;
493 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000494 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000495 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000496 TargetInfo::ConstraintInfo &info) const;
497 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000498 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000499 return "~{dirflag},~{fpsr},~{flags}";
500 }
Chris Lattner4b009652007-07-25 00:24:17 +0000501};
Eli Friedman872996c2008-08-20 02:34:37 +0000502
503bool
504X86TargetInfo::validateAsmConstraint(char c,
505 TargetInfo::ConstraintInfo &info) const {
506 switch (c) {
507 default: return false;
508 case 'a': // eax.
509 case 'b': // ebx.
510 case 'c': // ecx.
511 case 'd': // edx.
512 case 'S': // esi.
513 case 'D': // edi.
514 case 'A': // edx:eax.
515 case 't': // top of floating point stack.
516 case 'u': // second from top of floating point stack.
517 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000518 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000519 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000520 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssonff235da2009-01-24 18:03:09 +0000521 case 'e': // 32-bit signed integer constant for use with zero-extending
522 // x86_64 instructions.
523 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
524 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000525 case 'N': // unsigned 8-bit integer constant for use with in and out
526 // instructions.
527 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
528 return true;
529 }
530}
531
532std::string
533X86TargetInfo::convertConstraint(const char Constraint) const {
534 switch (Constraint) {
535 case 'a': return std::string("{ax}");
536 case 'b': return std::string("{bx}");
537 case 'c': return std::string("{cx}");
538 case 'd': return std::string("{dx}");
539 case 'S': return std::string("{si}");
540 case 'D': return std::string("{di}");
541 case 't': // top of floating point stack.
542 return std::string("{st}");
543 case 'u': // second from top of floating point stack.
544 return std::string("{st(1)}"); // second from top of floating point stack.
545 default:
546 return std::string(1, Constraint);
547 }
548}
Eli Friedman872996c2008-08-20 02:34:37 +0000549} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000550
551namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000552// X86-32 generic target
553class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000554public:
Eli Friedman872996c2008-08-20 02:34:37 +0000555 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
556 DoubleAlign = LongLongAlign = 32;
557 LongDoubleWidth = 96;
558 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000559 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
560 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
561 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000562 }
563 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000564 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000565 }
566 virtual void getTargetDefines(std::vector<char> &Defines) const {
567 getX86Defines(Defines, false);
568 }
569};
570} // end anonymous namespace
571
572namespace {
573// x86-32 Darwin (OS X) target
574class DarwinI386TargetInfo : public X86_32TargetInfo {
575public:
576 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
577 LongDoubleWidth = 128;
578 LongDoubleAlign = 128;
Chris Lattner8405e092009-02-05 07:19:24 +0000579 PtrDiffType = SignedInt;
Eli Friedman2b161652008-08-21 00:13:15 +0000580 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
581 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
582 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000583 }
584 virtual void getTargetDefines(std::vector<char> &Defines) const {
585 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000586 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000587 }
Chris Lattnerddae7102008-12-04 22:54:33 +0000588 /// getDefaultLangOptions - Allow the target to specify default settings for
589 /// various language options. These may be overridden by command line
590 /// options.
591 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000592 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000593 }
Eli Friedman872996c2008-08-20 02:34:37 +0000594};
595} // end anonymous namespace
596
597namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000598// x86-32 FreeBSD target
599class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
600public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000601 FreeBSDX86_32TargetInfo(const std::string& triple) :
602 X86_32TargetInfo(triple) {
603 SizeType = UnsignedInt;
604 PtrDiffType = SignedInt;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000605 }
606 virtual void getTargetDefines(std::vector<char> &Defines) const {
607 X86_32TargetInfo::getTargetDefines(Defines);
608 getFreeBSDDefines(Defines, 0, getTargetTriple());
609 }
610};
611} // end anonymous namespace
612
613namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000614// x86-32 DragonFly target
615class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
616public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000617 DragonFlyX86_32TargetInfo(const std::string& triple) :
618 X86_32TargetInfo(triple) {
619 SizeType = UnsignedInt;
620 PtrDiffType = SignedInt;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000621 }
622 virtual void getTargetDefines(std::vector<char> &Defines) const {
623 X86_32TargetInfo::getTargetDefines(Defines);
624 getDragonFlyDefines(Defines);
625 }
626};
627} // end anonymous namespace
628
629namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000630// x86-32 Linux target
631class LinuxX86_32TargetInfo : public X86_32TargetInfo {
632public:
633 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000634 UserLabelPrefix = "";
Eli Friedman7cca0982008-11-02 02:43:55 +0000635 SizeType = UnsignedInt;
636 PtrDiffType = SignedInt;
Chris Lattnerd9ef7242009-02-13 22:28:55 +0000637 IntPtrType = SignedInt;
Eli Friedman5fb0a022008-08-21 00:24:02 +0000638 }
639 virtual void getTargetDefines(std::vector<char> &Defines) const {
640 X86_32TargetInfo::getTargetDefines(Defines);
641 getLinuxDefines(Defines);
642 }
643};
644} // end anonymous namespace
645
646namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000647// x86-32 Windows target
648class WindowsX86_32TargetInfo : public X86_32TargetInfo {
649public:
650 WindowsX86_32TargetInfo(const std::string& triple)
651 : X86_32TargetInfo(triple) {
652 // FIXME: Fix wchar_t.
653 // FIXME: We should probably enable -fms-extensions by default for
654 // this target.
Eli Friedman7cca0982008-11-02 02:43:55 +0000655 SizeType = UnsignedInt;
656 PtrDiffType = SignedInt;
Eli Friedman23cb7912008-08-21 01:40:19 +0000657 }
658 virtual void getTargetDefines(std::vector<char> &Defines) const {
659 X86_32TargetInfo::getTargetDefines(Defines);
660 // This list is based off of the the list of things MingW defines
661 Define(Defines, "__WIN32__");
662 Define(Defines, "__WIN32");
663 Define(Defines, "_WIN32");
664 Define(Defines, "WIN32");
665 Define(Defines, "__WINNT__");
666 Define(Defines, "__WINNT");
667 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000668 Define(Defines, "_X86_");
669 Define(Defines, "__MSVCRT__");
670 }
671};
672} // end anonymous namespace
673
674namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000675// x86-64 generic target
676class X86_64TargetInfo : public X86TargetInfo {
677public:
678 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000679 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner4dfc45a2009-01-28 06:58:19 +0000680 DoubleAlign = LongLongAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000681 LongDoubleWidth = 128;
682 LongDoubleAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000683 IntMaxType = SignedLong;
684 UIntMaxType = UnsignedLong;
685
Eli Friedman2b161652008-08-21 00:13:15 +0000686 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
687 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
688 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000689 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000690 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000691 return "typedef struct __va_list_tag {"
692 " unsigned gp_offset;"
693 " unsigned fp_offset;"
694 " void* overflow_arg_area;"
695 " void* reg_save_area;"
696 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000697 }
Eli Friedman872996c2008-08-20 02:34:37 +0000698 virtual void getTargetDefines(std::vector<char> &Defines) const {
699 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000700 }
Eli Friedman872996c2008-08-20 02:34:37 +0000701};
702} // end anonymous namespace
703
704namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000705// x86-64 FreeBSD target
706class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
707public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000708 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner98cb2a22008-10-16 17:04:31 +0000709 virtual void getTargetDefines(std::vector<char> &Defines) const {
710 X86_64TargetInfo::getTargetDefines(Defines);
711 getFreeBSDDefines(Defines, 1, getTargetTriple());
712 }
713};
714} // end anonymous namespace
715
716namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000717// x86-64 Linux target
718class LinuxX86_64TargetInfo : public X86_64TargetInfo {
719public:
720 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000721 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000722 }
723 virtual void getTargetDefines(std::vector<char> &Defines) const {
724 X86_64TargetInfo::getTargetDefines(Defines);
725 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000726 }
727};
728} // end anonymous namespace
729
730namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000731// x86-64 Darwin (OS X) target
732class DarwinX86_64TargetInfo : public X86_64TargetInfo {
733public:
734 DarwinX86_64TargetInfo(const std::string& triple) :
735 X86_64TargetInfo(triple) {}
736
737 virtual void getTargetDefines(std::vector<char> &Defines) const {
738 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000739 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000740 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000741
Chris Lattnerddae7102008-12-04 22:54:33 +0000742 /// getDefaultLangOptions - Allow the target to specify default settings for
743 /// various language options. These may be overridden by command line
744 /// options.
745 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000746 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000747 }
Chris Lattner4b009652007-07-25 00:24:17 +0000748};
749} // end anonymous namespace.
750
Chris Lattner9fd73612008-04-21 18:56:49 +0000751namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000752class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000753public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000754 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
755 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000756 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
757 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000758 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000759 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000760 getARMDefines(Defines);
761 }
762 virtual void getTargetBuiltins(const Builtin::Info *&Records,
763 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000764 // FIXME: Implement.
765 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000766 NumRecords = 0;
767 }
768 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000769 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000770 }
771 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000772 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000773 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000774 virtual void getGCCRegNames(const char * const *&Names,
775 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000776 // FIXME: Implement.
777 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000778 NumNames = 0;
779 }
780 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
781 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000782 // FIXME: Implement.
783 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000784 NumAliases = 0;
785 }
786 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000787 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000788 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000789 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000790 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000791 case 'l': // r0-r7
792 case 'h': // r8-r15
793 case 'w': // VFP Floating point register single precision
794 case 'P': // VFP Floating point register double precision
795 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
796 return true;
797 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000798 return false;
799 }
800 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000801 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000802 return "";
803 }
804};
805} // end anonymous namespace.
806
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000807
808namespace {
809class DarwinARMTargetInfo : public ARMTargetInfo {
810public:
811 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
812
813 virtual void getTargetDefines(std::vector<char> &Defines) const {
814 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000815 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000816 }
817};
818} // end anonymous namespace.
819
Chris Lattner4b009652007-07-25 00:24:17 +0000820namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000821class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000822 static const TargetInfo::GCCRegAlias GCCRegAliases[];
823 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000824public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000825 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
826 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000827 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
828 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000829 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000830 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000831 // FIXME: This is missing a lot of important defines; some of the
832 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000833 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000834 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000835 Define(Defines, "__sparcv8");
836 }
837 virtual void getTargetBuiltins(const Builtin::Info *&Records,
838 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000839 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000840 }
841 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000842 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000843 }
844 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000845 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000846 }
847 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000848 unsigned &NumNames) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000849 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000850 unsigned &NumAliases) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000851 virtual bool validateAsmConstraint(char c,
852 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000853 // FIXME: Implement!
854 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000855 }
856 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000857 // FIXME: Implement!
858 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000859 }
860};
861
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000862const char * const SparcV8TargetInfo::GCCRegNames[] = {
863 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
864 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
865 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
866 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
867};
868
869void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
870 unsigned &NumNames) const {
871 Names = GCCRegNames;
872 NumNames = llvm::array_lengthof(GCCRegNames);
873}
874
875const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
876 { { "g0" }, "r0" },
877 { { "g1" }, "r1" },
878 { { "g2" }, "r2" },
879 { { "g3" }, "r3" },
880 { { "g4" }, "r4" },
881 { { "g5" }, "r5" },
882 { { "g6" }, "r6" },
883 { { "g7" }, "r7" },
884 { { "o0" }, "r8" },
885 { { "o1" }, "r9" },
886 { { "o2" }, "r10" },
887 { { "o3" }, "r11" },
888 { { "o4" }, "r12" },
889 { { "o5" }, "r13" },
890 { { "o6", "sp" }, "r14" },
891 { { "o7" }, "r15" },
892 { { "l0" }, "r16" },
893 { { "l1" }, "r17" },
894 { { "l2" }, "r18" },
895 { { "l3" }, "r19" },
896 { { "l4" }, "r20" },
897 { { "l5" }, "r21" },
898 { { "l6" }, "r22" },
899 { { "l7" }, "r23" },
900 { { "i0" }, "r24" },
901 { { "i1" }, "r25" },
902 { { "i2" }, "r26" },
903 { { "i3" }, "r27" },
904 { { "i4" }, "r28" },
905 { { "i5" }, "r29" },
906 { { "i6", "fp" }, "r30" },
907 { { "i7" }, "r31" },
908};
909
910void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
911 unsigned &NumAliases) const {
912 Aliases = GCCRegAliases;
913 NumAliases = llvm::array_lengthof(GCCRegAliases);
914}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000915} // end anonymous namespace.
916
Eli Friedmanff158dd2008-08-20 07:28:14 +0000917namespace {
918class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
919public:
920 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +0000921 SparcV8TargetInfo(triple) {
922 SizeType = UnsignedInt;
923 PtrDiffType = SignedInt;
924 }
Eli Friedmanff158dd2008-08-20 07:28:14 +0000925
926 virtual void getTargetDefines(std::vector<char> &Defines) const {
927 SparcV8TargetInfo::getTargetDefines(Defines);
928 getSolarisDefines(Defines);
929 }
930};
931} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000932
Chris Lattner85970f32008-05-08 05:58:21 +0000933namespace {
934 class PIC16TargetInfo : public TargetInfo{
935 public:
936 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptafa451432008-10-31 09:52:39 +0000937 IntWidth = 16;
938 LongWidth = LongLongWidth = 32;
939 PointerWidth = 16;
940 IntAlign = 8;
941 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000942 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +0000943 SizeType = UnsignedInt;
944 IntMaxType = SignedLong;
945 UIntMaxType = UnsignedLong;
Chris Lattnerd9ef7242009-02-13 22:28:55 +0000946 IntPtrType = SignedShort;
Eli Friedman7cca0982008-11-02 02:43:55 +0000947 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000948 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000949 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000950 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
951 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000952 virtual void getTargetDefines(std::vector<char> &Defines) const {
953 Define(Defines, "__pic16");
954 }
955 virtual void getTargetBuiltins(const Builtin::Info *&Records,
956 unsigned &NumRecords) const {}
957 virtual const char *getVAListDeclaration() const { return "";}
958 virtual const char *getClobbers() const {return "";}
959 virtual const char *getTargetPrefix() const {return "";}
960 virtual void getGCCRegNames(const char * const *&Names,
961 unsigned &NumNames) const {}
962 virtual bool validateAsmConstraint(char c,
963 TargetInfo::ConstraintInfo &info) const {
964 return true;
965 }
966 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
967 unsigned &NumAliases) const {}
968 virtual bool useGlobalsForAutomaticVariables() const {return true;}
969 };
970}
971
Chris Lattner4b009652007-07-25 00:24:17 +0000972//===----------------------------------------------------------------------===//
973// Driver code
974//===----------------------------------------------------------------------===//
975
Ted Kremenekb97d7672007-12-04 17:07:35 +0000976static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000977 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
978 TT[4] == '-' && TT[1] - '3' < 6);
979}
980
Chris Lattnerfc457002008-03-05 01:18:20 +0000981/// CreateTargetInfo - Return the target info object for the specified target
982/// triple.
983TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000984 // OS detection; this isn't really anywhere near complete.
985 // Additions and corrections are welcome.
986 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000987 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000988 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000989 bool isSolaris = T.find("-solaris") != std::string::npos;
990 bool isLinux = T.find("-linux") != std::string::npos;
991 bool isWindows = T.find("-windows") != std::string::npos ||
992 T.find("-win32") != std::string::npos ||
993 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000994
Eli Friedman2b161652008-08-21 00:13:15 +0000995 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
996 if (isDarwin)
997 return new DarwinPPCTargetInfo(T);
998 return new PPC32TargetInfo(T);
999 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001000
Eli Friedman2b161652008-08-21 00:13:15 +00001001 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1002 if (isDarwin)
1003 return new DarwinPPC64TargetInfo(T);
1004 return new PPC64TargetInfo(T);
1005 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001006
Eli Friedman2b161652008-08-21 00:13:15 +00001007 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
1008 if (isDarwin)
1009 return new DarwinARMTargetInfo(T);
1010 return new ARMTargetInfo(T);
1011 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001012
Eli Friedman2b161652008-08-21 00:13:15 +00001013 if (T.find("sparc-") == 0) {
1014 if (isSolaris)
1015 return new SolarisSparcV8TargetInfo(T);
1016 return new SparcV8TargetInfo(T);
1017 }
1018
Chris Lattner273dce42009-02-20 17:04:14 +00001019 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001020 if (isDarwin)
1021 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001022 if (isLinux)
1023 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001024 if (isFreeBSD)
1025 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001026 return new X86_64TargetInfo(T);
1027 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001028
Chris Lattner85970f32008-05-08 05:58:21 +00001029 if (T.find("pic16-") == 0)
1030 return new PIC16TargetInfo(T);
1031
Eli Friedman2b161652008-08-21 00:13:15 +00001032 if (IsX86(T)) {
1033 if (isDarwin)
1034 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001035 if (isLinux)
1036 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001037 if (isDragonFly)
1038 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001039 if (isFreeBSD)
1040 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001041 if (isWindows)
1042 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001043 return new X86_32TargetInfo(T);
1044 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001045
Chris Lattnerfc457002008-03-05 01:18:20 +00001046 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001047}
Ted Kremenekd507bab2008-03-04 17:47:18 +00001048