blob: 6f563a55c3bd0dd9d27c8713794671fd683fea80 [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
Chris Lattner98cb2a22008-10-16 17:04:31 +000046static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit, const char *Triple) {
47 // FreeBSD defines; list based off of gcc output
48
49 const char *FreeBSD = strstr(Triple, "-freebsd");
50 FreeBSD += strlen("-freebsd");
51 char release[] = "X";
52 release[0] = FreeBSD[0];
53 char version[] = "X00001";
54 version[0] = FreeBSD[0];
55
56 Define(Defs, "__FreeBSD__", release);
57 Define(Defs, "__FreeBSD_cc_version", version);
58 Define(Defs, "__KPRINTF_ATTRIBUTE__");
59 Define(Defs, "unix");
60 Define(Defs, "bsd");
61 if (is64Bit) {
62 Define(Defs, "__LP64__");
63 }
64}
65
Chris Lattnerbd00eb82008-10-05 21:50:58 +000066static void getDragonFlyDefines(std::vector<char> &Defs) {
67 // DragonFly defines; list based off of gcc output
68 Define(Defs, "__DragonFly__");
69 Define(Defs, "__DragonFly_cc_version", "100001");
70 Define(Defs, "__ELF__");
71 Define(Defs, "__KPRINTF_ATTRIBUTE__");
72 Define(Defs, "__tune_i386__");
73 Define(Defs, "unix");
74 Define(Defs, "__unix");
75 Define(Defs, "__unix__");
76}
77
78static void getLinuxDefines(std::vector<char> &Defs) {
79 // Linux defines; list based off of gcc output
80 Define(Defs, "__unix__");
81 Define(Defs, "__unix");
82 Define(Defs, "unix");
83 Define(Defs, "__linux__");
84 Define(Defs, "__linux");
85 Define(Defs, "linux");
86 Define(Defs, "__gnu_linux__");
87}
88
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000089static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +000090 Define(Defs, "__APPLE__");
91 Define(Defs, "__MACH__");
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000092
93 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
94 const char *Darwin = strstr(Triple, "-darwin");
95 if (Darwin) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +000096 char DarwinStr[] = "1000";
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +000097 Darwin += strlen("-darwin");
Chris Lattnerd376f6d2008-09-30 20:30:12 +000098 if (Darwin[0] >= '0' && Darwin[0] <= '9') {
99 unsigned DarwinNo = Darwin[0]-'0';
100 ++Darwin;
101
102 // Handle "darwin11".
103 if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
104 DarwinNo = 10+Darwin[0]-'0';
105 ++Darwin;
106 }
107
108 if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000109 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
110 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000111 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000112
113 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
114 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
115 Darwin[2] == '\0')
116 DarwinStr[3] = Darwin[1];
117
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000118 }
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000119 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000120 }
Eli Friedman872996c2008-08-20 02:34:37 +0000121}
Chris Lattner4b009652007-07-25 00:24:17 +0000122
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000123//===----------------------------------------------------------------------===//
124// Defines specific to certain architectures.
125//===----------------------------------------------------------------------===//
Eli Friedman5fb0a022008-08-21 00:24:02 +0000126
Chris Lattner4b009652007-07-25 00:24:17 +0000127/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
128/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000129static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000130 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000131 Define(Defs, "__ppc__");
132 Define(Defs, "_ARCH_PPC");
133 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000134 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000135 Define(Defs, "_ARCH_PPC64");
136 Define(Defs, "_LP64");
137 Define(Defs, "__LP64__");
138 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000139 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000140 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000141 }
142
143 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000144 Define(Defs, "_BIG_ENDIAN");
145 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000146
Chris Lattner4b009652007-07-25 00:24:17 +0000147 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000148 Define(Defs, "__NATURAL_ALIGNMENT__");
149 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000150
Chris Lattner3da35682008-10-05 21:49:27 +0000151 // FIXME: Should be controlled by command line option.
Chris Lattner0db667a2007-10-06 06:57:34 +0000152 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000153}
154
155/// getX86Defines - Return a set of the X86-specific #defines that are
156/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000157static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000158 // Target identification.
159 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000160 Define(Defs, "_LP64");
161 Define(Defs, "__LP64__");
162 Define(Defs, "__amd64__");
163 Define(Defs, "__amd64");
164 Define(Defs, "__x86_64");
165 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000166 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000167 Define(Defs, "__i386__");
168 Define(Defs, "__i386");
169 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000170 }
171
172 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000173 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000174
Chris Lattner4b009652007-07-25 00:24:17 +0000175 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000176 Define(Defs, "__nocona");
177 Define(Defs, "__nocona__");
178 Define(Defs, "__tune_nocona__");
179 Define(Defs, "__SSE2_MATH__");
180 Define(Defs, "__SSE2__");
181 Define(Defs, "__SSE_MATH__");
182 Define(Defs, "__SSE__");
183 Define(Defs, "__MMX__");
184 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000185}
186
Chris Lattnerb6444052008-04-21 20:19:54 +0000187/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000188/// not tied to a specific subtarget.
189static void getARMDefines(std::vector<char> &Defs) {
190 // Target identification.
191 Define(Defs, "__arm");
192 Define(Defs, "__arm__");
193
194 // Target properties.
195 Define(Defs, "__LITTLE_ENDIAN__");
196
Chris Lattner9fd73612008-04-21 18:56:49 +0000197 // Subtarget options. [hard coded to v6 for now]
198 Define(Defs, "__ARM_ARCH_6K__");
199 Define(Defs, "__ARMEL__");
200 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner9fd73612008-04-21 18:56:49 +0000201}
202
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000203//===----------------------------------------------------------------------===//
204// Specific target implementations.
205//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000206
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000207namespace {
208// PPC abstract base class
209class PPCTargetInfo : public TargetInfo {
210 static const Builtin::Info BuiltinInfo[];
211 static const char * const GCCRegNames[];
212 static const TargetInfo::GCCRegAlias GCCRegAliases[];
213
214public:
215 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
216 CharIsSigned = false;
217 }
218 virtual void getTargetBuiltins(const Builtin::Info *&Records,
219 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000220 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000221 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000222 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000223 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-10-27 01:11:29 +0000224 return "typedef char* __builtin_va_list;";
225 // This is the right definition for ABI/V4: System V.4/eabi.
226 /*return "typedef struct __va_list_tag {"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000227 " unsigned char gpr;"
228 " unsigned char fpr;"
229 " unsigned short reserved;"
230 " void* overflow_arg_area;"
231 " void* reg_save_area;"
Chris Lattnera07708f2008-10-27 01:11:29 +0000232 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000233 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000234 virtual const char *getTargetPrefix() const {
235 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000236 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000237 virtual void getGCCRegNames(const char * const *&Names,
238 unsigned &NumNames) const;
239 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
240 unsigned &NumAliases) const;
241 virtual bool validateAsmConstraint(char c,
242 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000243 switch (c) {
244 default: return false;
245 case 'O': // Zero
246 return true;
247 case 'b': // Base register
248 case 'f': // Floating point register
249 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
250 return true;
251 }
252 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000253 virtual const char *getClobbers() const {
254 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000255 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000256};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000257
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000258const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
259#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
260#include "clang/AST/PPCBuiltins.def"
261};
Chris Lattner9fd73612008-04-21 18:56:49 +0000262
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000263const char * const PPCTargetInfo::GCCRegNames[] = {
264 "0", "1", "2", "3", "4", "5", "6", "7",
265 "8", "9", "10", "11", "12", "13", "14", "15",
266 "16", "17", "18", "19", "20", "21", "22", "23",
267 "24", "25", "26", "27", "28", "29", "30", "31",
268 "0", "1", "2", "3", "4", "5", "6", "7",
269 "8", "9", "10", "11", "12", "13", "14", "15",
270 "16", "17", "18", "19", "20", "21", "22", "23",
271 "24", "25", "26", "27", "28", "29", "30", "31",
272 "mq", "lr", "ctr", "ap",
273 "0", "1", "2", "3", "4", "5", "6", "7",
274 "xer",
275 "0", "1", "2", "3", "4", "5", "6", "7",
276 "8", "9", "10", "11", "12", "13", "14", "15",
277 "16", "17", "18", "19", "20", "21", "22", "23",
278 "24", "25", "26", "27", "28", "29", "30", "31",
279 "vrsave", "vscr",
280 "spe_acc", "spefscr",
281 "sfp"
282};
Chris Lattner4b009652007-07-25 00:24:17 +0000283
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000284void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
285 unsigned &NumNames) const {
286 Names = GCCRegNames;
287 NumNames = llvm::array_lengthof(GCCRegNames);
288}
Chris Lattner4b009652007-07-25 00:24:17 +0000289
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000290const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
291 // While some of these aliases do map to different registers
292 // they still share the same register name.
293 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
294 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
295 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
296 { { "cr3", "fr3", "r3", "v3"}, "3" },
297 { { "cr4", "fr4", "r4", "v4"}, "4" },
298 { { "cr5", "fr5", "r5", "v5"}, "5" },
299 { { "cr6", "fr6", "r6", "v6"}, "6" },
300 { { "cr7", "fr7", "r7", "v7"}, "7" },
301 { { "fr8", "r8", "v8"}, "8" },
302 { { "fr9", "r9", "v9"}, "9" },
303 { { "fr10", "r10", "v10"}, "10" },
304 { { "fr11", "r11", "v11"}, "11" },
305 { { "fr12", "r12", "v12"}, "12" },
306 { { "fr13", "r13", "v13"}, "13" },
307 { { "fr14", "r14", "v14"}, "14" },
308 { { "fr15", "r15", "v15"}, "15" },
309 { { "fr16", "r16", "v16"}, "16" },
310 { { "fr17", "r17", "v17"}, "17" },
311 { { "fr18", "r18", "v18"}, "18" },
312 { { "fr19", "r19", "v19"}, "19" },
313 { { "fr20", "r20", "v20"}, "20" },
314 { { "fr21", "r21", "v21"}, "21" },
315 { { "fr22", "r22", "v22"}, "22" },
316 { { "fr23", "r23", "v23"}, "23" },
317 { { "fr24", "r24", "v24"}, "24" },
318 { { "fr25", "r25", "v25"}, "25" },
319 { { "fr26", "r26", "v26"}, "26" },
320 { { "fr27", "r27", "v27"}, "27" },
321 { { "fr28", "r28", "v28"}, "28" },
322 { { "fr29", "r29", "v29"}, "29" },
323 { { "fr30", "r30", "v30"}, "30" },
324 { { "fr31", "r31", "v31"}, "31" },
325};
326
327void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
328 unsigned &NumAliases) const {
329 Aliases = GCCRegAliases;
330 NumAliases = llvm::array_lengthof(GCCRegAliases);
331}
332} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000333
334namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000335class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000336public:
Eli Friedman2b161652008-08-21 00:13:15 +0000337 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
338 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
339 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
340 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000341 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000342 getPowerPCDefines(Defines, false);
343 }
Chris Lattner4b009652007-07-25 00:24:17 +0000344};
345} // end anonymous namespace.
346
347namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000348class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000349public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000350 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000351 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000352 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
353 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000354 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000355 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000356 getPowerPCDefines(Defines, true);
357 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000358};
359} // end anonymous namespace.
360
361namespace {
362class DarwinPPCTargetInfo : public PPC32TargetInfo {
363public:
364 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
365 virtual void getTargetDefines(std::vector<char> &Defines) const {
366 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000367 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000368 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000369
Chris Lattnerddae7102008-12-04 22:54:33 +0000370 /// getDefaultLangOptions - Allow the target to specify default settings for
371 /// various language options. These may be overridden by command line
372 /// options.
373 virtual void getDefaultLangOptions(LangOptions &Opts) {
374 Opts.NeXTRuntime = true;
375 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000376};
377} // end anonymous namespace.
378
379namespace {
380class DarwinPPC64TargetInfo : public PPC64TargetInfo {
381public:
382 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
383 virtual void getTargetDefines(std::vector<char> &Defines) const {
384 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000385 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000386 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000387
Chris Lattnerddae7102008-12-04 22:54:33 +0000388 /// getDefaultLangOptions - Allow the target to specify default settings for
389 /// various language options. These may be overridden by command line
390 /// options.
391 virtual void getDefaultLangOptions(LangOptions &Opts) {
392 Opts.NeXTRuntime = true;
393 }
Chris Lattner4b009652007-07-25 00:24:17 +0000394};
395} // end anonymous namespace.
396
397namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000398// Namespace for x86 abstract base class
399const Builtin::Info BuiltinInfo[] = {
400#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
401#include "clang/AST/X86Builtins.def"
402};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000403
Eli Friedman872996c2008-08-20 02:34:37 +0000404const char *GCCRegNames[] = {
405 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
406 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
407 "argp", "flags", "fspr", "dirflag", "frame",
408 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
409 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
410 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
411 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
412};
413
414const TargetInfo::GCCRegAlias GCCRegAliases[] = {
415 { { "al", "ah", "eax", "rax" }, "ax" },
416 { { "bl", "bh", "ebx", "rbx" }, "bx" },
417 { { "cl", "ch", "ecx", "rcx" }, "cx" },
418 { { "dl", "dh", "edx", "rdx" }, "dx" },
419 { { "esi", "rsi" }, "si" },
420 { { "edi", "rdi" }, "di" },
421 { { "esp", "rsp" }, "sp" },
422 { { "ebp", "rbp" }, "bp" },
423};
424
425// X86 target abstract base class; x86-32 and x86-64 are very close, so
426// most of the implementation can be shared.
427class X86TargetInfo : public TargetInfo {
428public:
429 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
430 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000431 }
432 virtual void getTargetBuiltins(const Builtin::Info *&Records,
433 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000434 Records = BuiltinInfo;
435 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000436 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000437 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000438 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000439 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000440 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000441 unsigned &NumNames) const {
442 Names = GCCRegNames;
443 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000444 }
445 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
446 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000447 Aliases = GCCRegAliases;
448 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000449 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000450 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000451 TargetInfo::ConstraintInfo &info) const;
452 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000453 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000454 return "~{dirflag},~{fpsr},~{flags}";
455 }
Chris Lattner4b009652007-07-25 00:24:17 +0000456};
Eli Friedman872996c2008-08-20 02:34:37 +0000457
458bool
459X86TargetInfo::validateAsmConstraint(char c,
460 TargetInfo::ConstraintInfo &info) const {
461 switch (c) {
462 default: return false;
463 case 'a': // eax.
464 case 'b': // ebx.
465 case 'c': // ecx.
466 case 'd': // edx.
467 case 'S': // esi.
468 case 'D': // edi.
469 case 'A': // edx:eax.
470 case 't': // top of floating point stack.
471 case 'u': // second from top of floating point stack.
472 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000473 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000474 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000475 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
476 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
477 // instructions.
478 case 'N': // unsigned 8-bit integer constant for use with in and out
479 // instructions.
480 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
481 return true;
482 }
483}
484
485std::string
486X86TargetInfo::convertConstraint(const char Constraint) const {
487 switch (Constraint) {
488 case 'a': return std::string("{ax}");
489 case 'b': return std::string("{bx}");
490 case 'c': return std::string("{cx}");
491 case 'd': return std::string("{dx}");
492 case 'S': return std::string("{si}");
493 case 'D': return std::string("{di}");
494 case 't': // top of floating point stack.
495 return std::string("{st}");
496 case 'u': // second from top of floating point stack.
497 return std::string("{st(1)}"); // second from top of floating point stack.
498 default:
499 return std::string(1, Constraint);
500 }
501}
Eli Friedman872996c2008-08-20 02:34:37 +0000502} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000503
504namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000505// X86-32 generic target
506class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000507public:
Eli Friedman872996c2008-08-20 02:34:37 +0000508 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
509 DoubleAlign = LongLongAlign = 32;
510 LongDoubleWidth = 96;
511 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000512 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
513 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
514 "a0:0:64-f80:32:32";
Eli Friedman872996c2008-08-20 02:34:37 +0000515 }
516 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000517 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000518 }
519 virtual void getTargetDefines(std::vector<char> &Defines) const {
520 getX86Defines(Defines, false);
521 }
522};
523} // end anonymous namespace
524
525namespace {
526// x86-32 Darwin (OS X) target
527class DarwinI386TargetInfo : public X86_32TargetInfo {
528public:
529 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
530 LongDoubleWidth = 128;
531 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000532 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
533 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
534 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000535 }
536 virtual void getTargetDefines(std::vector<char> &Defines) const {
537 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000538 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000539 }
Chris Lattnerddae7102008-12-04 22:54:33 +0000540 /// getDefaultLangOptions - Allow the target to specify default settings for
541 /// various language options. These may be overridden by command line
542 /// options.
543 virtual void getDefaultLangOptions(LangOptions &Opts) {
544 Opts.NeXTRuntime = true;
545 }
Eli Friedman872996c2008-08-20 02:34:37 +0000546};
547} // end anonymous namespace
548
549namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000550// x86-32 FreeBSD target
551class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
552public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000553 FreeBSDX86_32TargetInfo(const std::string& triple) :
554 X86_32TargetInfo(triple) {
555 SizeType = UnsignedInt;
556 PtrDiffType = SignedInt;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000557 }
558 virtual void getTargetDefines(std::vector<char> &Defines) const {
559 X86_32TargetInfo::getTargetDefines(Defines);
560 getFreeBSDDefines(Defines, 0, getTargetTriple());
561 }
562};
563} // end anonymous namespace
564
565namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000566// x86-32 DragonFly target
567class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
568public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000569 DragonFlyX86_32TargetInfo(const std::string& triple) :
570 X86_32TargetInfo(triple) {
571 SizeType = UnsignedInt;
572 PtrDiffType = SignedInt;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000573 }
574 virtual void getTargetDefines(std::vector<char> &Defines) const {
575 X86_32TargetInfo::getTargetDefines(Defines);
576 getDragonFlyDefines(Defines);
577 }
578};
579} // end anonymous namespace
580
581namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000582// x86-32 Linux target
583class LinuxX86_32TargetInfo : public X86_32TargetInfo {
584public:
585 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000586 UserLabelPrefix = "";
Eli Friedman7cca0982008-11-02 02:43:55 +0000587 SizeType = UnsignedInt;
588 PtrDiffType = SignedInt;
Eli Friedman5fb0a022008-08-21 00:24:02 +0000589 }
590 virtual void getTargetDefines(std::vector<char> &Defines) const {
591 X86_32TargetInfo::getTargetDefines(Defines);
592 getLinuxDefines(Defines);
593 }
594};
595} // end anonymous namespace
596
597namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000598// x86-32 Windows target
599class WindowsX86_32TargetInfo : public X86_32TargetInfo {
600public:
601 WindowsX86_32TargetInfo(const std::string& triple)
602 : X86_32TargetInfo(triple) {
603 // FIXME: Fix wchar_t.
604 // FIXME: We should probably enable -fms-extensions by default for
605 // this target.
Eli Friedman7cca0982008-11-02 02:43:55 +0000606 SizeType = UnsignedInt;
607 PtrDiffType = SignedInt;
Eli Friedman23cb7912008-08-21 01:40:19 +0000608 }
609 virtual void getTargetDefines(std::vector<char> &Defines) const {
610 X86_32TargetInfo::getTargetDefines(Defines);
611 // This list is based off of the the list of things MingW defines
612 Define(Defines, "__WIN32__");
613 Define(Defines, "__WIN32");
614 Define(Defines, "_WIN32");
615 Define(Defines, "WIN32");
616 Define(Defines, "__WINNT__");
617 Define(Defines, "__WINNT");
618 Define(Defines, "WINNT");
Eli Friedman23cb7912008-08-21 01:40:19 +0000619 Define(Defines, "_X86_");
620 Define(Defines, "__MSVCRT__");
621 }
622};
623} // end anonymous namespace
624
625namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000626// x86-64 generic target
627class X86_64TargetInfo : public X86TargetInfo {
628public:
629 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000630 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000631 LongDoubleWidth = 128;
632 LongDoubleAlign = 128;
Eli Friedman2b161652008-08-21 00:13:15 +0000633 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
634 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
635 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000636 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000637 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000638 return "typedef struct __va_list_tag {"
639 " unsigned gp_offset;"
640 " unsigned fp_offset;"
641 " void* overflow_arg_area;"
642 " void* reg_save_area;"
643 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000644 }
Eli Friedman872996c2008-08-20 02:34:37 +0000645 virtual void getTargetDefines(std::vector<char> &Defines) const {
646 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000647 }
Eli Friedman872996c2008-08-20 02:34:37 +0000648};
649} // end anonymous namespace
650
651namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000652// x86-64 FreeBSD target
653class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
654public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000655 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner98cb2a22008-10-16 17:04:31 +0000656 virtual void getTargetDefines(std::vector<char> &Defines) const {
657 X86_64TargetInfo::getTargetDefines(Defines);
658 getFreeBSDDefines(Defines, 1, getTargetTriple());
659 }
660};
661} // end anonymous namespace
662
663namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000664// x86-64 Linux target
665class LinuxX86_64TargetInfo : public X86_64TargetInfo {
666public:
667 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000668 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000669 }
670 virtual void getTargetDefines(std::vector<char> &Defines) const {
671 X86_64TargetInfo::getTargetDefines(Defines);
672 getLinuxDefines(Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000673 }
674};
675} // end anonymous namespace
676
677namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000678// x86-64 Darwin (OS X) target
679class DarwinX86_64TargetInfo : public X86_64TargetInfo {
680public:
681 DarwinX86_64TargetInfo(const std::string& triple) :
682 X86_64TargetInfo(triple) {}
683
684 virtual void getTargetDefines(std::vector<char> &Defines) const {
685 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000686 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000687 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000688
Chris Lattnerddae7102008-12-04 22:54:33 +0000689 /// getDefaultLangOptions - Allow the target to specify default settings for
690 /// various language options. These may be overridden by command line
691 /// options.
692 virtual void getDefaultLangOptions(LangOptions &Opts) {
693 Opts.NeXTRuntime = true;
694 }
Chris Lattner4b009652007-07-25 00:24:17 +0000695};
696} // end anonymous namespace.
697
Chris Lattner9fd73612008-04-21 18:56:49 +0000698namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000699class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000700public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000701 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
702 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000703 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
704 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000705 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000706 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000707 getARMDefines(Defines);
708 }
709 virtual void getTargetBuiltins(const Builtin::Info *&Records,
710 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000711 // FIXME: Implement.
712 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000713 NumRecords = 0;
714 }
715 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000716 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000717 }
718 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000719 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000720 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000721 virtual void getGCCRegNames(const char * const *&Names,
722 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000723 // FIXME: Implement.
724 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000725 NumNames = 0;
726 }
727 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
728 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000729 // FIXME: Implement.
730 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000731 NumAliases = 0;
732 }
733 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000734 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000735 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000736 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000737 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000738 case 'l': // r0-r7
739 case 'h': // r8-r15
740 case 'w': // VFP Floating point register single precision
741 case 'P': // VFP Floating point register double precision
742 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
743 return true;
744 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000745 return false;
746 }
747 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000748 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000749 return "";
750 }
751};
752} // end anonymous namespace.
753
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000754
755namespace {
756class DarwinARMTargetInfo : public ARMTargetInfo {
757public:
758 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
759
760 virtual void getTargetDefines(std::vector<char> &Defines) const {
761 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000762 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000763 }
764};
765} // end anonymous namespace.
766
Chris Lattner4b009652007-07-25 00:24:17 +0000767namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000768class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000769public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000770 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
771 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000772 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
773 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000774 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000775 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000776 // FIXME: This is missing a lot of important defines; some of the
777 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000778 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000779 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000780 Define(Defines, "__sparcv8");
781 }
782 virtual void getTargetBuiltins(const Builtin::Info *&Records,
783 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000784 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000785 }
786 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000787 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000788 }
789 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000790 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000791 }
792 virtual void getGCCRegNames(const char * const *&Names,
793 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000794 // FIXME: Implement!
795 Names = 0;
796 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000797 }
798 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
799 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000800 // FIXME: Implement!
801 Aliases = 0;
802 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000803 }
804 virtual bool validateAsmConstraint(char c,
805 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000806 // FIXME: Implement!
807 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000808 }
809 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000810 // FIXME: Implement!
811 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000812 }
813};
814
815} // end anonymous namespace.
816
Eli Friedmanff158dd2008-08-20 07:28:14 +0000817namespace {
818class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
819public:
820 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +0000821 SparcV8TargetInfo(triple) {
822 SizeType = UnsignedInt;
823 PtrDiffType = SignedInt;
824 }
Eli Friedmanff158dd2008-08-20 07:28:14 +0000825
826 virtual void getTargetDefines(std::vector<char> &Defines) const {
827 SparcV8TargetInfo::getTargetDefines(Defines);
828 getSolarisDefines(Defines);
829 }
830};
831} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000832
Chris Lattner85970f32008-05-08 05:58:21 +0000833namespace {
834 class PIC16TargetInfo : public TargetInfo{
835 public:
836 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptafa451432008-10-31 09:52:39 +0000837 IntWidth = 16;
838 LongWidth = LongLongWidth = 32;
839 PointerWidth = 16;
840 IntAlign = 8;
841 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000842 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +0000843 SizeType = UnsignedInt;
844 IntMaxType = SignedLong;
845 UIntMaxType = UnsignedLong;
Eli Friedman7cca0982008-11-02 02:43:55 +0000846 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000847 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000848 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000849 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
850 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000851 virtual void getTargetDefines(std::vector<char> &Defines) const {
852 Define(Defines, "__pic16");
853 }
854 virtual void getTargetBuiltins(const Builtin::Info *&Records,
855 unsigned &NumRecords) const {}
856 virtual const char *getVAListDeclaration() const { return "";}
857 virtual const char *getClobbers() const {return "";}
858 virtual const char *getTargetPrefix() const {return "";}
859 virtual void getGCCRegNames(const char * const *&Names,
860 unsigned &NumNames) const {}
861 virtual bool validateAsmConstraint(char c,
862 TargetInfo::ConstraintInfo &info) const {
863 return true;
864 }
865 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
866 unsigned &NumAliases) const {}
867 virtual bool useGlobalsForAutomaticVariables() const {return true;}
868 };
869}
870
Chris Lattner4b009652007-07-25 00:24:17 +0000871//===----------------------------------------------------------------------===//
872// Driver code
873//===----------------------------------------------------------------------===//
874
Ted Kremenekb97d7672007-12-04 17:07:35 +0000875static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000876 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
877 TT[4] == '-' && TT[1] - '3' < 6);
878}
879
Chris Lattnerfc457002008-03-05 01:18:20 +0000880/// CreateTargetInfo - Return the target info object for the specified target
881/// triple.
882TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +0000883 // OS detection; this isn't really anywhere near complete.
884 // Additions and corrections are welcome.
885 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +0000886 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +0000887 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +0000888 bool isSolaris = T.find("-solaris") != std::string::npos;
889 bool isLinux = T.find("-linux") != std::string::npos;
890 bool isWindows = T.find("-windows") != std::string::npos ||
891 T.find("-win32") != std::string::npos ||
892 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000893
Eli Friedman2b161652008-08-21 00:13:15 +0000894 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
895 if (isDarwin)
896 return new DarwinPPCTargetInfo(T);
897 return new PPC32TargetInfo(T);
898 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000899
Eli Friedman2b161652008-08-21 00:13:15 +0000900 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
901 if (isDarwin)
902 return new DarwinPPC64TargetInfo(T);
903 return new PPC64TargetInfo(T);
904 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000905
Eli Friedman2b161652008-08-21 00:13:15 +0000906 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
907 if (isDarwin)
908 return new DarwinARMTargetInfo(T);
909 return new ARMTargetInfo(T);
910 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000911
Eli Friedman2b161652008-08-21 00:13:15 +0000912 if (T.find("sparc-") == 0) {
913 if (isSolaris)
914 return new SolarisSparcV8TargetInfo(T);
915 return new SparcV8TargetInfo(T);
916 }
917
918 if (T.find("x86_64-") == 0) {
919 if (isDarwin)
920 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000921 if (isLinux)
922 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000923 if (isFreeBSD)
924 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000925 return new X86_64TargetInfo(T);
926 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000927
Chris Lattner85970f32008-05-08 05:58:21 +0000928 if (T.find("pic16-") == 0)
929 return new PIC16TargetInfo(T);
930
Eli Friedman2b161652008-08-21 00:13:15 +0000931 if (IsX86(T)) {
932 if (isDarwin)
933 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000934 if (isLinux)
935 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000936 if (isDragonFly)
937 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000938 if (isFreeBSD)
939 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +0000940 if (isWindows)
941 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +0000942 return new X86_32TargetInfo(T);
943 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000944
Chris Lattnerfc457002008-03-05 01:18:20 +0000945 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000946}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000947