blob: 80fbaaeb728822e300396b7fb89a0594eaa523d4 [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 Lattner8405e092009-02-05 07:19:24 +0000123 Define(Defs, "OBJC_NEW_PROPERTIES");
124
125 // FIXME: OBJC_ZEROCOST_EXCEPTIONS when using zero cost eh.
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000126
127 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000128 unsigned Maj, Min;
129 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000130 char DarwinStr[] = "1000";
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000131 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
132 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
133 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000134 }
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000135
136 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
137 DarwinStr[3] = Min+'0';
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000138 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000139 }
Eli Friedman872996c2008-08-20 02:34:37 +0000140}
Chris Lattner4b009652007-07-25 00:24:17 +0000141
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000142/// GetDarwinLanguageOptions - Set the default language options for darwin.
143static void GetDarwinLanguageOptions(LangOptions &Opts,
144 const char *Triple) {
145 Opts.NeXTRuntime = true;
146
147 unsigned Maj, Min;
148 if (!getDarwinNumber(Triple, Maj, Min))
149 return;
150
151 // Blocks default to on for 10.6 (darwin10) and beyond.
152 if (Maj > 9)
153 Opts.Blocks = 1;
154}
155
156
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000157//===----------------------------------------------------------------------===//
158// Defines specific to certain architectures.
159//===----------------------------------------------------------------------===//
Eli Friedman5fb0a022008-08-21 00:24:02 +0000160
Chris Lattner4b009652007-07-25 00:24:17 +0000161/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
162/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000163static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000164 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000165 Define(Defs, "__ppc__");
166 Define(Defs, "_ARCH_PPC");
167 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000168 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000169 Define(Defs, "_ARCH_PPC64");
170 Define(Defs, "_LP64");
171 Define(Defs, "__LP64__");
172 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000173 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000174 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000175 }
176
177 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000178 Define(Defs, "_BIG_ENDIAN");
179 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000180
Chris Lattner4b009652007-07-25 00:24:17 +0000181 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000182 Define(Defs, "__NATURAL_ALIGNMENT__");
183 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000184
Chris Lattner3da35682008-10-05 21:49:27 +0000185 // FIXME: Should be controlled by command line option.
Chris Lattner0db667a2007-10-06 06:57:34 +0000186 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000187}
188
189/// getX86Defines - Return a set of the X86-specific #defines that are
190/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000191static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000192 // Target identification.
193 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000194 Define(Defs, "_LP64");
195 Define(Defs, "__LP64__");
196 Define(Defs, "__amd64__");
197 Define(Defs, "__amd64");
198 Define(Defs, "__x86_64");
199 Define(Defs, "__x86_64__");
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000200 Define(Defs, "__SSE3__");
Chris Lattner4b009652007-07-25 00:24:17 +0000201 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000202 Define(Defs, "__i386__");
203 Define(Defs, "__i386");
204 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000205 }
206
207 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000208 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000209
Chris Lattner4b009652007-07-25 00:24:17 +0000210 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000211 Define(Defs, "__nocona");
212 Define(Defs, "__nocona__");
213 Define(Defs, "__tune_nocona__");
214 Define(Defs, "__SSE2_MATH__");
215 Define(Defs, "__SSE2__");
216 Define(Defs, "__SSE_MATH__");
217 Define(Defs, "__SSE__");
218 Define(Defs, "__MMX__");
219 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000220}
221
Chris Lattnerb6444052008-04-21 20:19:54 +0000222/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000223/// not tied to a specific subtarget.
224static void getARMDefines(std::vector<char> &Defs) {
225 // Target identification.
226 Define(Defs, "__arm");
227 Define(Defs, "__arm__");
228
229 // Target properties.
230 Define(Defs, "__LITTLE_ENDIAN__");
231
Chris Lattner9fd73612008-04-21 18:56:49 +0000232 // Subtarget options. [hard coded to v6 for now]
233 Define(Defs, "__ARM_ARCH_6K__");
234 Define(Defs, "__ARMEL__");
235 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner9fd73612008-04-21 18:56:49 +0000236}
237
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000238//===----------------------------------------------------------------------===//
239// Specific target implementations.
240//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000241
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000242namespace {
243// PPC abstract base class
244class PPCTargetInfo : public TargetInfo {
245 static const Builtin::Info BuiltinInfo[];
246 static const char * const GCCRegNames[];
247 static const TargetInfo::GCCRegAlias GCCRegAliases[];
248
249public:
250 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
251 CharIsSigned = false;
252 }
253 virtual void getTargetBuiltins(const Builtin::Info *&Records,
254 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000255 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000256 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000257 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000258 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-10-27 01:11:29 +0000259 return "typedef char* __builtin_va_list;";
260 // This is the right definition for ABI/V4: System V.4/eabi.
261 /*return "typedef struct __va_list_tag {"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000262 " unsigned char gpr;"
263 " unsigned char fpr;"
264 " unsigned short reserved;"
265 " void* overflow_arg_area;"
266 " void* reg_save_area;"
Chris Lattnera07708f2008-10-27 01:11:29 +0000267 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000268 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000269 virtual const char *getTargetPrefix() const {
270 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000271 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000272 virtual void getGCCRegNames(const char * const *&Names,
273 unsigned &NumNames) const;
274 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
275 unsigned &NumAliases) const;
276 virtual bool validateAsmConstraint(char c,
277 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000278 switch (c) {
279 default: return false;
280 case 'O': // Zero
281 return true;
282 case 'b': // Base register
283 case 'f': // Floating point register
284 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
285 return true;
286 }
287 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000288 virtual const char *getClobbers() const {
289 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000290 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000291};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000292
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000293const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
294#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
295#include "clang/AST/PPCBuiltins.def"
296};
Chris Lattner9fd73612008-04-21 18:56:49 +0000297
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000298const char * const PPCTargetInfo::GCCRegNames[] = {
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 "0", "1", "2", "3", "4", "5", "6", "7",
304 "8", "9", "10", "11", "12", "13", "14", "15",
305 "16", "17", "18", "19", "20", "21", "22", "23",
306 "24", "25", "26", "27", "28", "29", "30", "31",
307 "mq", "lr", "ctr", "ap",
308 "0", "1", "2", "3", "4", "5", "6", "7",
309 "xer",
310 "0", "1", "2", "3", "4", "5", "6", "7",
311 "8", "9", "10", "11", "12", "13", "14", "15",
312 "16", "17", "18", "19", "20", "21", "22", "23",
313 "24", "25", "26", "27", "28", "29", "30", "31",
314 "vrsave", "vscr",
315 "spe_acc", "spefscr",
316 "sfp"
317};
Chris Lattner4b009652007-07-25 00:24:17 +0000318
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000319void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
320 unsigned &NumNames) const {
321 Names = GCCRegNames;
322 NumNames = llvm::array_lengthof(GCCRegNames);
323}
Chris Lattner4b009652007-07-25 00:24:17 +0000324
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000325const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
326 // While some of these aliases do map to different registers
327 // they still share the same register name.
328 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
329 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
330 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
331 { { "cr3", "fr3", "r3", "v3"}, "3" },
332 { { "cr4", "fr4", "r4", "v4"}, "4" },
333 { { "cr5", "fr5", "r5", "v5"}, "5" },
334 { { "cr6", "fr6", "r6", "v6"}, "6" },
335 { { "cr7", "fr7", "r7", "v7"}, "7" },
336 { { "fr8", "r8", "v8"}, "8" },
337 { { "fr9", "r9", "v9"}, "9" },
338 { { "fr10", "r10", "v10"}, "10" },
339 { { "fr11", "r11", "v11"}, "11" },
340 { { "fr12", "r12", "v12"}, "12" },
341 { { "fr13", "r13", "v13"}, "13" },
342 { { "fr14", "r14", "v14"}, "14" },
343 { { "fr15", "r15", "v15"}, "15" },
344 { { "fr16", "r16", "v16"}, "16" },
345 { { "fr17", "r17", "v17"}, "17" },
346 { { "fr18", "r18", "v18"}, "18" },
347 { { "fr19", "r19", "v19"}, "19" },
348 { { "fr20", "r20", "v20"}, "20" },
349 { { "fr21", "r21", "v21"}, "21" },
350 { { "fr22", "r22", "v22"}, "22" },
351 { { "fr23", "r23", "v23"}, "23" },
352 { { "fr24", "r24", "v24"}, "24" },
353 { { "fr25", "r25", "v25"}, "25" },
354 { { "fr26", "r26", "v26"}, "26" },
355 { { "fr27", "r27", "v27"}, "27" },
356 { { "fr28", "r28", "v28"}, "28" },
357 { { "fr29", "r29", "v29"}, "29" },
358 { { "fr30", "r30", "v30"}, "30" },
359 { { "fr31", "r31", "v31"}, "31" },
360};
361
362void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
363 unsigned &NumAliases) const {
364 Aliases = GCCRegAliases;
365 NumAliases = llvm::array_lengthof(GCCRegAliases);
366}
367} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000368
369namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000370class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000371public:
Eli Friedman2b161652008-08-21 00:13:15 +0000372 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
373 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
374 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
375 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000376 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000377 getPowerPCDefines(Defines, false);
378 }
Chris Lattner4b009652007-07-25 00:24:17 +0000379};
380} // end anonymous namespace.
381
382namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000383class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000384public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000385 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000386 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000387 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
388 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000389 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000390 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000391 getPowerPCDefines(Defines, true);
392 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000393};
394} // end anonymous namespace.
395
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000396
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000397namespace {
398class DarwinPPCTargetInfo : public PPC32TargetInfo {
399public:
400 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
401 virtual void getTargetDefines(std::vector<char> &Defines) const {
402 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000403 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000404 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000405
Chris Lattnerddae7102008-12-04 22:54:33 +0000406 /// getDefaultLangOptions - Allow the target to specify default settings for
407 /// various language options. These may be overridden by command line
408 /// options.
409 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000410 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000411 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000412};
413} // end anonymous namespace.
414
415namespace {
416class DarwinPPC64TargetInfo : public PPC64TargetInfo {
417public:
418 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
419 virtual void getTargetDefines(std::vector<char> &Defines) const {
420 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000421 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000422 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000423
Chris Lattnerddae7102008-12-04 22:54:33 +0000424 /// getDefaultLangOptions - Allow the target to specify default settings for
425 /// various language options. These may be overridden by command line
426 /// options.
427 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000428 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000429 }
Chris Lattner4b009652007-07-25 00:24:17 +0000430};
431} // end anonymous namespace.
432
433namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000434// Namespace for x86 abstract base class
435const Builtin::Info BuiltinInfo[] = {
436#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
437#include "clang/AST/X86Builtins.def"
438};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000439
Eli Friedman872996c2008-08-20 02:34:37 +0000440const char *GCCRegNames[] = {
441 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
442 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
443 "argp", "flags", "fspr", "dirflag", "frame",
444 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
445 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
446 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
447 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
448};
449
450const TargetInfo::GCCRegAlias GCCRegAliases[] = {
451 { { "al", "ah", "eax", "rax" }, "ax" },
452 { { "bl", "bh", "ebx", "rbx" }, "bx" },
453 { { "cl", "ch", "ecx", "rcx" }, "cx" },
454 { { "dl", "dh", "edx", "rdx" }, "dx" },
455 { { "esi", "rsi" }, "si" },
456 { { "edi", "rdi" }, "di" },
457 { { "esp", "rsp" }, "sp" },
458 { { "ebp", "rbp" }, "bp" },
459};
460
461// X86 target abstract base class; x86-32 and x86-64 are very close, so
462// most of the implementation can be shared.
463class X86TargetInfo : public TargetInfo {
464public:
465 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
466 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000467 }
468 virtual void getTargetBuiltins(const Builtin::Info *&Records,
469 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000470 Records = BuiltinInfo;
471 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000472 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000473 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000474 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000475 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000476 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000477 unsigned &NumNames) const {
478 Names = GCCRegNames;
479 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000480 }
481 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
482 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000483 Aliases = GCCRegAliases;
484 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000485 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000486 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000487 TargetInfo::ConstraintInfo &info) const;
488 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000489 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000490 return "~{dirflag},~{fpsr},~{flags}";
491 }
Chris Lattner4b009652007-07-25 00:24:17 +0000492};
Eli Friedman872996c2008-08-20 02:34:37 +0000493
494bool
495X86TargetInfo::validateAsmConstraint(char c,
496 TargetInfo::ConstraintInfo &info) const {
497 switch (c) {
498 default: return false;
499 case 'a': // eax.
500 case 'b': // ebx.
501 case 'c': // ecx.
502 case 'd': // edx.
503 case 'S': // esi.
504 case 'D': // edi.
505 case 'A': // edx:eax.
506 case 't': // top of floating point stack.
507 case 'u': // second from top of floating point stack.
508 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000509 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000510 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000511 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssonff235da2009-01-24 18:03:09 +0000512 case 'e': // 32-bit signed integer constant for use with zero-extending
513 // x86_64 instructions.
514 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
515 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000516 case 'N': // unsigned 8-bit integer constant for use with in and out
517 // instructions.
518 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
519 return true;
520 }
521}
522
523std::string
524X86TargetInfo::convertConstraint(const char Constraint) const {
525 switch (Constraint) {
526 case 'a': return std::string("{ax}");
527 case 'b': return std::string("{bx}");
528 case 'c': return std::string("{cx}");
529 case 'd': return std::string("{dx}");
530 case 'S': return std::string("{si}");
531 case 'D': return std::string("{di}");
532 case 't': // top of floating point stack.
533 return std::string("{st}");
534 case 'u': // second from top of floating point stack.
535 return std::string("{st(1)}"); // second from top of floating point stack.
536 default:
537 return std::string(1, Constraint);
538 }
539}
Eli Friedman872996c2008-08-20 02:34:37 +0000540} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000541
542namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000543// X86-32 generic target
544class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000545public:
Eli Friedman872996c2008-08-20 02:34:37 +0000546 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
547 DoubleAlign = LongLongAlign = 32;
548 LongDoubleWidth = 96;
549 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000550 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
551 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
552 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000553 }
554 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000555 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000556 }
557 virtual void getTargetDefines(std::vector<char> &Defines) const {
558 getX86Defines(Defines, false);
559 }
560};
561} // end anonymous namespace
562
563namespace {
564// x86-32 Darwin (OS X) target
565class DarwinI386TargetInfo : public X86_32TargetInfo {
566public:
567 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
568 LongDoubleWidth = 128;
569 LongDoubleAlign = 128;
Chris Lattner8405e092009-02-05 07:19:24 +0000570 PtrDiffType = SignedInt;
Eli Friedman2b161652008-08-21 00:13:15 +0000571 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
572 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
573 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000574 }
575 virtual void getTargetDefines(std::vector<char> &Defines) const {
576 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000577 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000578 }
Chris Lattnerddae7102008-12-04 22:54:33 +0000579 /// getDefaultLangOptions - Allow the target to specify default settings for
580 /// various language options. These may be overridden by command line
581 /// options.
582 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000583 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000584 }
Eli Friedman872996c2008-08-20 02:34:37 +0000585};
586} // end anonymous namespace
587
588namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000589// x86-32 FreeBSD target
590class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
591public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000592 FreeBSDX86_32TargetInfo(const std::string& triple) :
593 X86_32TargetInfo(triple) {
594 SizeType = UnsignedInt;
595 PtrDiffType = SignedInt;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000596 }
597 virtual void getTargetDefines(std::vector<char> &Defines) const {
598 X86_32TargetInfo::getTargetDefines(Defines);
599 getFreeBSDDefines(Defines, 0, getTargetTriple());
600 }
601};
602} // end anonymous namespace
603
604namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000605// x86-32 DragonFly target
606class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
607public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000608 DragonFlyX86_32TargetInfo(const std::string& triple) :
609 X86_32TargetInfo(triple) {
610 SizeType = UnsignedInt;
611 PtrDiffType = SignedInt;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000612 }
613 virtual void getTargetDefines(std::vector<char> &Defines) const {
614 X86_32TargetInfo::getTargetDefines(Defines);
615 getDragonFlyDefines(Defines);
616 }
617};
618} // end anonymous namespace
619
620namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000621// x86-32 Linux target
622class LinuxX86_32TargetInfo : public X86_32TargetInfo {
623public:
624 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000625 UserLabelPrefix = "";
Eli Friedman7cca0982008-11-02 02:43:55 +0000626 SizeType = UnsignedInt;
627 PtrDiffType = SignedInt;
Eli Friedman5fb0a022008-08-21 00:24:02 +0000628 }
629 virtual void getTargetDefines(std::vector<char> &Defines) const {
630 X86_32TargetInfo::getTargetDefines(Defines);
631 getLinuxDefines(Defines);
632 }
633};
634} // end anonymous namespace
635
636namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000637// x86-32 Windows target
638class WindowsX86_32TargetInfo : public X86_32TargetInfo {
639public:
640 WindowsX86_32TargetInfo(const std::string& triple)
641 : X86_32TargetInfo(triple) {
642 // FIXME: Fix wchar_t.
643 // FIXME: We should probably enable -fms-extensions by default for
644 // this target.
Eli Friedman7cca0982008-11-02 02:43:55 +0000645 SizeType = UnsignedInt;
646 PtrDiffType = SignedInt;
Eli Friedman23cb7912008-08-21 01:40:19 +0000647 }
648 virtual void getTargetDefines(std::vector<char> &Defines) const {
649 X86_32TargetInfo::getTargetDefines(Defines);
650 // This list is based off of the the list of things MingW defines
651 Define(Defines, "__WIN32__");
652 Define(Defines, "__WIN32");
653 Define(Defines, "_WIN32");
654 Define(Defines, "WIN32");
655 Define(Defines, "__WINNT__");
656 Define(Defines, "__WINNT");
657 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000658 Define(Defines, "_X86_");
659 Define(Defines, "__MSVCRT__");
660 }
661};
662} // end anonymous namespace
663
664namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000665// x86-64 generic target
666class X86_64TargetInfo : public X86TargetInfo {
667public:
668 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000669 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner4dfc45a2009-01-28 06:58:19 +0000670 DoubleAlign = LongLongAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000671 LongDoubleWidth = 128;
672 LongDoubleAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000673 IntMaxType = SignedLong;
674 UIntMaxType = UnsignedLong;
675
Eli Friedman2b161652008-08-21 00:13:15 +0000676 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
677 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
678 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000679 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000680 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000681 return "typedef struct __va_list_tag {"
682 " unsigned gp_offset;"
683 " unsigned fp_offset;"
684 " void* overflow_arg_area;"
685 " void* reg_save_area;"
686 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000687 }
Eli Friedman872996c2008-08-20 02:34:37 +0000688 virtual void getTargetDefines(std::vector<char> &Defines) const {
689 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000690 }
Eli Friedman872996c2008-08-20 02:34:37 +0000691};
692} // end anonymous namespace
693
694namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000695// x86-64 FreeBSD target
696class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
697public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000698 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner98cb2a22008-10-16 17:04:31 +0000699 virtual void getTargetDefines(std::vector<char> &Defines) const {
700 X86_64TargetInfo::getTargetDefines(Defines);
701 getFreeBSDDefines(Defines, 1, getTargetTriple());
702 }
703};
704} // end anonymous namespace
705
706namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000707// x86-64 Linux target
708class LinuxX86_64TargetInfo : public X86_64TargetInfo {
709public:
710 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000711 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000712 }
713 virtual void getTargetDefines(std::vector<char> &Defines) const {
714 X86_64TargetInfo::getTargetDefines(Defines);
715 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000716 }
717};
718} // end anonymous namespace
719
720namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000721// x86-64 Darwin (OS X) target
722class DarwinX86_64TargetInfo : public X86_64TargetInfo {
723public:
724 DarwinX86_64TargetInfo(const std::string& triple) :
725 X86_64TargetInfo(triple) {}
726
727 virtual void getTargetDefines(std::vector<char> &Defines) const {
728 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000729 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000730 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000731
Chris Lattnerddae7102008-12-04 22:54:33 +0000732 /// getDefaultLangOptions - Allow the target to specify default settings for
733 /// various language options. These may be overridden by command line
734 /// options.
735 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000736 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000737 }
Chris Lattner4b009652007-07-25 00:24:17 +0000738};
739} // end anonymous namespace.
740
Chris Lattner9fd73612008-04-21 18:56:49 +0000741namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000742class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000743public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000744 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
745 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000746 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
747 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000748 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000749 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000750 getARMDefines(Defines);
751 }
752 virtual void getTargetBuiltins(const Builtin::Info *&Records,
753 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000754 // FIXME: Implement.
755 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000756 NumRecords = 0;
757 }
758 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000759 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000760 }
761 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000762 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000763 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000764 virtual void getGCCRegNames(const char * const *&Names,
765 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000766 // FIXME: Implement.
767 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000768 NumNames = 0;
769 }
770 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
771 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000772 // FIXME: Implement.
773 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000774 NumAliases = 0;
775 }
776 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000777 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000778 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000779 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000780 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000781 case 'l': // r0-r7
782 case 'h': // r8-r15
783 case 'w': // VFP Floating point register single precision
784 case 'P': // VFP Floating point register double precision
785 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
786 return true;
787 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000788 return false;
789 }
790 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000791 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000792 return "";
793 }
794};
795} // end anonymous namespace.
796
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000797
798namespace {
799class DarwinARMTargetInfo : public ARMTargetInfo {
800public:
801 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
802
803 virtual void getTargetDefines(std::vector<char> &Defines) const {
804 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000805 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000806 }
807};
808} // end anonymous namespace.
809
Chris Lattner4b009652007-07-25 00:24:17 +0000810namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000811class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000812 static const TargetInfo::GCCRegAlias GCCRegAliases[];
813 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000814public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000815 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
816 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000817 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
818 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000819 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000820 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000821 // FIXME: This is missing a lot of important defines; some of the
822 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000823 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000824 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000825 Define(Defines, "__sparcv8");
826 }
827 virtual void getTargetBuiltins(const Builtin::Info *&Records,
828 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000829 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000830 }
831 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000832 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000833 }
834 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000835 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000836 }
837 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000838 unsigned &NumNames) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000839 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000840 unsigned &NumAliases) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000841 virtual bool validateAsmConstraint(char c,
842 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000843 // FIXME: Implement!
844 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000845 }
846 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000847 // FIXME: Implement!
848 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000849 }
850};
851
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000852const char * const SparcV8TargetInfo::GCCRegNames[] = {
853 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
854 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
855 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
856 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
857};
858
859void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
860 unsigned &NumNames) const {
861 Names = GCCRegNames;
862 NumNames = llvm::array_lengthof(GCCRegNames);
863}
864
865const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
866 { { "g0" }, "r0" },
867 { { "g1" }, "r1" },
868 { { "g2" }, "r2" },
869 { { "g3" }, "r3" },
870 { { "g4" }, "r4" },
871 { { "g5" }, "r5" },
872 { { "g6" }, "r6" },
873 { { "g7" }, "r7" },
874 { { "o0" }, "r8" },
875 { { "o1" }, "r9" },
876 { { "o2" }, "r10" },
877 { { "o3" }, "r11" },
878 { { "o4" }, "r12" },
879 { { "o5" }, "r13" },
880 { { "o6", "sp" }, "r14" },
881 { { "o7" }, "r15" },
882 { { "l0" }, "r16" },
883 { { "l1" }, "r17" },
884 { { "l2" }, "r18" },
885 { { "l3" }, "r19" },
886 { { "l4" }, "r20" },
887 { { "l5" }, "r21" },
888 { { "l6" }, "r22" },
889 { { "l7" }, "r23" },
890 { { "i0" }, "r24" },
891 { { "i1" }, "r25" },
892 { { "i2" }, "r26" },
893 { { "i3" }, "r27" },
894 { { "i4" }, "r28" },
895 { { "i5" }, "r29" },
896 { { "i6", "fp" }, "r30" },
897 { { "i7" }, "r31" },
898};
899
900void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
901 unsigned &NumAliases) const {
902 Aliases = GCCRegAliases;
903 NumAliases = llvm::array_lengthof(GCCRegAliases);
904}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000905} // end anonymous namespace.
906
Eli Friedmanff158dd2008-08-20 07:28:14 +0000907namespace {
908class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
909public:
910 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +0000911 SparcV8TargetInfo(triple) {
912 SizeType = UnsignedInt;
913 PtrDiffType = SignedInt;
914 }
Eli Friedmanff158dd2008-08-20 07:28:14 +0000915
916 virtual void getTargetDefines(std::vector<char> &Defines) const {
917 SparcV8TargetInfo::getTargetDefines(Defines);
918 getSolarisDefines(Defines);
919 }
920};
921} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000922
Chris Lattner85970f32008-05-08 05:58:21 +0000923namespace {
924 class PIC16TargetInfo : public TargetInfo{
925 public:
926 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptafa451432008-10-31 09:52:39 +0000927 IntWidth = 16;
928 LongWidth = LongLongWidth = 32;
929 PointerWidth = 16;
930 IntAlign = 8;
931 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000932 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +0000933 SizeType = UnsignedInt;
934 IntMaxType = SignedLong;
935 UIntMaxType = UnsignedLong;
Eli Friedman7cca0982008-11-02 02:43:55 +0000936 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000937 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000938 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000939 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
940 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000941 virtual void getTargetDefines(std::vector<char> &Defines) const {
942 Define(Defines, "__pic16");
943 }
944 virtual void getTargetBuiltins(const Builtin::Info *&Records,
945 unsigned &NumRecords) const {}
946 virtual const char *getVAListDeclaration() const { return "";}
947 virtual const char *getClobbers() const {return "";}
948 virtual const char *getTargetPrefix() const {return "";}
949 virtual void getGCCRegNames(const char * const *&Names,
950 unsigned &NumNames) const {}
951 virtual bool validateAsmConstraint(char c,
952 TargetInfo::ConstraintInfo &info) const {
953 return true;
954 }
955 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
956 unsigned &NumAliases) const {}
957 virtual bool useGlobalsForAutomaticVariables() const {return true;}
958 };
959}
960
Chris Lattner4b009652007-07-25 00:24:17 +0000961//===----------------------------------------------------------------------===//
962// Driver code
963//===----------------------------------------------------------------------===//
964
Ted Kremenekb97d7672007-12-04 17:07:35 +0000965static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000966 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
967 TT[4] == '-' && TT[1] - '3' < 6);
968}
969
Chris Lattnerfc457002008-03-05 01:18:20 +0000970/// CreateTargetInfo - Return the target info object for the specified target
971/// triple.
972TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000973 // OS detection; this isn't really anywhere near complete.
974 // Additions and corrections are welcome.
975 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000976 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000977 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000978 bool isSolaris = T.find("-solaris") != std::string::npos;
979 bool isLinux = T.find("-linux") != std::string::npos;
980 bool isWindows = T.find("-windows") != std::string::npos ||
981 T.find("-win32") != std::string::npos ||
982 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000983
Eli Friedman2b161652008-08-21 00:13:15 +0000984 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
985 if (isDarwin)
986 return new DarwinPPCTargetInfo(T);
987 return new PPC32TargetInfo(T);
988 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000989
Eli Friedman2b161652008-08-21 00:13:15 +0000990 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
991 if (isDarwin)
992 return new DarwinPPC64TargetInfo(T);
993 return new PPC64TargetInfo(T);
994 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000995
Eli Friedman2b161652008-08-21 00:13:15 +0000996 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
997 if (isDarwin)
998 return new DarwinARMTargetInfo(T);
999 return new ARMTargetInfo(T);
1000 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001001
Eli Friedman2b161652008-08-21 00:13:15 +00001002 if (T.find("sparc-") == 0) {
1003 if (isSolaris)
1004 return new SolarisSparcV8TargetInfo(T);
1005 return new SparcV8TargetInfo(T);
1006 }
1007
1008 if (T.find("x86_64-") == 0) {
1009 if (isDarwin)
1010 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001011 if (isLinux)
1012 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001013 if (isFreeBSD)
1014 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001015 return new X86_64TargetInfo(T);
1016 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001017
Chris Lattner85970f32008-05-08 05:58:21 +00001018 if (T.find("pic16-") == 0)
1019 return new PIC16TargetInfo(T);
1020
Eli Friedman2b161652008-08-21 00:13:15 +00001021 if (IsX86(T)) {
1022 if (isDarwin)
1023 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001024 if (isLinux)
1025 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001026 if (isDragonFly)
1027 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001028 if (isFreeBSD)
1029 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001030 if (isWindows)
1031 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001032 return new X86_32TargetInfo(T);
1033 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001034
Chris Lattnerfc457002008-03-05 01:18:20 +00001035 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001036}
Ted Kremenekd507bab2008-03-04 17:47:18 +00001037