blob: 6f563a55c3bd0dd9d27c8713794671fd683fea80 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-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 Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner10a5b382007-01-29 05:24:35 +000015#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/TargetInfo.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000020#include "llvm/ADT/APFloat.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000021using namespace clang;
22
Chris Lattner5ba61f02006-10-14 07:39:34 +000023//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000024// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000025//===----------------------------------------------------------------------===//
26
Chris Lattnerb2d486a2007-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 Lattner09d98f52008-10-05 21:50:58 +000037//===----------------------------------------------------------------------===//
38// Defines specific to certain operating systems.
39//===----------------------------------------------------------------------===//
40
Eli Friedmanda8f5a92008-08-20 07:28:14 +000041static void getSolarisDefines(std::vector<char> &Defs) {
42 Define(Defs, "__SUN__");
43 Define(Defs, "__SOLARIS__");
44}
Chris Lattner5ba61f02006-10-14 07:39:34 +000045
Chris Lattner3c3e2cc2008-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 Lattner09d98f52008-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 Lattnerb3793bb2008-09-30 01:00:25 +000089static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +000090 Define(Defs, "__APPLE__");
91 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-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 Lattner97d74942008-09-30 20:30:12 +000096 char DarwinStr[] = "1000";
Chris Lattnerb3793bb2008-09-30 01:00:25 +000097 Darwin += strlen("-darwin");
Chris Lattner97d74942008-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 Lattnerb3793bb2008-09-30 01:00:25 +0000109 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
110 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000111 }
Chris Lattner97d74942008-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 Lattnerb3793bb2008-09-30 01:00:25 +0000118 }
Chris Lattner97d74942008-09-30 20:30:12 +0000119 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000120 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000121}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000122
Chris Lattner09d98f52008-10-05 21:50:58 +0000123//===----------------------------------------------------------------------===//
124// Defines specific to certain architectures.
125//===----------------------------------------------------------------------===//
Eli Friedmanff594f22008-08-21 00:24:02 +0000126
Chris Lattner1f5ad112006-10-14 18:32:12 +0000127/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
128/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000129static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000130 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000131 Define(Defs, "__ppc__");
132 Define(Defs, "_ARCH_PPC");
133 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000134 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000135 Define(Defs, "_ARCH_PPC64");
136 Define(Defs, "_LP64");
137 Define(Defs, "__LP64__");
138 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000139 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000140 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000141 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000142
Chris Lattner9c837532006-10-15 01:05:46 +0000143 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000144 Define(Defs, "_BIG_ENDIAN");
145 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000146
Chris Lattner9c837532006-10-15 01:05:46 +0000147 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000148 Define(Defs, "__NATURAL_ALIGNMENT__");
149 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000150
Chris Lattnerac7ed9a2008-10-05 21:49:27 +0000151 // FIXME: Should be controlled by command line option.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000152 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000153}
154
155/// getX86Defines - Return a set of the X86-specific #defines that are
156/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000157static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000158 // Target identification.
159 if (is64Bit) {
Chris Lattnerb2d486a2007-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 Lattner9c837532006-10-15 01:05:46 +0000166 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000167 Define(Defs, "__i386__");
168 Define(Defs, "__i386");
169 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000170 }
171
172 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000173 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000174
Chris Lattner9c837532006-10-15 01:05:46 +0000175 // Subtarget options.
Chris Lattnerb2d486a2007-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 Lattner1f5ad112006-10-14 18:32:12 +0000185}
186
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000187/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-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 Lattner17df24e2008-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 Lattner17df24e2008-04-21 18:56:49 +0000201}
202
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000203//===----------------------------------------------------------------------===//
204// Specific target implementations.
205//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000206
Eli Friedmanb9e5bed2008-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 Lattner10a5b382007-01-29 05:24:35 +0000220 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000221 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000222 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000223 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-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 Friedmanb9e5bed2008-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 Lattner69f9bc22008-10-27 01:11:29 +0000232 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000233 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000234 virtual const char *getTargetPrefix() const {
235 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000236 }
Eli Friedmanb9e5bed2008-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 Carlssonf511f642007-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 Friedmanb9e5bed2008-08-20 23:11:40 +0000253 virtual const char *getClobbers() const {
254 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000255 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000256};
Anders Carlssonf511f642007-11-27 04:11:28 +0000257
Eli Friedmanb9e5bed2008-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 Lattner17df24e2008-04-21 18:56:49 +0000262
Eli Friedmanb9e5bed2008-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 Lattner10a5b382007-01-29 05:24:35 +0000283
Eli Friedmanb9e5bed2008-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 Lattner5ba61f02006-10-14 07:39:34 +0000289
Eli Friedmanb9e5bed2008-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 Lattner02dffbd2006-10-14 07:50:21 +0000333
Chris Lattner5ba61f02006-10-14 07:39:34 +0000334namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000335class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000336public:
Eli Friedman873f65a2008-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 Lattnerb2d486a2007-10-06 06:57:34 +0000341 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000342 getPowerPCDefines(Defines, false);
343 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000344};
345} // end anonymous namespace.
346
347namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000348class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000349public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000350 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000351 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-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 Lattnerba7a6c12008-05-09 06:17:04 +0000354 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000355 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000356 getPowerPCDefines(Defines, true);
357 }
Eli Friedmanb9e5bed2008-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 Lattnerb3793bb2008-09-30 01:00:25 +0000367 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000368 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000369
Chris Lattnerc7c6dd42008-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 Friedmanb9e5bed2008-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 Lattnerb3793bb2008-09-30 01:00:25 +0000385 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000386 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000387
Chris Lattnerc7c6dd42008-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 Lattner5ba61f02006-10-14 07:39:34 +0000394};
395} // end anonymous namespace.
396
397namespace {
Eli Friedman3fd920a2008-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 Friedmanb5366062008-05-20 14:21:01 +0000403
Eli Friedman3fd920a2008-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 Lattner1f5ad112006-10-14 18:32:12 +0000431 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000432 virtual void getTargetBuiltins(const Builtin::Info *&Records,
433 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000434 Records = BuiltinInfo;
435 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000436 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000437 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000438 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000439 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000440 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000441 unsigned &NumNames) const {
442 Names = GCCRegNames;
443 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000444 }
445 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
446 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000447 Aliases = GCCRegAliases;
448 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000449 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000450 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000451 TargetInfo::ConstraintInfo &info) const;
452 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000453 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000454 return "~{dirflag},~{fpsr},~{flags}";
455 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000456};
Eli Friedman3fd920a2008-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 Carlsson83661ac2008-10-06 00:41:45 +0000473 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000474 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-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 Friedman3fd920a2008-08-20 02:34:37 +0000502} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000503
504namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000505// X86-32 generic target
506class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000507public:
Eli Friedman3fd920a2008-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 Friedman873f65a2008-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 Friedman3fd920a2008-08-20 02:34:37 +0000515 }
516 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000517 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-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 Friedman873f65a2008-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 Friedman3fd920a2008-08-20 02:34:37 +0000535 }
536 virtual void getTargetDefines(std::vector<char> &Defines) const {
537 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000538 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000539 }
Chris Lattnerc7c6dd42008-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 Friedman3fd920a2008-08-20 02:34:37 +0000546};
547} // end anonymous namespace
548
549namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000550// x86-32 FreeBSD target
551class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
552public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000553 FreeBSDX86_32TargetInfo(const std::string& triple) :
554 X86_32TargetInfo(triple) {
555 SizeType = UnsignedInt;
556 PtrDiffType = SignedInt;
Chris Lattner3c3e2cc2008-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 Lattner5637ef52008-08-23 18:23:14 +0000566// x86-32 DragonFly target
567class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
568public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000569 DragonFlyX86_32TargetInfo(const std::string& triple) :
570 X86_32TargetInfo(triple) {
571 SizeType = UnsignedInt;
572 PtrDiffType = SignedInt;
Chris Lattner5637ef52008-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 Friedmanff594f22008-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 Lattner4ecd7532008-10-05 19:44:25 +0000586 UserLabelPrefix = "";
Eli Friedmand50881c2008-11-02 02:43:55 +0000587 SizeType = UnsignedInt;
588 PtrDiffType = SignedInt;
Eli Friedmanff594f22008-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 Friedmanc968a6a2008-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 Friedmand50881c2008-11-02 02:43:55 +0000606 SizeType = UnsignedInt;
607 PtrDiffType = SignedInt;
Eli Friedmanc968a6a2008-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 Friedmanc968a6a2008-08-21 01:40:19 +0000619 Define(Defines, "_X86_");
620 Define(Defines, "__MSVCRT__");
621 }
622};
623} // end anonymous namespace
624
625namespace {
Eli Friedman3fd920a2008-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 Lattnerba7a6c12008-05-09 06:17:04 +0000630 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000631 LongDoubleWidth = 128;
632 LongDoubleAlign = 128;
Eli Friedman873f65a2008-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 Lattner10a5b382007-01-29 05:24:35 +0000636 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000637 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-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 Carlsson5fa3f342007-11-24 23:38:12 +0000644 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000645 virtual void getTargetDefines(std::vector<char> &Defines) const {
646 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000647 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000648};
649} // end anonymous namespace
650
651namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000652// x86-64 FreeBSD target
653class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
654public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000655 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner3c3e2cc2008-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 Dunbard0921de2008-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 Lattner4ecd7532008-10-05 19:44:25 +0000668 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000669 }
670 virtual void getTargetDefines(std::vector<char> &Defines) const {
671 X86_64TargetInfo::getTargetDefines(Defines);
672 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000673 }
674};
675} // end anonymous namespace
676
677namespace {
Eli Friedman3fd920a2008-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 Lattnerb3793bb2008-09-30 01:00:25 +0000686 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000687 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000688
Chris Lattnerc7c6dd42008-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 Lattner5ba61f02006-10-14 07:39:34 +0000695};
696} // end anonymous namespace.
697
Chris Lattner17df24e2008-04-21 18:56:49 +0000698namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000699class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000700public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000701 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
702 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-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 Friedmanb5366062008-05-20 14:21:01 +0000705 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000706 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000707 getARMDefines(Defines);
708 }
709 virtual void getTargetBuiltins(const Builtin::Info *&Records,
710 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000711 // FIXME: Implement.
712 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000713 NumRecords = 0;
714 }
715 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000716 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000717 }
718 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000719 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000720 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000721 virtual void getGCCRegNames(const char * const *&Names,
722 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000723 // FIXME: Implement.
724 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000725 NumNames = 0;
726 }
727 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
728 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000729 // FIXME: Implement.
730 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000731 NumAliases = 0;
732 }
733 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000734 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000735 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000736 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000737 default:
Nate Begeman2908fa02008-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 Lattner17df24e2008-04-21 18:56:49 +0000745 return false;
746 }
747 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000748 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000749 return "";
750 }
751};
752} // end anonymous namespace.
753
Eli Friedmanf05b7722008-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 Lattnerb3793bb2008-09-30 01:00:25 +0000762 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000763 }
764};
765} // end anonymous namespace.
766
Chris Lattner5ba61f02006-10-14 07:39:34 +0000767namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000768class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000769public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000770 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
771 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-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 Friedmanda8f5a92008-08-20 07:28:14 +0000774 }
Gabor Greif49991682008-02-21 16:29:08 +0000775 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-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 Greif49991682008-02-21 16:29:08 +0000778 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000779 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000780 Define(Defines, "__sparcv8");
781 }
782 virtual void getTargetBuiltins(const Builtin::Info *&Records,
783 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000784 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000785 }
786 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000787 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000788 }
789 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000790 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000791 }
792 virtual void getGCCRegNames(const char * const *&Names,
793 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000794 // FIXME: Implement!
795 Names = 0;
796 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000797 }
798 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
799 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000800 // FIXME: Implement!
801 Aliases = 0;
802 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000803 }
804 virtual bool validateAsmConstraint(char c,
805 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000806 // FIXME: Implement!
807 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000808 }
809 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000810 // FIXME: Implement!
811 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000812 }
813};
814
815} // end anonymous namespace.
816
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000817namespace {
818class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
819public:
820 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +0000821 SparcV8TargetInfo(triple) {
822 SizeType = UnsignedInt;
823 PtrDiffType = SignedInt;
824 }
Eli Friedmanda8f5a92008-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 Lattner5ba61f02006-10-14 07:39:34 +0000832
Chris Lattnerb781dc792008-05-08 05:58:21 +0000833namespace {
834 class PIC16TargetInfo : public TargetInfo{
835 public:
836 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptad7959242008-10-31 09:52:39 +0000837 IntWidth = 16;
838 LongWidth = LongLongWidth = 32;
839 PointerWidth = 16;
840 IntAlign = 8;
841 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +0000842 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +0000843 SizeType = UnsignedInt;
844 IntMaxType = SignedLong;
845 UIntMaxType = UnsignedLong;
Eli Friedmand50881c2008-11-02 02:43:55 +0000846 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000847 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000848 }
Chris Lattner5e2ef0c2008-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 Lattnerb781dc792008-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 Lattner5ba61f02006-10-14 07:39:34 +0000871//===----------------------------------------------------------------------===//
872// Driver code
873//===----------------------------------------------------------------------===//
874
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000875static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-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 Lattner855d0242008-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 Friedman873f65a2008-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 Lattner5637ef52008-08-23 18:23:14 +0000886 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000887 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-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 Friedmanb5366062008-05-20 14:21:01 +0000893
Eli Friedman873f65a2008-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 Friedmanb5366062008-05-20 14:21:01 +0000899
Eli Friedman873f65a2008-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 Lattner17df24e2008-04-21 18:56:49 +0000905
Eli Friedman873f65a2008-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 Friedmanb5366062008-05-20 14:21:01 +0000911
Eli Friedman873f65a2008-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 Dunbard0921de2008-09-23 17:37:57 +0000921 if (isLinux)
922 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000923 if (isFreeBSD)
924 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000925 return new X86_64TargetInfo(T);
926 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000927
Chris Lattnerb781dc792008-05-08 05:58:21 +0000928 if (T.find("pic16-") == 0)
929 return new PIC16TargetInfo(T);
930
Eli Friedman873f65a2008-08-21 00:13:15 +0000931 if (IsX86(T)) {
932 if (isDarwin)
933 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000934 if (isLinux)
935 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000936 if (isDragonFly)
937 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000938 if (isFreeBSD)
939 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000940 if (isWindows)
941 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000942 return new X86_32TargetInfo(T);
943 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000944
Chris Lattner855d0242008-03-05 01:18:20 +0000945 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000946}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000947