blob: c3e1a68d20f9e9470c520c9a1db02a485f6b6033 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenekbbced582007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/AST/Builtins.h"
Anders Carlsson564f1de2007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000017#include "clang/Basic/TargetInfo.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Anders Carlsson3346ae62007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Eli Friedman25531262008-05-20 14:27:34 +000020#include "llvm/ADT/APFloat.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000021using namespace clang;
22
Reid Spencer5f016e22007-07-11 17:01:13 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattnerd15fa822007-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 Lattnerd29b6302008-10-05 21:50:58 +000037//===----------------------------------------------------------------------===//
38// Defines specific to certain operating systems.
39//===----------------------------------------------------------------------===//
40
Eli Friedman01b86682008-08-20 07:28:14 +000041static void getSolarisDefines(std::vector<char> &Defs) {
42 Define(Defs, "__SUN__");
43 Define(Defs, "__SOLARIS__");
44}
Reid Spencer5f016e22007-07-11 17:01:13 +000045
Nate Begemanca013422009-01-18 01:08:03 +000046static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit,
47 const char *Triple) {
Chris Lattnerfd0269d2008-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 Lattnerd29b6302008-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 Lattnerae0ee032008-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 Lattner8b30c412008-09-30 01:00:25 +0000120static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +0000121 Define(Defs, "__APPLE__");
122 Define(Defs, "__MACH__");
Chris Lattner8b30c412008-09-30 01:00:25 +0000123
124 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattnerae0ee032008-12-04 23:20:07 +0000125 unsigned Maj, Min;
126 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattner079f2c462008-09-30 20:30:12 +0000127 char DarwinStr[] = "1000";
Chris Lattnerae0ee032008-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 Lattner8b30c412008-09-30 01:00:25 +0000131 }
Chris Lattnerae0ee032008-12-04 23:20:07 +0000132
133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
134 DarwinStr[3] = Min+'0';
Chris Lattner079f2c462008-09-30 20:30:12 +0000135 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattner8b30c412008-09-30 01:00:25 +0000136 }
Eli Friedman618234a2008-08-20 02:34:37 +0000137}
Reid Spencer5f016e22007-07-11 17:01:13 +0000138
Chris Lattnerae0ee032008-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 Lattnerd29b6302008-10-05 21:50:58 +0000154//===----------------------------------------------------------------------===//
155// Defines specific to certain architectures.
156//===----------------------------------------------------------------------===//
Eli Friedman0d4047b2008-08-21 00:24:02 +0000157
Reid Spencer5f016e22007-07-11 17:01:13 +0000158/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
159/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000160static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000161 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000162 Define(Defs, "__ppc__");
163 Define(Defs, "_ARCH_PPC");
164 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000165 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000166 Define(Defs, "_ARCH_PPC64");
167 Define(Defs, "_LP64");
168 Define(Defs, "__LP64__");
169 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000170 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000171 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000172 }
173
174 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000175 Define(Defs, "_BIG_ENDIAN");
176 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000177
Reid Spencer5f016e22007-07-11 17:01:13 +0000178 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000179 Define(Defs, "__NATURAL_ALIGNMENT__");
180 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000181
Chris Lattner12f09262008-10-05 21:49:27 +0000182 // FIXME: Should be controlled by command line option.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000183 Define(Defs, "__LONG_DOUBLE_128__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000184}
185
186/// getX86Defines - Return a set of the X86-specific #defines that are
187/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000188static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000189 // Target identification.
190 if (is64Bit) {
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000197 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000198 Define(Defs, "__i386__");
199 Define(Defs, "__i386");
200 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000201 }
202
203 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000204 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000205
Reid Spencer5f016e22007-07-11 17:01:13 +0000206 // Subtarget options.
Chris Lattnerd15fa822007-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__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000216}
217
Chris Lattnerd0c33d32008-04-21 20:19:54 +0000218/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner393ff042008-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 Lattner393ff042008-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 Lattner393ff042008-04-21 18:56:49 +0000232}
233
Eli Friedmane4277982008-08-20 23:11:40 +0000234//===----------------------------------------------------------------------===//
235// Specific target implementations.
236//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000237
Eli Friedmane4277982008-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 {
Reid Spencer5f016e22007-07-11 17:01:13 +0000251 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000252 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000253 }
Eli Friedmane4277982008-08-20 23:11:40 +0000254 virtual const char *getVAListDeclaration() const {
Chris Lattnerd5998502008-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 Friedmane4277982008-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 Lattnerd5998502008-10-27 01:11:29 +0000263 "} __builtin_va_list[1];";*/
Anders Carlsson3346ae62007-11-24 23:38:12 +0000264 }
Eli Friedmane4277982008-08-20 23:11:40 +0000265 virtual const char *getTargetPrefix() const {
266 return "ppc";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000267 }
Eli Friedmane4277982008-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 Carlssond04c6e22007-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 Friedmane4277982008-08-20 23:11:40 +0000284 virtual const char *getClobbers() const {
285 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000286 }
Eli Friedmane4277982008-08-20 23:11:40 +0000287};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000288
Eli Friedmane4277982008-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 Lattner393ff042008-04-21 18:56:49 +0000293
Eli Friedmane4277982008-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};
Reid Spencer5f016e22007-07-11 17:01:13 +0000314
Eli Friedmane4277982008-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}
Reid Spencer5f016e22007-07-11 17:01:13 +0000320
Eli Friedmane4277982008-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.
Reid Spencer5f016e22007-07-11 17:01:13 +0000364
365namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000366class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000367public:
Eli Friedmaned855cb2008-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 Lattnerd15fa822007-10-06 06:57:34 +0000372 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000373 getPowerPCDefines(Defines, false);
374 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000375};
376} // end anonymous namespace.
377
378namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000379class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000380public:
Eli Friedmane4277982008-08-20 23:11:40 +0000381 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000382 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmaned855cb2008-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 Lattnerf291b102008-05-09 06:17:04 +0000385 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000386 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000387 getPowerPCDefines(Defines, true);
388 }
Eli Friedmane4277982008-08-20 23:11:40 +0000389};
390} // end anonymous namespace.
391
Chris Lattnerae0ee032008-12-04 23:20:07 +0000392
Eli Friedmane4277982008-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 Lattner8b30c412008-09-30 01:00:25 +0000399 getDarwinDefines(Defines, getTargetTriple());
Reid Spencer5f016e22007-07-11 17:01:13 +0000400 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000401
Chris Lattner8fc4dfb2008-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 Lattnerae0ee032008-12-04 23:20:07 +0000406 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000407 }
Eli Friedmane4277982008-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 Lattner8b30c412008-09-30 01:00:25 +0000417 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000418 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000419
Chris Lattner8fc4dfb2008-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 Lattnerae0ee032008-12-04 23:20:07 +0000424 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000425 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000426};
427} // end anonymous namespace.
428
429namespace {
Eli Friedman618234a2008-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 Friedman61538a72008-05-20 14:21:01 +0000435
Eli Friedman618234a2008-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;
Reid Spencer5f016e22007-07-11 17:01:13 +0000463 }
464 virtual void getTargetBuiltins(const Builtin::Info *&Records,
465 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000466 Records = BuiltinInfo;
467 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000468 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000469 virtual const char *getTargetPrefix() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000470 return "x86";
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000471 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000472 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +0000473 unsigned &NumNames) const {
474 Names = GCCRegNames;
475 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +0000476 }
477 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
478 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000479 Aliases = GCCRegAliases;
480 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000481 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000482 virtual bool validateAsmConstraint(char c,
Eli Friedman618234a2008-08-20 02:34:37 +0000483 TargetInfo::ConstraintInfo &info) const;
484 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000485 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000486 return "~{dirflag},~{fpsr},~{flags}";
487 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000488};
Eli Friedman618234a2008-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 Carlssonfce09342008-10-06 00:41:45 +0000505 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +0000506 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +0000507 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlsson79bc64c2009-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 Friedman618234a2008-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 Friedman618234a2008-08-20 02:34:37 +0000536} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +0000537
538namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000539// X86-32 generic target
540class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000541public:
Eli Friedman618234a2008-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 Friedmaned855cb2008-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 Friedman618234a2008-08-20 02:34:37 +0000549 }
550 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000551 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-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 Friedmaned855cb2008-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 Friedman618234a2008-08-20 02:34:37 +0000569 }
570 virtual void getTargetDefines(std::vector<char> &Defines) const {
571 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000572 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman618234a2008-08-20 02:34:37 +0000573 }
Chris Lattner8fc4dfb2008-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 Lattnerae0ee032008-12-04 23:20:07 +0000578 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000579 }
Eli Friedman618234a2008-08-20 02:34:37 +0000580};
581} // end anonymous namespace
582
583namespace {
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000584// x86-32 FreeBSD target
585class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
586public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000587 FreeBSDX86_32TargetInfo(const std::string& triple) :
588 X86_32TargetInfo(triple) {
589 SizeType = UnsignedInt;
590 PtrDiffType = SignedInt;
Chris Lattnerfd0269d2008-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 Lattnereac7aee2008-08-23 18:23:14 +0000600// x86-32 DragonFly target
601class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
602public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000603 DragonFlyX86_32TargetInfo(const std::string& triple) :
604 X86_32TargetInfo(triple) {
605 SizeType = UnsignedInt;
606 PtrDiffType = SignedInt;
Chris Lattnereac7aee2008-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 Friedman0d4047b2008-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 Lattner9b533162008-10-05 19:44:25 +0000620 UserLabelPrefix = "";
Eli Friedmanf509d732008-11-02 02:43:55 +0000621 SizeType = UnsignedInt;
622 PtrDiffType = SignedInt;
Eli Friedman0d4047b2008-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 Friedman29a30502008-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 Friedmanf509d732008-11-02 02:43:55 +0000640 SizeType = UnsignedInt;
641 PtrDiffType = SignedInt;
Eli Friedman29a30502008-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 Friedman29a30502008-08-21 01:40:19 +0000653 Define(Defines, "_X86_");
654 Define(Defines, "__MSVCRT__");
655 }
656};
657} // end anonymous namespace
658
659namespace {
Eli Friedman618234a2008-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 Lattnerf291b102008-05-09 06:17:04 +0000664 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner778601f2009-01-28 06:58:19 +0000665 DoubleAlign = LongLongAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +0000666 LongDoubleWidth = 128;
667 LongDoubleAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000668 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
669 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
670 "a0:0:64-f80:128:128";
Reid Spencer5f016e22007-07-11 17:01:13 +0000671 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000672 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000673 return "typedef struct __va_list_tag {"
674 " unsigned gp_offset;"
675 " unsigned fp_offset;"
676 " void* overflow_arg_area;"
677 " void* reg_save_area;"
678 "} __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +0000679 }
Eli Friedman618234a2008-08-20 02:34:37 +0000680 virtual void getTargetDefines(std::vector<char> &Defines) const {
681 getX86Defines(Defines, true);
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000682 }
Eli Friedman618234a2008-08-20 02:34:37 +0000683};
684} // end anonymous namespace
685
686namespace {
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000687// x86-64 FreeBSD target
688class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
689public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000690 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000691 virtual void getTargetDefines(std::vector<char> &Defines) const {
692 X86_64TargetInfo::getTargetDefines(Defines);
693 getFreeBSDDefines(Defines, 1, getTargetTriple());
694 }
695};
696} // end anonymous namespace
697
698namespace {
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000699// x86-64 Linux target
700class LinuxX86_64TargetInfo : public X86_64TargetInfo {
701public:
702 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner9b533162008-10-05 19:44:25 +0000703 UserLabelPrefix = "";
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000704 }
705 virtual void getTargetDefines(std::vector<char> &Defines) const {
706 X86_64TargetInfo::getTargetDefines(Defines);
707 getLinuxDefines(Defines);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000708 }
709};
710} // end anonymous namespace
711
712namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000713// x86-64 Darwin (OS X) target
714class DarwinX86_64TargetInfo : public X86_64TargetInfo {
715public:
716 DarwinX86_64TargetInfo(const std::string& triple) :
717 X86_64TargetInfo(triple) {}
718
719 virtual void getTargetDefines(std::vector<char> &Defines) const {
720 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000721 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000722 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000723
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000724 /// getDefaultLangOptions - Allow the target to specify default settings for
725 /// various language options. These may be overridden by command line
726 /// options.
727 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000728 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000729 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000730};
731} // end anonymous namespace.
732
Chris Lattner393ff042008-04-21 18:56:49 +0000733namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +0000734class ARMTargetInfo : public TargetInfo {
Chris Lattner393ff042008-04-21 18:56:49 +0000735public:
Eli Friedmana9f54962008-08-20 07:44:10 +0000736 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
737 // FIXME: Are the defaults correct for ARM?
Eli Friedmaned855cb2008-08-21 00:13:15 +0000738 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
739 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman61538a72008-05-20 14:21:01 +0000740 }
Chris Lattner393ff042008-04-21 18:56:49 +0000741 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner393ff042008-04-21 18:56:49 +0000742 getARMDefines(Defines);
743 }
744 virtual void getTargetBuiltins(const Builtin::Info *&Records,
745 unsigned &NumRecords) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000746 // FIXME: Implement.
747 Records = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000748 NumRecords = 0;
749 }
750 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000751 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +0000752 }
753 virtual const char *getTargetPrefix() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000754 return "arm";
Chris Lattner393ff042008-04-21 18:56:49 +0000755 }
Chris Lattner393ff042008-04-21 18:56:49 +0000756 virtual void getGCCRegNames(const char * const *&Names,
757 unsigned &NumNames) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000758 // FIXME: Implement.
759 Names = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000760 NumNames = 0;
761 }
762 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
763 unsigned &NumAliases) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000764 // FIXME: Implement.
765 Aliases = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000766 NumAliases = 0;
767 }
768 virtual bool validateAsmConstraint(char c,
Nate Begemanad487f42008-04-22 05:03:19 +0000769 TargetInfo::ConstraintInfo &info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000770 // FIXME: Check if this is complete
Nate Begemanad487f42008-04-22 05:03:19 +0000771 switch (c) {
Eli Friedmana9f54962008-08-20 07:44:10 +0000772 default:
Nate Begemanad487f42008-04-22 05:03:19 +0000773 case 'l': // r0-r7
774 case 'h': // r8-r15
775 case 'w': // VFP Floating point register single precision
776 case 'P': // VFP Floating point register double precision
777 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
778 return true;
779 }
Chris Lattner393ff042008-04-21 18:56:49 +0000780 return false;
781 }
782 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000783 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +0000784 return "";
785 }
786};
787} // end anonymous namespace.
788
Eli Friedmana9f54962008-08-20 07:44:10 +0000789
790namespace {
791class DarwinARMTargetInfo : public ARMTargetInfo {
792public:
793 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
794
795 virtual void getTargetDefines(std::vector<char> &Defines) const {
796 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattner8b30c412008-09-30 01:00:25 +0000797 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmana9f54962008-08-20 07:44:10 +0000798 }
799};
800} // end anonymous namespace.
801
Reid Spencer5f016e22007-07-11 17:01:13 +0000802namespace {
Eli Friedman01b86682008-08-20 07:28:14 +0000803class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +0000804 static const TargetInfo::GCCRegAlias GCCRegAliases[];
805 static const char * const GCCRegNames[];
Gabor Greif26658672008-02-21 16:29:08 +0000806public:
Eli Friedman01b86682008-08-20 07:28:14 +0000807 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
808 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +0000809 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
810 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedman01b86682008-08-20 07:28:14 +0000811 }
Gabor Greif26658672008-02-21 16:29:08 +0000812 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000813 // FIXME: This is missing a lot of important defines; some of the
814 // missing stuff is likely to break system headers.
Gabor Greif26658672008-02-21 16:29:08 +0000815 Define(Defines, "__sparc");
Eli Friedmanbf0c9bd2008-05-25 05:26:09 +0000816 Define(Defines, "__sparc__");
Gabor Greif26658672008-02-21 16:29:08 +0000817 Define(Defines, "__sparcv8");
818 }
819 virtual void getTargetBuiltins(const Builtin::Info *&Records,
820 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000821 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +0000822 }
823 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000824 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +0000825 }
826 virtual const char *getTargetPrefix() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000827 return "sparc";
Gabor Greif26658672008-02-21 16:29:08 +0000828 }
829 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +0000830 unsigned &NumNames) const;
Gabor Greif26658672008-02-21 16:29:08 +0000831 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +0000832 unsigned &NumAliases) const;
Gabor Greif26658672008-02-21 16:29:08 +0000833 virtual bool validateAsmConstraint(char c,
834 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +0000835 // FIXME: Implement!
836 return false;
Gabor Greif26658672008-02-21 16:29:08 +0000837 }
838 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000839 // FIXME: Implement!
840 return "";
Gabor Greif26658672008-02-21 16:29:08 +0000841 }
842};
843
Chris Lattnere957f532009-01-27 01:58:38 +0000844const char * const SparcV8TargetInfo::GCCRegNames[] = {
845 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
846 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
847 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
848 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
849};
850
851void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
852 unsigned &NumNames) const {
853 Names = GCCRegNames;
854 NumNames = llvm::array_lengthof(GCCRegNames);
855}
856
857const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
858 { { "g0" }, "r0" },
859 { { "g1" }, "r1" },
860 { { "g2" }, "r2" },
861 { { "g3" }, "r3" },
862 { { "g4" }, "r4" },
863 { { "g5" }, "r5" },
864 { { "g6" }, "r6" },
865 { { "g7" }, "r7" },
866 { { "o0" }, "r8" },
867 { { "o1" }, "r9" },
868 { { "o2" }, "r10" },
869 { { "o3" }, "r11" },
870 { { "o4" }, "r12" },
871 { { "o5" }, "r13" },
872 { { "o6", "sp" }, "r14" },
873 { { "o7" }, "r15" },
874 { { "l0" }, "r16" },
875 { { "l1" }, "r17" },
876 { { "l2" }, "r18" },
877 { { "l3" }, "r19" },
878 { { "l4" }, "r20" },
879 { { "l5" }, "r21" },
880 { { "l6" }, "r22" },
881 { { "l7" }, "r23" },
882 { { "i0" }, "r24" },
883 { { "i1" }, "r25" },
884 { { "i2" }, "r26" },
885 { { "i3" }, "r27" },
886 { { "i4" }, "r28" },
887 { { "i5" }, "r29" },
888 { { "i6", "fp" }, "r30" },
889 { { "i7" }, "r31" },
890};
891
892void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
893 unsigned &NumAliases) const {
894 Aliases = GCCRegAliases;
895 NumAliases = llvm::array_lengthof(GCCRegAliases);
896}
Gabor Greif26658672008-02-21 16:29:08 +0000897} // end anonymous namespace.
898
Eli Friedman01b86682008-08-20 07:28:14 +0000899namespace {
900class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
901public:
902 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmanf509d732008-11-02 02:43:55 +0000903 SparcV8TargetInfo(triple) {
904 SizeType = UnsignedInt;
905 PtrDiffType = SignedInt;
906 }
Eli Friedman01b86682008-08-20 07:28:14 +0000907
908 virtual void getTargetDefines(std::vector<char> &Defines) const {
909 SparcV8TargetInfo::getTargetDefines(Defines);
910 getSolarisDefines(Defines);
911 }
912};
913} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000914
Chris Lattner2621fd12008-05-08 05:58:21 +0000915namespace {
916 class PIC16TargetInfo : public TargetInfo{
917 public:
918 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +0000919 IntWidth = 16;
920 LongWidth = LongLongWidth = 32;
921 PointerWidth = 16;
922 IntAlign = 8;
923 LongAlign = LongLongAlign = 8;
Eli Friedman61538a72008-05-20 14:21:01 +0000924 PointerAlign = 8;
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +0000925 SizeType = UnsignedInt;
926 IntMaxType = SignedLong;
927 UIntMaxType = UnsignedLong;
Eli Friedmanf509d732008-11-02 02:43:55 +0000928 PtrDiffType = SignedInt;
Sanjiv Gupta364af812008-08-18 10:05:22 +0000929 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner2621fd12008-05-08 05:58:21 +0000930 }
Chris Lattner927686f2008-05-09 06:08:39 +0000931 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
932 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner2621fd12008-05-08 05:58:21 +0000933 virtual void getTargetDefines(std::vector<char> &Defines) const {
934 Define(Defines, "__pic16");
935 }
936 virtual void getTargetBuiltins(const Builtin::Info *&Records,
937 unsigned &NumRecords) const {}
938 virtual const char *getVAListDeclaration() const { return "";}
939 virtual const char *getClobbers() const {return "";}
940 virtual const char *getTargetPrefix() const {return "";}
941 virtual void getGCCRegNames(const char * const *&Names,
942 unsigned &NumNames) const {}
943 virtual bool validateAsmConstraint(char c,
944 TargetInfo::ConstraintInfo &info) const {
945 return true;
946 }
947 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
948 unsigned &NumAliases) const {}
949 virtual bool useGlobalsForAutomaticVariables() const {return true;}
950 };
951}
952
Reid Spencer5f016e22007-07-11 17:01:13 +0000953//===----------------------------------------------------------------------===//
954// Driver code
955//===----------------------------------------------------------------------===//
956
Ted Kremenek8448d382007-12-04 17:07:35 +0000957static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +0000958 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
959 TT[4] == '-' && TT[1] - '3' < 6);
960}
961
Chris Lattner42e67372008-03-05 01:18:20 +0000962/// CreateTargetInfo - Return the target info object for the specified target
963/// triple.
964TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000965 // OS detection; this isn't really anywhere near complete.
966 // Additions and corrections are welcome.
967 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnereac7aee2008-08-23 18:23:14 +0000968 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000969 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000970 bool isSolaris = T.find("-solaris") != std::string::npos;
971 bool isLinux = T.find("-linux") != std::string::npos;
972 bool isWindows = T.find("-windows") != std::string::npos ||
973 T.find("-win32") != std::string::npos ||
974 T.find("-mingw") != std::string::npos;
Eli Friedman61538a72008-05-20 14:21:01 +0000975
Eli Friedmaned855cb2008-08-21 00:13:15 +0000976 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
977 if (isDarwin)
978 return new DarwinPPCTargetInfo(T);
979 return new PPC32TargetInfo(T);
980 }
Eli Friedman61538a72008-05-20 14:21:01 +0000981
Eli Friedmaned855cb2008-08-21 00:13:15 +0000982 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
983 if (isDarwin)
984 return new DarwinPPC64TargetInfo(T);
985 return new PPC64TargetInfo(T);
986 }
Chris Lattner393ff042008-04-21 18:56:49 +0000987
Eli Friedmaned855cb2008-08-21 00:13:15 +0000988 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
989 if (isDarwin)
990 return new DarwinARMTargetInfo(T);
991 return new ARMTargetInfo(T);
992 }
Eli Friedman61538a72008-05-20 14:21:01 +0000993
Eli Friedmaned855cb2008-08-21 00:13:15 +0000994 if (T.find("sparc-") == 0) {
995 if (isSolaris)
996 return new SolarisSparcV8TargetInfo(T);
997 return new SparcV8TargetInfo(T);
998 }
999
1000 if (T.find("x86_64-") == 0) {
1001 if (isDarwin)
1002 return new DarwinX86_64TargetInfo(T);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +00001003 if (isLinux)
1004 return new LinuxX86_64TargetInfo(T);
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001005 if (isFreeBSD)
1006 return new FreeBSDX86_64TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001007 return new X86_64TargetInfo(T);
1008 }
Eli Friedman61538a72008-05-20 14:21:01 +00001009
Chris Lattner2621fd12008-05-08 05:58:21 +00001010 if (T.find("pic16-") == 0)
1011 return new PIC16TargetInfo(T);
1012
Eli Friedmaned855cb2008-08-21 00:13:15 +00001013 if (IsX86(T)) {
1014 if (isDarwin)
1015 return new DarwinI386TargetInfo(T);
Eli Friedman0d4047b2008-08-21 00:24:02 +00001016 if (isLinux)
1017 return new LinuxX86_32TargetInfo(T);
Chris Lattnereac7aee2008-08-23 18:23:14 +00001018 if (isDragonFly)
1019 return new DragonFlyX86_32TargetInfo(T);
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001020 if (isFreeBSD)
1021 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman29a30502008-08-21 01:40:19 +00001022 if (isWindows)
1023 return new WindowsX86_32TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001024 return new X86_32TargetInfo(T);
1025 }
Eli Friedman61538a72008-05-20 14:21:01 +00001026
Chris Lattner42e67372008-03-05 01:18:20 +00001027 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +00001028}
Ted Kremenekfb79f7c2008-03-04 17:47:18 +00001029