blob: f82b0fcdb1bb53313600426b8b3d3c01c4a245ba [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"
Chris Lattnerddae7102008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000020#include "llvm/ADT/APFloat.h"
Chris Lattner4b009652007-07-25 00:24:17 +000021using namespace clang;
22
Chris Lattner4b009652007-07-25 00:24:17 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattner0db667a2007-10-06 06:57:34 +000027static void Define(std::vector<char> &Buf, const char *Macro,
28 const char *Val = "1") {
29 const char *Def = "#define ";
30 Buf.insert(Buf.end(), Def, Def+strlen(Def));
31 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
32 Buf.push_back(' ');
33 Buf.insert(Buf.end(), Val, Val+strlen(Val));
34 Buf.push_back('\n');
35}
36
Chris Lattnerbd00eb82008-10-05 21:50:58 +000037//===----------------------------------------------------------------------===//
38// Defines specific to certain operating systems.
39//===----------------------------------------------------------------------===//
40
Eli Friedmanff158dd2008-08-20 07:28:14 +000041static void getSolarisDefines(std::vector<char> &Defs) {
42 Define(Defs, "__SUN__");
43 Define(Defs, "__SOLARIS__");
44}
Chris Lattner4b009652007-07-25 00:24:17 +000045
Nate Begemanff1ba1f2009-01-18 01:08:03 +000046static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit,
47 const char *Triple) {
Chris Lattner98cb2a22008-10-16 17:04:31 +000048 // FreeBSD defines; list based off of gcc output
49
50 const char *FreeBSD = strstr(Triple, "-freebsd");
51 FreeBSD += strlen("-freebsd");
52 char release[] = "X";
53 release[0] = FreeBSD[0];
54 char version[] = "X00001";
55 version[0] = FreeBSD[0];
56
57 Define(Defs, "__FreeBSD__", release);
58 Define(Defs, "__FreeBSD_cc_version", version);
59 Define(Defs, "__KPRINTF_ATTRIBUTE__");
60 Define(Defs, "unix");
61 Define(Defs, "bsd");
62 if (is64Bit) {
63 Define(Defs, "__LP64__");
64 }
65}
66
Chris Lattnerbd00eb82008-10-05 21:50:58 +000067static void getDragonFlyDefines(std::vector<char> &Defs) {
68 // DragonFly defines; list based off of gcc output
69 Define(Defs, "__DragonFly__");
70 Define(Defs, "__DragonFly_cc_version", "100001");
71 Define(Defs, "__ELF__");
72 Define(Defs, "__KPRINTF_ATTRIBUTE__");
73 Define(Defs, "__tune_i386__");
74 Define(Defs, "unix");
75 Define(Defs, "__unix");
76 Define(Defs, "__unix__");
77}
78
79static void getLinuxDefines(std::vector<char> &Defs) {
80 // Linux defines; list based off of gcc output
81 Define(Defs, "__unix__");
82 Define(Defs, "__unix");
83 Define(Defs, "unix");
84 Define(Defs, "__linux__");
85 Define(Defs, "__linux");
86 Define(Defs, "linux");
87 Define(Defs, "__gnu_linux__");
88}
89
Chris Lattnerd7bc88b2008-12-04 23:20:07 +000090/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
91/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
92/// not defined, return 0's. Return true if we have -darwin in the string or
93/// false otherwise.
94static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
95 Maj = Min = 0;
96 const char *Darwin = strstr(Triple, "-darwin");
97 if (Darwin == 0) return false;
98
99 Darwin += strlen("-darwin");
100 if (Darwin[0] < '0' || Darwin[0] > '9')
101 return true;
102
103 Maj = Darwin[0]-'0';
104 ++Darwin;
105
106 // Handle "darwin11".
107 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
108 Maj = 10+Darwin[0]-'0';
109 ++Darwin;
110 }
111
112 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
113 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
114 Darwin[2] == '\0')
115 Min = Darwin[1]-'0';
116
117 return true;
118}
119
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000120static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +0000121 Define(Defs, "__APPLE__");
122 Define(Defs, "__MACH__");
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000123
124 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000125 unsigned Maj, Min;
126 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000127 char DarwinStr[] = "1000";
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000128 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
129 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
130 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000131 }
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000132
133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
134 DarwinStr[3] = Min+'0';
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000135 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000136 }
Eli Friedman872996c2008-08-20 02:34:37 +0000137}
Chris Lattner4b009652007-07-25 00:24:17 +0000138
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000139/// GetDarwinLanguageOptions - Set the default language options for darwin.
140static void GetDarwinLanguageOptions(LangOptions &Opts,
141 const char *Triple) {
142 Opts.NeXTRuntime = true;
143
144 unsigned Maj, Min;
145 if (!getDarwinNumber(Triple, Maj, Min))
146 return;
147
148 // Blocks default to on for 10.6 (darwin10) and beyond.
149 if (Maj > 9)
150 Opts.Blocks = 1;
151}
152
153
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000154//===----------------------------------------------------------------------===//
155// Defines specific to certain architectures.
156//===----------------------------------------------------------------------===//
Eli Friedman5fb0a022008-08-21 00:24:02 +0000157
Chris Lattner4b009652007-07-25 00:24:17 +0000158/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
159/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000160static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000161 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000162 Define(Defs, "__ppc__");
163 Define(Defs, "_ARCH_PPC");
164 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000165 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000166 Define(Defs, "_ARCH_PPC64");
167 Define(Defs, "_LP64");
168 Define(Defs, "__LP64__");
169 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000170 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000171 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000172 }
173
174 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000175 Define(Defs, "_BIG_ENDIAN");
176 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000177
Chris Lattner4b009652007-07-25 00:24:17 +0000178 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000179 Define(Defs, "__NATURAL_ALIGNMENT__");
180 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000181
Chris Lattner3da35682008-10-05 21:49:27 +0000182 // FIXME: Should be controlled by command line option.
Chris Lattner0db667a2007-10-06 06:57:34 +0000183 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000184}
185
186/// getX86Defines - Return a set of the X86-specific #defines that are
187/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000188static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000189 // Target identification.
190 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000191 Define(Defs, "_LP64");
192 Define(Defs, "__LP64__");
193 Define(Defs, "__amd64__");
194 Define(Defs, "__amd64");
195 Define(Defs, "__x86_64");
196 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000197 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000198 Define(Defs, "__i386__");
199 Define(Defs, "__i386");
200 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000201 }
202
203 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000204 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000205
Chris Lattner4b009652007-07-25 00:24:17 +0000206 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000207 Define(Defs, "__nocona");
208 Define(Defs, "__nocona__");
209 Define(Defs, "__tune_nocona__");
210 Define(Defs, "__SSE2_MATH__");
211 Define(Defs, "__SSE2__");
212 Define(Defs, "__SSE_MATH__");
213 Define(Defs, "__SSE__");
214 Define(Defs, "__MMX__");
215 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000216}
217
Chris Lattnerb6444052008-04-21 20:19:54 +0000218/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000219/// not tied to a specific subtarget.
220static void getARMDefines(std::vector<char> &Defs) {
221 // Target identification.
222 Define(Defs, "__arm");
223 Define(Defs, "__arm__");
224
225 // Target properties.
226 Define(Defs, "__LITTLE_ENDIAN__");
227
Chris Lattner9fd73612008-04-21 18:56:49 +0000228 // Subtarget options. [hard coded to v6 for now]
229 Define(Defs, "__ARM_ARCH_6K__");
230 Define(Defs, "__ARMEL__");
231 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner9fd73612008-04-21 18:56:49 +0000232}
233
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000234//===----------------------------------------------------------------------===//
235// Specific target implementations.
236//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000237
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000238namespace {
239// PPC abstract base class
240class PPCTargetInfo : public TargetInfo {
241 static const Builtin::Info BuiltinInfo[];
242 static const char * const GCCRegNames[];
243 static const TargetInfo::GCCRegAlias GCCRegAliases[];
244
245public:
246 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
247 CharIsSigned = false;
248 }
249 virtual void getTargetBuiltins(const Builtin::Info *&Records,
250 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000251 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000252 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000253 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000254 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-10-27 01:11:29 +0000255 return "typedef char* __builtin_va_list;";
256 // This is the right definition for ABI/V4: System V.4/eabi.
257 /*return "typedef struct __va_list_tag {"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000258 " unsigned char gpr;"
259 " unsigned char fpr;"
260 " unsigned short reserved;"
261 " void* overflow_arg_area;"
262 " void* reg_save_area;"
Chris Lattnera07708f2008-10-27 01:11:29 +0000263 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000264 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000265 virtual const char *getTargetPrefix() const {
266 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000267 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000268 virtual void getGCCRegNames(const char * const *&Names,
269 unsigned &NumNames) const;
270 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
271 unsigned &NumAliases) const;
272 virtual bool validateAsmConstraint(char c,
273 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000274 switch (c) {
275 default: return false;
276 case 'O': // Zero
277 return true;
278 case 'b': // Base register
279 case 'f': // Floating point register
280 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
281 return true;
282 }
283 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000284 virtual const char *getClobbers() const {
285 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000286 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000287};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000288
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000289const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
290#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
291#include "clang/AST/PPCBuiltins.def"
292};
Chris Lattner9fd73612008-04-21 18:56:49 +0000293
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000294const char * const PPCTargetInfo::GCCRegNames[] = {
295 "0", "1", "2", "3", "4", "5", "6", "7",
296 "8", "9", "10", "11", "12", "13", "14", "15",
297 "16", "17", "18", "19", "20", "21", "22", "23",
298 "24", "25", "26", "27", "28", "29", "30", "31",
299 "0", "1", "2", "3", "4", "5", "6", "7",
300 "8", "9", "10", "11", "12", "13", "14", "15",
301 "16", "17", "18", "19", "20", "21", "22", "23",
302 "24", "25", "26", "27", "28", "29", "30", "31",
303 "mq", "lr", "ctr", "ap",
304 "0", "1", "2", "3", "4", "5", "6", "7",
305 "xer",
306 "0", "1", "2", "3", "4", "5", "6", "7",
307 "8", "9", "10", "11", "12", "13", "14", "15",
308 "16", "17", "18", "19", "20", "21", "22", "23",
309 "24", "25", "26", "27", "28", "29", "30", "31",
310 "vrsave", "vscr",
311 "spe_acc", "spefscr",
312 "sfp"
313};
Chris Lattner4b009652007-07-25 00:24:17 +0000314
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000315void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
316 unsigned &NumNames) const {
317 Names = GCCRegNames;
318 NumNames = llvm::array_lengthof(GCCRegNames);
319}
Chris Lattner4b009652007-07-25 00:24:17 +0000320
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000321const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
322 // While some of these aliases do map to different registers
323 // they still share the same register name.
324 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
325 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
326 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
327 { { "cr3", "fr3", "r3", "v3"}, "3" },
328 { { "cr4", "fr4", "r4", "v4"}, "4" },
329 { { "cr5", "fr5", "r5", "v5"}, "5" },
330 { { "cr6", "fr6", "r6", "v6"}, "6" },
331 { { "cr7", "fr7", "r7", "v7"}, "7" },
332 { { "fr8", "r8", "v8"}, "8" },
333 { { "fr9", "r9", "v9"}, "9" },
334 { { "fr10", "r10", "v10"}, "10" },
335 { { "fr11", "r11", "v11"}, "11" },
336 { { "fr12", "r12", "v12"}, "12" },
337 { { "fr13", "r13", "v13"}, "13" },
338 { { "fr14", "r14", "v14"}, "14" },
339 { { "fr15", "r15", "v15"}, "15" },
340 { { "fr16", "r16", "v16"}, "16" },
341 { { "fr17", "r17", "v17"}, "17" },
342 { { "fr18", "r18", "v18"}, "18" },
343 { { "fr19", "r19", "v19"}, "19" },
344 { { "fr20", "r20", "v20"}, "20" },
345 { { "fr21", "r21", "v21"}, "21" },
346 { { "fr22", "r22", "v22"}, "22" },
347 { { "fr23", "r23", "v23"}, "23" },
348 { { "fr24", "r24", "v24"}, "24" },
349 { { "fr25", "r25", "v25"}, "25" },
350 { { "fr26", "r26", "v26"}, "26" },
351 { { "fr27", "r27", "v27"}, "27" },
352 { { "fr28", "r28", "v28"}, "28" },
353 { { "fr29", "r29", "v29"}, "29" },
354 { { "fr30", "r30", "v30"}, "30" },
355 { { "fr31", "r31", "v31"}, "31" },
356};
357
358void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
359 unsigned &NumAliases) const {
360 Aliases = GCCRegAliases;
361 NumAliases = llvm::array_lengthof(GCCRegAliases);
362}
363} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000364
365namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000366class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000367public:
Eli Friedman2b161652008-08-21 00:13:15 +0000368 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
369 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
370 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
371 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000372 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000373 getPowerPCDefines(Defines, false);
374 }
Chris Lattner4b009652007-07-25 00:24:17 +0000375};
376} // end anonymous namespace.
377
378namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000379class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000380public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000381 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000382 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000383 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
384 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000385 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000386 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000387 getPowerPCDefines(Defines, true);
388 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000389};
390} // end anonymous namespace.
391
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000392
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000393namespace {
394class DarwinPPCTargetInfo : public PPC32TargetInfo {
395public:
396 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
397 virtual void getTargetDefines(std::vector<char> &Defines) const {
398 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000399 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000400 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000401
Chris Lattnerddae7102008-12-04 22:54:33 +0000402 /// getDefaultLangOptions - Allow the target to specify default settings for
403 /// various language options. These may be overridden by command line
404 /// options.
405 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000406 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000407 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000408};
409} // end anonymous namespace.
410
411namespace {
412class DarwinPPC64TargetInfo : public PPC64TargetInfo {
413public:
414 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
415 virtual void getTargetDefines(std::vector<char> &Defines) const {
416 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000417 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000418 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000419
Chris Lattnerddae7102008-12-04 22:54:33 +0000420 /// getDefaultLangOptions - Allow the target to specify default settings for
421 /// various language options. These may be overridden by command line
422 /// options.
423 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000424 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000425 }
Chris Lattner4b009652007-07-25 00:24:17 +0000426};
427} // end anonymous namespace.
428
429namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000430// Namespace for x86 abstract base class
431const Builtin::Info BuiltinInfo[] = {
432#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
433#include "clang/AST/X86Builtins.def"
434};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000435
Eli Friedman872996c2008-08-20 02:34:37 +0000436const char *GCCRegNames[] = {
437 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
438 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
439 "argp", "flags", "fspr", "dirflag", "frame",
440 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
441 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
442 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
443 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
444};
445
446const TargetInfo::GCCRegAlias GCCRegAliases[] = {
447 { { "al", "ah", "eax", "rax" }, "ax" },
448 { { "bl", "bh", "ebx", "rbx" }, "bx" },
449 { { "cl", "ch", "ecx", "rcx" }, "cx" },
450 { { "dl", "dh", "edx", "rdx" }, "dx" },
451 { { "esi", "rsi" }, "si" },
452 { { "edi", "rdi" }, "di" },
453 { { "esp", "rsp" }, "sp" },
454 { { "ebp", "rbp" }, "bp" },
455};
456
457// X86 target abstract base class; x86-32 and x86-64 are very close, so
458// most of the implementation can be shared.
459class X86TargetInfo : public TargetInfo {
460public:
461 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
462 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000463 }
464 virtual void getTargetBuiltins(const Builtin::Info *&Records,
465 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000466 Records = BuiltinInfo;
467 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000468 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000469 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000470 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000471 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000472 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000473 unsigned &NumNames) const {
474 Names = GCCRegNames;
475 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000476 }
477 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
478 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000479 Aliases = GCCRegAliases;
480 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000481 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000482 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000483 TargetInfo::ConstraintInfo &info) const;
484 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000485 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000486 return "~{dirflag},~{fpsr},~{flags}";
487 }
Chris Lattner4b009652007-07-25 00:24:17 +0000488};
Eli Friedman872996c2008-08-20 02:34:37 +0000489
490bool
491X86TargetInfo::validateAsmConstraint(char c,
492 TargetInfo::ConstraintInfo &info) const {
493 switch (c) {
494 default: return false;
495 case 'a': // eax.
496 case 'b': // ebx.
497 case 'c': // ecx.
498 case 'd': // edx.
499 case 'S': // esi.
500 case 'D': // edi.
501 case 'A': // edx:eax.
502 case 't': // top of floating point stack.
503 case 'u': // second from top of floating point stack.
504 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000505 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000506 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000507 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssonff235da2009-01-24 18:03:09 +0000508 case 'e': // 32-bit signed integer constant for use with zero-extending
509 // x86_64 instructions.
510 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
511 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000512 case 'N': // unsigned 8-bit integer constant for use with in and out
513 // instructions.
514 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
515 return true;
516 }
517}
518
519std::string
520X86TargetInfo::convertConstraint(const char Constraint) const {
521 switch (Constraint) {
522 case 'a': return std::string("{ax}");
523 case 'b': return std::string("{bx}");
524 case 'c': return std::string("{cx}");
525 case 'd': return std::string("{dx}");
526 case 'S': return std::string("{si}");
527 case 'D': return std::string("{di}");
528 case 't': // top of floating point stack.
529 return std::string("{st}");
530 case 'u': // second from top of floating point stack.
531 return std::string("{st(1)}"); // second from top of floating point stack.
532 default:
533 return std::string(1, Constraint);
534 }
535}
Eli Friedman872996c2008-08-20 02:34:37 +0000536} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000537
538namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000539// X86-32 generic target
540class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000541public:
Eli Friedman872996c2008-08-20 02:34:37 +0000542 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
543 DoubleAlign = LongLongAlign = 32;
544 LongDoubleWidth = 96;
545 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000546 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
547 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
548 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000549 }
550 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000551 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000552 }
553 virtual void getTargetDefines(std::vector<char> &Defines) const {
554 getX86Defines(Defines, false);
555 }
556};
557} // end anonymous namespace
558
559namespace {
560// x86-32 Darwin (OS X) target
561class DarwinI386TargetInfo : public X86_32TargetInfo {
562public:
563 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
564 LongDoubleWidth = 128;
565 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000566 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
567 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
568 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000569 }
570 virtual void getTargetDefines(std::vector<char> &Defines) const {
571 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000572 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000573 }
Chris Lattnerddae7102008-12-04 22:54:33 +0000574 /// getDefaultLangOptions - Allow the target to specify default settings for
575 /// various language options. These may be overridden by command line
576 /// options.
577 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000578 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000579 }
Eli Friedman872996c2008-08-20 02:34:37 +0000580};
581} // end anonymous namespace
582
583namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000584// x86-32 FreeBSD target
585class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
586public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000587 FreeBSDX86_32TargetInfo(const std::string& triple) :
588 X86_32TargetInfo(triple) {
589 SizeType = UnsignedInt;
590 PtrDiffType = SignedInt;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000591 }
592 virtual void getTargetDefines(std::vector<char> &Defines) const {
593 X86_32TargetInfo::getTargetDefines(Defines);
594 getFreeBSDDefines(Defines, 0, getTargetTriple());
595 }
596};
597} // end anonymous namespace
598
599namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000600// x86-32 DragonFly target
601class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
602public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000603 DragonFlyX86_32TargetInfo(const std::string& triple) :
604 X86_32TargetInfo(triple) {
605 SizeType = UnsignedInt;
606 PtrDiffType = SignedInt;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000607 }
608 virtual void getTargetDefines(std::vector<char> &Defines) const {
609 X86_32TargetInfo::getTargetDefines(Defines);
610 getDragonFlyDefines(Defines);
611 }
612};
613} // end anonymous namespace
614
615namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000616// x86-32 Linux target
617class LinuxX86_32TargetInfo : public X86_32TargetInfo {
618public:
619 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000620 UserLabelPrefix = "";
Eli Friedman7cca0982008-11-02 02:43:55 +0000621 SizeType = UnsignedInt;
622 PtrDiffType = SignedInt;
Eli Friedman5fb0a022008-08-21 00:24:02 +0000623 }
624 virtual void getTargetDefines(std::vector<char> &Defines) const {
625 X86_32TargetInfo::getTargetDefines(Defines);
626 getLinuxDefines(Defines);
627 }
628};
629} // end anonymous namespace
630
631namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000632// x86-32 Windows target
633class WindowsX86_32TargetInfo : public X86_32TargetInfo {
634public:
635 WindowsX86_32TargetInfo(const std::string& triple)
636 : X86_32TargetInfo(triple) {
637 // FIXME: Fix wchar_t.
638 // FIXME: We should probably enable -fms-extensions by default for
639 // this target.
Eli Friedman7cca0982008-11-02 02:43:55 +0000640 SizeType = UnsignedInt;
641 PtrDiffType = SignedInt;
Eli Friedman23cb7912008-08-21 01:40:19 +0000642 }
643 virtual void getTargetDefines(std::vector<char> &Defines) const {
644 X86_32TargetInfo::getTargetDefines(Defines);
645 // This list is based off of the the list of things MingW defines
646 Define(Defines, "__WIN32__");
647 Define(Defines, "__WIN32");
648 Define(Defines, "_WIN32");
649 Define(Defines, "WIN32");
650 Define(Defines, "__WINNT__");
651 Define(Defines, "__WINNT");
652 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000653 Define(Defines, "_X86_");
654 Define(Defines, "__MSVCRT__");
655 }
656};
657} // end anonymous namespace
658
659namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000660// x86-64 generic target
661class X86_64TargetInfo : public X86TargetInfo {
662public:
663 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000664 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000665 LongDoubleWidth = 128;
666 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000667 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
668 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
669 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000670 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000671 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000672 return "typedef struct __va_list_tag {"
673 " unsigned gp_offset;"
674 " unsigned fp_offset;"
675 " void* overflow_arg_area;"
676 " void* reg_save_area;"
677 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000678 }
Eli Friedman872996c2008-08-20 02:34:37 +0000679 virtual void getTargetDefines(std::vector<char> &Defines) const {
680 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000681 }
Eli Friedman872996c2008-08-20 02:34:37 +0000682};
683} // end anonymous namespace
684
685namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000686// x86-64 FreeBSD target
687class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
688public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000689 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner98cb2a22008-10-16 17:04:31 +0000690 virtual void getTargetDefines(std::vector<char> &Defines) const {
691 X86_64TargetInfo::getTargetDefines(Defines);
692 getFreeBSDDefines(Defines, 1, getTargetTriple());
693 }
694};
695} // end anonymous namespace
696
697namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000698// x86-64 Linux target
699class LinuxX86_64TargetInfo : public X86_64TargetInfo {
700public:
701 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000702 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000703 }
704 virtual void getTargetDefines(std::vector<char> &Defines) const {
705 X86_64TargetInfo::getTargetDefines(Defines);
706 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000707 }
708};
709} // end anonymous namespace
710
711namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000712// x86-64 Darwin (OS X) target
713class DarwinX86_64TargetInfo : public X86_64TargetInfo {
714public:
715 DarwinX86_64TargetInfo(const std::string& triple) :
716 X86_64TargetInfo(triple) {}
717
718 virtual void getTargetDefines(std::vector<char> &Defines) const {
719 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000720 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000721 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000722
Chris Lattnerddae7102008-12-04 22:54:33 +0000723 /// getDefaultLangOptions - Allow the target to specify default settings for
724 /// various language options. These may be overridden by command line
725 /// options.
726 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000727 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000728 }
Chris Lattner4b009652007-07-25 00:24:17 +0000729};
730} // end anonymous namespace.
731
Chris Lattner9fd73612008-04-21 18:56:49 +0000732namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000733class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000734public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000735 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
736 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000737 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
738 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000739 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000740 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000741 getARMDefines(Defines);
742 }
743 virtual void getTargetBuiltins(const Builtin::Info *&Records,
744 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000745 // FIXME: Implement.
746 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000747 NumRecords = 0;
748 }
749 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000750 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000751 }
752 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000753 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000754 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000755 virtual void getGCCRegNames(const char * const *&Names,
756 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000757 // FIXME: Implement.
758 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000759 NumNames = 0;
760 }
761 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
762 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000763 // FIXME: Implement.
764 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000765 NumAliases = 0;
766 }
767 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000768 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000769 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000770 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000771 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000772 case 'l': // r0-r7
773 case 'h': // r8-r15
774 case 'w': // VFP Floating point register single precision
775 case 'P': // VFP Floating point register double precision
776 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
777 return true;
778 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000779 return false;
780 }
781 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000782 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000783 return "";
784 }
785};
786} // end anonymous namespace.
787
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000788
789namespace {
790class DarwinARMTargetInfo : public ARMTargetInfo {
791public:
792 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
793
794 virtual void getTargetDefines(std::vector<char> &Defines) const {
795 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000796 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000797 }
798};
799} // end anonymous namespace.
800
Chris Lattner4b009652007-07-25 00:24:17 +0000801namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000802class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000803 static const TargetInfo::GCCRegAlias GCCRegAliases[];
804 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000805public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000806 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
807 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000808 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
809 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000810 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000811 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000812 // FIXME: This is missing a lot of important defines; some of the
813 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000814 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000815 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000816 Define(Defines, "__sparcv8");
817 }
818 virtual void getTargetBuiltins(const Builtin::Info *&Records,
819 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000820 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000821 }
822 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000823 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000824 }
825 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000826 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000827 }
828 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000829 unsigned &NumNames) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000830 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000831 unsigned &NumAliases) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000832 virtual bool validateAsmConstraint(char c,
833 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000834 // FIXME: Implement!
835 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000836 }
837 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000838 // FIXME: Implement!
839 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000840 }
841};
842
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000843const char * const SparcV8TargetInfo::GCCRegNames[] = {
844 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
845 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
846 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
847 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
848};
849
850void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
851 unsigned &NumNames) const {
852 Names = GCCRegNames;
853 NumNames = llvm::array_lengthof(GCCRegNames);
854}
855
856const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
857 { { "g0" }, "r0" },
858 { { "g1" }, "r1" },
859 { { "g2" }, "r2" },
860 { { "g3" }, "r3" },
861 { { "g4" }, "r4" },
862 { { "g5" }, "r5" },
863 { { "g6" }, "r6" },
864 { { "g7" }, "r7" },
865 { { "o0" }, "r8" },
866 { { "o1" }, "r9" },
867 { { "o2" }, "r10" },
868 { { "o3" }, "r11" },
869 { { "o4" }, "r12" },
870 { { "o5" }, "r13" },
871 { { "o6", "sp" }, "r14" },
872 { { "o7" }, "r15" },
873 { { "l0" }, "r16" },
874 { { "l1" }, "r17" },
875 { { "l2" }, "r18" },
876 { { "l3" }, "r19" },
877 { { "l4" }, "r20" },
878 { { "l5" }, "r21" },
879 { { "l6" }, "r22" },
880 { { "l7" }, "r23" },
881 { { "i0" }, "r24" },
882 { { "i1" }, "r25" },
883 { { "i2" }, "r26" },
884 { { "i3" }, "r27" },
885 { { "i4" }, "r28" },
886 { { "i5" }, "r29" },
887 { { "i6", "fp" }, "r30" },
888 { { "i7" }, "r31" },
889};
890
891void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
892 unsigned &NumAliases) const {
893 Aliases = GCCRegAliases;
894 NumAliases = llvm::array_lengthof(GCCRegAliases);
895}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000896} // end anonymous namespace.
897
Eli Friedmanff158dd2008-08-20 07:28:14 +0000898namespace {
899class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
900public:
901 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +0000902 SparcV8TargetInfo(triple) {
903 SizeType = UnsignedInt;
904 PtrDiffType = SignedInt;
905 }
Eli Friedmanff158dd2008-08-20 07:28:14 +0000906
907 virtual void getTargetDefines(std::vector<char> &Defines) const {
908 SparcV8TargetInfo::getTargetDefines(Defines);
909 getSolarisDefines(Defines);
910 }
911};
912} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000913
Chris Lattner85970f32008-05-08 05:58:21 +0000914namespace {
915 class PIC16TargetInfo : public TargetInfo{
916 public:
917 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptafa451432008-10-31 09:52:39 +0000918 IntWidth = 16;
919 LongWidth = LongLongWidth = 32;
920 PointerWidth = 16;
921 IntAlign = 8;
922 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000923 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +0000924 SizeType = UnsignedInt;
925 IntMaxType = SignedLong;
926 UIntMaxType = UnsignedLong;
Eli Friedman7cca0982008-11-02 02:43:55 +0000927 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000928 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000929 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000930 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
931 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000932 virtual void getTargetDefines(std::vector<char> &Defines) const {
933 Define(Defines, "__pic16");
934 }
935 virtual void getTargetBuiltins(const Builtin::Info *&Records,
936 unsigned &NumRecords) const {}
937 virtual const char *getVAListDeclaration() const { return "";}
938 virtual const char *getClobbers() const {return "";}
939 virtual const char *getTargetPrefix() const {return "";}
940 virtual void getGCCRegNames(const char * const *&Names,
941 unsigned &NumNames) const {}
942 virtual bool validateAsmConstraint(char c,
943 TargetInfo::ConstraintInfo &info) const {
944 return true;
945 }
946 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
947 unsigned &NumAliases) const {}
948 virtual bool useGlobalsForAutomaticVariables() const {return true;}
949 };
950}
951
Chris Lattner4b009652007-07-25 00:24:17 +0000952//===----------------------------------------------------------------------===//
953// Driver code
954//===----------------------------------------------------------------------===//
955
Ted Kremenekb97d7672007-12-04 17:07:35 +0000956static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000957 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
958 TT[4] == '-' && TT[1] - '3' < 6);
959}
960
Chris Lattnerfc457002008-03-05 01:18:20 +0000961/// CreateTargetInfo - Return the target info object for the specified target
962/// triple.
963TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000964 // OS detection; this isn't really anywhere near complete.
965 // Additions and corrections are welcome.
966 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000967 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000968 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000969 bool isSolaris = T.find("-solaris") != std::string::npos;
970 bool isLinux = T.find("-linux") != std::string::npos;
971 bool isWindows = T.find("-windows") != std::string::npos ||
972 T.find("-win32") != std::string::npos ||
973 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000974
Eli Friedman2b161652008-08-21 00:13:15 +0000975 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
976 if (isDarwin)
977 return new DarwinPPCTargetInfo(T);
978 return new PPC32TargetInfo(T);
979 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000980
Eli Friedman2b161652008-08-21 00:13:15 +0000981 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
982 if (isDarwin)
983 return new DarwinPPC64TargetInfo(T);
984 return new PPC64TargetInfo(T);
985 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000986
Eli Friedman2b161652008-08-21 00:13:15 +0000987 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
988 if (isDarwin)
989 return new DarwinARMTargetInfo(T);
990 return new ARMTargetInfo(T);
991 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000992
Eli Friedman2b161652008-08-21 00:13:15 +0000993 if (T.find("sparc-") == 0) {
994 if (isSolaris)
995 return new SolarisSparcV8TargetInfo(T);
996 return new SparcV8TargetInfo(T);
997 }
998
999 if (T.find("x86_64-") == 0) {
1000 if (isDarwin)
1001 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001002 if (isLinux)
1003 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001004 if (isFreeBSD)
1005 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001006 return new X86_64TargetInfo(T);
1007 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001008
Chris Lattner85970f32008-05-08 05:58:21 +00001009 if (T.find("pic16-") == 0)
1010 return new PIC16TargetInfo(T);
1011
Eli Friedman2b161652008-08-21 00:13:15 +00001012 if (IsX86(T)) {
1013 if (isDarwin)
1014 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001015 if (isLinux)
1016 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001017 if (isDragonFly)
1018 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001019 if (isFreeBSD)
1020 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001021 if (isWindows)
1022 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001023 return new X86_32TargetInfo(T);
1024 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001025
Chris Lattnerfc457002008-03-05 01:18:20 +00001026 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001027}
Ted Kremenekd507bab2008-03-04 17:47:18 +00001028