blob: 6973ec51d25e2576de5149c49cd82c254b85db4a [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
Douglas Gregor9eebd972009-02-16 21:58:21 +000015// FIXME: Layering violation
Chris Lattner10a5b382007-01-29 05:24:35 +000016#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000017#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000018#include "clang/Basic/TargetInfo.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000019#include "clang/Basic/LangOptions.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000020#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000021#include "llvm/ADT/APFloat.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000022using namespace clang;
23
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000025// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000026//===----------------------------------------------------------------------===//
27
Chris Lattnerb2d486a2007-10-06 06:57:34 +000028static void Define(std::vector<char> &Buf, const char *Macro,
29 const char *Val = "1") {
30 const char *Def = "#define ";
31 Buf.insert(Buf.end(), Def, Def+strlen(Def));
32 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
33 Buf.push_back(' ');
34 Buf.insert(Buf.end(), Val, Val+strlen(Val));
35 Buf.push_back('\n');
36}
37
Chris Lattner09d98f52008-10-05 21:50:58 +000038//===----------------------------------------------------------------------===//
39// Defines specific to certain operating systems.
40//===----------------------------------------------------------------------===//
41
Eli Friedmanda8f5a92008-08-20 07:28:14 +000042static void getSolarisDefines(std::vector<char> &Defs) {
43 Define(Defs, "__SUN__");
44 Define(Defs, "__SOLARIS__");
45}
Chris Lattner5ba61f02006-10-14 07:39:34 +000046
Nate Begeman95439102009-01-18 01:08:03 +000047static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit,
48 const char *Triple) {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000049 // FreeBSD defines; list based off of gcc output
50
51 const char *FreeBSD = strstr(Triple, "-freebsd");
52 FreeBSD += strlen("-freebsd");
53 char release[] = "X";
54 release[0] = FreeBSD[0];
55 char version[] = "X00001";
56 version[0] = FreeBSD[0];
57
58 Define(Defs, "__FreeBSD__", release);
59 Define(Defs, "__FreeBSD_cc_version", version);
60 Define(Defs, "__KPRINTF_ATTRIBUTE__");
61 Define(Defs, "unix");
Anton Korobeynikov7e965952009-02-14 16:42:50 +000062 Define(Defs, "__ELF__", "1");
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000063 if (is64Bit) {
64 Define(Defs, "__LP64__");
65 }
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068static void getDragonFlyDefines(std::vector<char> &Defs) {
69 // DragonFly defines; list based off of gcc output
70 Define(Defs, "__DragonFly__");
71 Define(Defs, "__DragonFly_cc_version", "100001");
72 Define(Defs, "__ELF__");
73 Define(Defs, "__KPRINTF_ATTRIBUTE__");
74 Define(Defs, "__tune_i386__");
75 Define(Defs, "unix");
76 Define(Defs, "__unix");
77 Define(Defs, "__unix__");
78}
79
80static void getLinuxDefines(std::vector<char> &Defs) {
81 // Linux defines; list based off of gcc output
82 Define(Defs, "__unix__");
83 Define(Defs, "__unix");
84 Define(Defs, "unix");
85 Define(Defs, "__linux__");
86 Define(Defs, "__linux");
87 Define(Defs, "linux");
88 Define(Defs, "__gnu_linux__");
Argyrios Kyrtzidisd831cac2009-02-14 15:02:45 +000089 Define(Defs, "__ELF__", "1");
Chris Lattner09d98f52008-10-05 21:50:58 +000090}
91
Chris Lattner2ca529c2008-12-04 23:20:07 +000092/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
93/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
94/// not defined, return 0's. Return true if we have -darwin in the string or
95/// false otherwise.
96static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
97 Maj = Min = 0;
98 const char *Darwin = strstr(Triple, "-darwin");
99 if (Darwin == 0) return false;
100
101 Darwin += strlen("-darwin");
102 if (Darwin[0] < '0' || Darwin[0] > '9')
103 return true;
104
105 Maj = Darwin[0]-'0';
106 ++Darwin;
107
108 // Handle "darwin11".
109 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
110 Maj = 10+Darwin[0]-'0';
111 ++Darwin;
112 }
113
114 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
115 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
116 Darwin[2] == '\0')
117 Min = Darwin[1]-'0';
118
119 return true;
120}
121
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000122static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000123 Define(Defs, "__APPLE__");
124 Define(Defs, "__MACH__");
Chris Lattner81813122009-02-05 07:19:24 +0000125 Define(Defs, "OBJC_NEW_PROPERTIES");
126
127 // FIXME: OBJC_ZEROCOST_EXCEPTIONS when using zero cost eh.
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000128
129 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattner2ca529c2008-12-04 23:20:07 +0000130 unsigned Maj, Min;
131 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattner97d74942008-09-30 20:30:12 +0000132 char DarwinStr[] = "1000";
Chris Lattner2ca529c2008-12-04 23:20:07 +0000133 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
134 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
135 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000136 }
Chris Lattner2ca529c2008-12-04 23:20:07 +0000137
138 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
139 DarwinStr[3] = Min+'0';
Chris Lattner97d74942008-09-30 20:30:12 +0000140 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000141 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000142}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000143
Chris Lattner2ca529c2008-12-04 23:20:07 +0000144/// GetDarwinLanguageOptions - Set the default language options for darwin.
145static void GetDarwinLanguageOptions(LangOptions &Opts,
146 const char *Triple) {
147 Opts.NeXTRuntime = true;
148
149 unsigned Maj, Min;
150 if (!getDarwinNumber(Triple, Maj, Min))
151 return;
152
153 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahanian13de2532009-02-12 17:54:33 +0000154 // As does nonfragile-abi for 64bit mode
Fariborz Jahanian240f2b72009-02-24 23:34:44 +0000155 if (Maj > 9)
Chris Lattner2ca529c2008-12-04 23:20:07 +0000156 Opts.Blocks = 1;
Fariborz Jahanian240f2b72009-02-24 23:34:44 +0000157
Fariborz Jahanian30b3ac52009-02-24 23:38:42 +0000158 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
159 Opts.ObjCNonFragileABI = 1;
Chris Lattner2ca529c2008-12-04 23:20:07 +0000160}
161
162
Chris Lattner09d98f52008-10-05 21:50:58 +0000163//===----------------------------------------------------------------------===//
164// Defines specific to certain architectures.
165//===----------------------------------------------------------------------===//
Eli Friedmanff594f22008-08-21 00:24:02 +0000166
Chris Lattner1f5ad112006-10-14 18:32:12 +0000167/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
168/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000169static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000170 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000171 Define(Defs, "__ppc__");
172 Define(Defs, "_ARCH_PPC");
173 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000174 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000175 Define(Defs, "_ARCH_PPC64");
176 Define(Defs, "_LP64");
177 Define(Defs, "__LP64__");
178 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000179 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000180 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000181 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000182
Chris Lattner9c837532006-10-15 01:05:46 +0000183 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000184 Define(Defs, "_BIG_ENDIAN");
185 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000186
Chris Lattner9c837532006-10-15 01:05:46 +0000187 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000188 Define(Defs, "__NATURAL_ALIGNMENT__");
189 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000190
Chris Lattnerac7ed9a2008-10-05 21:49:27 +0000191 // FIXME: Should be controlled by command line option.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000192 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000193}
194
195/// getX86Defines - Return a set of the X86-specific #defines that are
196/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000197static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000198 // Target identification.
199 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000200 Define(Defs, "_LP64");
201 Define(Defs, "__LP64__");
202 Define(Defs, "__amd64__");
203 Define(Defs, "__amd64");
204 Define(Defs, "__x86_64");
205 Define(Defs, "__x86_64__");
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000206 Define(Defs, "__SSE3__");
Chris Lattner9c837532006-10-15 01:05:46 +0000207 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000208 Define(Defs, "__i386__");
209 Define(Defs, "__i386");
210 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000211 }
212
213 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000214 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000215
Chris Lattner9c837532006-10-15 01:05:46 +0000216 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000217 Define(Defs, "__nocona");
218 Define(Defs, "__nocona__");
219 Define(Defs, "__tune_nocona__");
220 Define(Defs, "__SSE2_MATH__");
221 Define(Defs, "__SSE2__");
222 Define(Defs, "__SSE_MATH__");
223 Define(Defs, "__SSE__");
224 Define(Defs, "__MMX__");
225 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000226}
227
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000228/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000229/// not tied to a specific subtarget.
230static void getARMDefines(std::vector<char> &Defs) {
231 // Target identification.
232 Define(Defs, "__arm");
233 Define(Defs, "__arm__");
234
235 // Target properties.
236 Define(Defs, "__LITTLE_ENDIAN__");
237
Chris Lattner17df24e2008-04-21 18:56:49 +0000238 // Subtarget options. [hard coded to v6 for now]
239 Define(Defs, "__ARM_ARCH_6K__");
240 Define(Defs, "__ARMEL__");
241 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner17df24e2008-04-21 18:56:49 +0000242}
243
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000244//===----------------------------------------------------------------------===//
245// Specific target implementations.
246//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000247
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000248namespace {
249// PPC abstract base class
250class PPCTargetInfo : public TargetInfo {
251 static const Builtin::Info BuiltinInfo[];
252 static const char * const GCCRegNames[];
253 static const TargetInfo::GCCRegAlias GCCRegAliases[];
254
255public:
256 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
257 CharIsSigned = false;
258 }
259 virtual void getTargetBuiltins(const Builtin::Info *&Records,
260 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000261 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000262 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000263 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000264 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000265 return "typedef char* __builtin_va_list;";
266 // This is the right definition for ABI/V4: System V.4/eabi.
267 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000268 " unsigned char gpr;"
269 " unsigned char fpr;"
270 " unsigned short reserved;"
271 " void* overflow_arg_area;"
272 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000273 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000274 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000275 virtual const char *getTargetPrefix() const {
276 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000277 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000278 virtual void getGCCRegNames(const char * const *&Names,
279 unsigned &NumNames) const;
280 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
281 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000282 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000283 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000284 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000285 default: return false;
286 case 'O': // Zero
287 return true;
288 case 'b': // Base register
289 case 'f': // Floating point register
290 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
291 return true;
292 }
293 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000294 virtual const char *getClobbers() const {
295 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000296 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000297};
Anders Carlssonf511f642007-11-27 04:11:28 +0000298
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000299const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000300#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
301#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000302#include "clang/AST/PPCBuiltins.def"
303};
Chris Lattner17df24e2008-04-21 18:56:49 +0000304
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000305const char * const PPCTargetInfo::GCCRegNames[] = {
306 "0", "1", "2", "3", "4", "5", "6", "7",
307 "8", "9", "10", "11", "12", "13", "14", "15",
308 "16", "17", "18", "19", "20", "21", "22", "23",
309 "24", "25", "26", "27", "28", "29", "30", "31",
310 "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 "mq", "lr", "ctr", "ap",
315 "0", "1", "2", "3", "4", "5", "6", "7",
316 "xer",
317 "0", "1", "2", "3", "4", "5", "6", "7",
318 "8", "9", "10", "11", "12", "13", "14", "15",
319 "16", "17", "18", "19", "20", "21", "22", "23",
320 "24", "25", "26", "27", "28", "29", "30", "31",
321 "vrsave", "vscr",
322 "spe_acc", "spefscr",
323 "sfp"
324};
Chris Lattner10a5b382007-01-29 05:24:35 +0000325
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000326void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
327 unsigned &NumNames) const {
328 Names = GCCRegNames;
329 NumNames = llvm::array_lengthof(GCCRegNames);
330}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000331
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000332const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
333 // While some of these aliases do map to different registers
334 // they still share the same register name.
335 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
336 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
337 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
338 { { "cr3", "fr3", "r3", "v3"}, "3" },
339 { { "cr4", "fr4", "r4", "v4"}, "4" },
340 { { "cr5", "fr5", "r5", "v5"}, "5" },
341 { { "cr6", "fr6", "r6", "v6"}, "6" },
342 { { "cr7", "fr7", "r7", "v7"}, "7" },
343 { { "fr8", "r8", "v8"}, "8" },
344 { { "fr9", "r9", "v9"}, "9" },
345 { { "fr10", "r10", "v10"}, "10" },
346 { { "fr11", "r11", "v11"}, "11" },
347 { { "fr12", "r12", "v12"}, "12" },
348 { { "fr13", "r13", "v13"}, "13" },
349 { { "fr14", "r14", "v14"}, "14" },
350 { { "fr15", "r15", "v15"}, "15" },
351 { { "fr16", "r16", "v16"}, "16" },
352 { { "fr17", "r17", "v17"}, "17" },
353 { { "fr18", "r18", "v18"}, "18" },
354 { { "fr19", "r19", "v19"}, "19" },
355 { { "fr20", "r20", "v20"}, "20" },
356 { { "fr21", "r21", "v21"}, "21" },
357 { { "fr22", "r22", "v22"}, "22" },
358 { { "fr23", "r23", "v23"}, "23" },
359 { { "fr24", "r24", "v24"}, "24" },
360 { { "fr25", "r25", "v25"}, "25" },
361 { { "fr26", "r26", "v26"}, "26" },
362 { { "fr27", "r27", "v27"}, "27" },
363 { { "fr28", "r28", "v28"}, "28" },
364 { { "fr29", "r29", "v29"}, "29" },
365 { { "fr30", "r30", "v30"}, "30" },
366 { { "fr31", "r31", "v31"}, "31" },
367};
368
369void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
370 unsigned &NumAliases) const {
371 Aliases = GCCRegAliases;
372 NumAliases = llvm::array_lengthof(GCCRegAliases);
373}
374} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000375
Chris Lattner5ba61f02006-10-14 07:39:34 +0000376namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000377class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000378public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000379 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
380 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
381 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
382 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000383 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000384 getPowerPCDefines(Defines, false);
385 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000386};
387} // end anonymous namespace.
388
389namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000390class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000391public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000392 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000393 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000394 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
395 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000396 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000397 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000398 getPowerPCDefines(Defines, true);
399 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000400};
401} // end anonymous namespace.
402
Chris Lattner2ca529c2008-12-04 23:20:07 +0000403
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000404namespace {
405class DarwinPPCTargetInfo : public PPC32TargetInfo {
406public:
407 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
408 virtual void getTargetDefines(std::vector<char> &Defines) const {
409 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000410 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000411 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000412
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000413 /// getDefaultLangOptions - Allow the target to specify default settings for
414 /// various language options. These may be overridden by command line
415 /// options.
416 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000417 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000418 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000419};
420} // end anonymous namespace.
421
422namespace {
423class DarwinPPC64TargetInfo : public PPC64TargetInfo {
424public:
425 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
426 virtual void getTargetDefines(std::vector<char> &Defines) const {
427 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000428 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000429 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000430
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000431 /// getDefaultLangOptions - Allow the target to specify default settings for
432 /// various language options. These may be overridden by command line
433 /// options.
434 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000435 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000436 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000437};
438} // end anonymous namespace.
439
440namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000441// Namespace for x86 abstract base class
442const Builtin::Info BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000443#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
444#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedman3fd920a2008-08-20 02:34:37 +0000445#include "clang/AST/X86Builtins.def"
446};
Eli Friedmanb5366062008-05-20 14:21:01 +0000447
Eli Friedman3fd920a2008-08-20 02:34:37 +0000448const char *GCCRegNames[] = {
449 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
450 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
451 "argp", "flags", "fspr", "dirflag", "frame",
452 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
453 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
454 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
455 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
456};
457
458const TargetInfo::GCCRegAlias GCCRegAliases[] = {
459 { { "al", "ah", "eax", "rax" }, "ax" },
460 { { "bl", "bh", "ebx", "rbx" }, "bx" },
461 { { "cl", "ch", "ecx", "rcx" }, "cx" },
462 { { "dl", "dh", "edx", "rdx" }, "dx" },
463 { { "esi", "rsi" }, "si" },
464 { { "edi", "rdi" }, "di" },
465 { { "esp", "rsp" }, "sp" },
466 { { "ebp", "rbp" }, "bp" },
467};
468
469// X86 target abstract base class; x86-32 and x86-64 are very close, so
470// most of the implementation can be shared.
471class X86TargetInfo : public TargetInfo {
472public:
473 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
474 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000475 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000476 virtual void getTargetBuiltins(const Builtin::Info *&Records,
477 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000478 Records = BuiltinInfo;
479 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000480 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000481 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000482 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000483 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000484 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000485 unsigned &NumNames) const {
486 Names = GCCRegNames;
487 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000488 }
489 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
490 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000491 Aliases = GCCRegAliases;
492 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000493 }
Anders Carlsson58436352009-02-28 17:11:49 +0000494 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000495 TargetInfo::ConstraintInfo &info) const;
496 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000497 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000498 return "~{dirflag},~{fpsr},~{flags}";
499 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000500
501 virtual int HandleTargetOptions(std::string *StrArray, unsigned NumStrs,
502 std::string &ErrorReason);
Chris Lattner5ba61f02006-10-14 07:39:34 +0000503};
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000504
505/// HandleTargetOptions - Handle target-specific options like -msse2 and
506/// friends. An array of arguments is passed in: if they are all valid, this
507/// should handle them and return -1. If there is an error, the index of the
508/// invalid argument should be returned along with an optional error string.
509int X86TargetInfo::HandleTargetOptions(std::string *StrArray, unsigned NumStrs,
510 std::string &ErrorReason) {
511 if (NumStrs == 0)
512 return -1;
513 return 0;
514}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000515
516bool
Anders Carlsson58436352009-02-28 17:11:49 +0000517X86TargetInfo::validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000518 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000519 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000520 default: return false;
521 case 'a': // eax.
522 case 'b': // ebx.
523 case 'c': // ecx.
524 case 'd': // edx.
525 case 'S': // esi.
526 case 'D': // edi.
527 case 'A': // edx:eax.
528 case 't': // top of floating point stack.
529 case 'u': // second from top of floating point stack.
530 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000531 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000532 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000533 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssona0b89212009-01-24 18:03:09 +0000534 case 'e': // 32-bit signed integer constant for use with zero-extending
535 // x86_64 instructions.
536 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
537 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000538 case 'N': // unsigned 8-bit integer constant for use with in and out
539 // instructions.
540 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
541 return true;
542 }
543}
544
545std::string
546X86TargetInfo::convertConstraint(const char Constraint) const {
547 switch (Constraint) {
548 case 'a': return std::string("{ax}");
549 case 'b': return std::string("{bx}");
550 case 'c': return std::string("{cx}");
551 case 'd': return std::string("{dx}");
552 case 'S': return std::string("{si}");
553 case 'D': return std::string("{di}");
554 case 't': // top of floating point stack.
555 return std::string("{st}");
556 case 'u': // second from top of floating point stack.
557 return std::string("{st(1)}"); // second from top of floating point stack.
558 default:
559 return std::string(1, Constraint);
560 }
561}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000562} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000563
564namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000565// X86-32 generic target
566class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000567public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000568 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
569 DoubleAlign = LongLongAlign = 32;
570 LongDoubleWidth = 96;
571 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000572 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
573 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
574 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000575 }
576 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000577 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000578 }
579 virtual void getTargetDefines(std::vector<char> &Defines) const {
580 getX86Defines(Defines, false);
581 }
582};
583} // end anonymous namespace
584
585namespace {
586// x86-32 Darwin (OS X) target
587class DarwinI386TargetInfo : public X86_32TargetInfo {
588public:
589 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
590 LongDoubleWidth = 128;
591 LongDoubleAlign = 128;
Chris Lattner81813122009-02-05 07:19:24 +0000592 PtrDiffType = SignedInt;
Eli Friedman873f65a2008-08-21 00:13:15 +0000593 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
594 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
595 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000596 }
597 virtual void getTargetDefines(std::vector<char> &Defines) const {
598 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000599 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000600 }
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000601 /// getDefaultLangOptions - Allow the target to specify default settings for
602 /// various language options. These may be overridden by command line
603 /// options.
604 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000605 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000606 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000607};
608} // end anonymous namespace
609
610namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000611// x86-32 FreeBSD target
612class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
613public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000614 FreeBSDX86_32TargetInfo(const std::string& triple) :
615 X86_32TargetInfo(triple) {
616 SizeType = UnsignedInt;
617 PtrDiffType = SignedInt;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000618 }
619 virtual void getTargetDefines(std::vector<char> &Defines) const {
620 X86_32TargetInfo::getTargetDefines(Defines);
621 getFreeBSDDefines(Defines, 0, getTargetTriple());
622 }
623};
624} // end anonymous namespace
625
626namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000627// x86-32 DragonFly target
628class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
629public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000630 DragonFlyX86_32TargetInfo(const std::string& triple) :
631 X86_32TargetInfo(triple) {
632 SizeType = UnsignedInt;
633 PtrDiffType = SignedInt;
Chris Lattner5637ef52008-08-23 18:23:14 +0000634 }
635 virtual void getTargetDefines(std::vector<char> &Defines) const {
636 X86_32TargetInfo::getTargetDefines(Defines);
637 getDragonFlyDefines(Defines);
638 }
639};
640} // end anonymous namespace
641
642namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000643// x86-32 Linux target
644class LinuxX86_32TargetInfo : public X86_32TargetInfo {
645public:
646 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000647 UserLabelPrefix = "";
Eli Friedmand50881c2008-11-02 02:43:55 +0000648 SizeType = UnsignedInt;
649 PtrDiffType = SignedInt;
Chris Lattner7e4c81c2009-02-13 22:28:55 +0000650 IntPtrType = SignedInt;
Eli Friedmanff594f22008-08-21 00:24:02 +0000651 }
652 virtual void getTargetDefines(std::vector<char> &Defines) const {
653 X86_32TargetInfo::getTargetDefines(Defines);
654 getLinuxDefines(Defines);
655 }
656};
657} // end anonymous namespace
658
659namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000660// x86-32 Windows target
661class WindowsX86_32TargetInfo : public X86_32TargetInfo {
662public:
663 WindowsX86_32TargetInfo(const std::string& triple)
664 : X86_32TargetInfo(triple) {
665 // FIXME: Fix wchar_t.
666 // FIXME: We should probably enable -fms-extensions by default for
667 // this target.
Eli Friedmand50881c2008-11-02 02:43:55 +0000668 SizeType = UnsignedInt;
669 PtrDiffType = SignedInt;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000670 }
671 virtual void getTargetDefines(std::vector<char> &Defines) const {
672 X86_32TargetInfo::getTargetDefines(Defines);
673 // This list is based off of the the list of things MingW defines
674 Define(Defines, "__WIN32__");
675 Define(Defines, "__WIN32");
676 Define(Defines, "_WIN32");
677 Define(Defines, "WIN32");
678 Define(Defines, "__WINNT__");
679 Define(Defines, "__WINNT");
680 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000681 Define(Defines, "_X86_");
682 Define(Defines, "__MSVCRT__");
683 }
684};
685} // end anonymous namespace
686
687namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000688// x86-64 generic target
689class X86_64TargetInfo : public X86TargetInfo {
690public:
691 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000692 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner22ebe7b2009-01-28 06:58:19 +0000693 DoubleAlign = LongLongAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000694 LongDoubleWidth = 128;
695 LongDoubleAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000696 IntMaxType = SignedLong;
697 UIntMaxType = UnsignedLong;
698
Eli Friedman873f65a2008-08-21 00:13:15 +0000699 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
700 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
701 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000702 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000703 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000704 return "typedef struct __va_list_tag {"
705 " unsigned gp_offset;"
706 " unsigned fp_offset;"
707 " void* overflow_arg_area;"
708 " void* reg_save_area;"
709 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000710 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000711 virtual void getTargetDefines(std::vector<char> &Defines) const {
712 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000713 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000714};
715} // end anonymous namespace
716
717namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000718// x86-64 FreeBSD target
719class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
720public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000721 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000722 virtual void getTargetDefines(std::vector<char> &Defines) const {
723 X86_64TargetInfo::getTargetDefines(Defines);
724 getFreeBSDDefines(Defines, 1, getTargetTriple());
725 }
726};
727} // end anonymous namespace
728
729namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000730// x86-64 Linux target
731class LinuxX86_64TargetInfo : public X86_64TargetInfo {
732public:
733 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000734 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000735 }
736 virtual void getTargetDefines(std::vector<char> &Defines) const {
737 X86_64TargetInfo::getTargetDefines(Defines);
738 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000739 }
740};
741} // end anonymous namespace
742
743namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000744// x86-64 Darwin (OS X) target
745class DarwinX86_64TargetInfo : public X86_64TargetInfo {
746public:
747 DarwinX86_64TargetInfo(const std::string& triple) :
748 X86_64TargetInfo(triple) {}
749
750 virtual void getTargetDefines(std::vector<char> &Defines) const {
751 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000752 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000753 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000754
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000755 /// getDefaultLangOptions - Allow the target to specify default settings for
756 /// various language options. These may be overridden by command line
757 /// options.
758 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000759 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000760 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000761};
762} // end anonymous namespace.
763
Chris Lattner17df24e2008-04-21 18:56:49 +0000764namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000765class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000766public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000767 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
768 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000769 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
770 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000771 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000772 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000773 getARMDefines(Defines);
774 }
775 virtual void getTargetBuiltins(const Builtin::Info *&Records,
776 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000777 // FIXME: Implement.
778 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000779 NumRecords = 0;
780 }
781 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000782 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000783 }
784 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000785 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000786 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000787 virtual void getGCCRegNames(const char * const *&Names,
788 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000789 // FIXME: Implement.
790 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000791 NumNames = 0;
792 }
793 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
794 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000795 // FIXME: Implement.
796 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000797 NumAliases = 0;
798 }
Anders Carlsson58436352009-02-28 17:11:49 +0000799 virtual bool validateAsmConstraint(const char *&Name,
Nate Begeman2908fa02008-04-22 05:03:19 +0000800 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000801 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +0000802 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000803 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000804 case 'l': // r0-r7
805 case 'h': // r8-r15
806 case 'w': // VFP Floating point register single precision
807 case 'P': // VFP Floating point register double precision
808 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
809 return true;
810 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000811 return false;
812 }
813 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000814 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000815 return "";
816 }
817};
818} // end anonymous namespace.
819
Eli Friedmanf05b7722008-08-20 07:44:10 +0000820
821namespace {
822class DarwinARMTargetInfo : public ARMTargetInfo {
823public:
824 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
825
826 virtual void getTargetDefines(std::vector<char> &Defines) const {
827 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000828 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000829 }
830};
831} // end anonymous namespace.
832
Chris Lattner5ba61f02006-10-14 07:39:34 +0000833namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000834class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +0000835 static const TargetInfo::GCCRegAlias GCCRegAliases[];
836 static const char * const GCCRegNames[];
Gabor Greif49991682008-02-21 16:29:08 +0000837public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000838 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
839 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000840 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
841 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000842 }
Gabor Greif49991682008-02-21 16:29:08 +0000843 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000844 // FIXME: This is missing a lot of important defines; some of the
845 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000846 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000847 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000848 Define(Defines, "__sparcv8");
849 }
850 virtual void getTargetBuiltins(const Builtin::Info *&Records,
851 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000852 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000853 }
854 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000855 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000856 }
857 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000858 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000859 }
860 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +0000861 unsigned &NumNames) const;
Gabor Greif49991682008-02-21 16:29:08 +0000862 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +0000863 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000864 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +0000865 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000866 // FIXME: Implement!
867 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000868 }
869 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000870 // FIXME: Implement!
871 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000872 }
873};
874
Chris Lattner9b415d62009-01-27 01:58:38 +0000875const char * const SparcV8TargetInfo::GCCRegNames[] = {
876 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
877 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
878 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
879 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
880};
881
882void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
883 unsigned &NumNames) const {
884 Names = GCCRegNames;
885 NumNames = llvm::array_lengthof(GCCRegNames);
886}
887
888const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
889 { { "g0" }, "r0" },
890 { { "g1" }, "r1" },
891 { { "g2" }, "r2" },
892 { { "g3" }, "r3" },
893 { { "g4" }, "r4" },
894 { { "g5" }, "r5" },
895 { { "g6" }, "r6" },
896 { { "g7" }, "r7" },
897 { { "o0" }, "r8" },
898 { { "o1" }, "r9" },
899 { { "o2" }, "r10" },
900 { { "o3" }, "r11" },
901 { { "o4" }, "r12" },
902 { { "o5" }, "r13" },
903 { { "o6", "sp" }, "r14" },
904 { { "o7" }, "r15" },
905 { { "l0" }, "r16" },
906 { { "l1" }, "r17" },
907 { { "l2" }, "r18" },
908 { { "l3" }, "r19" },
909 { { "l4" }, "r20" },
910 { { "l5" }, "r21" },
911 { { "l6" }, "r22" },
912 { { "l7" }, "r23" },
913 { { "i0" }, "r24" },
914 { { "i1" }, "r25" },
915 { { "i2" }, "r26" },
916 { { "i3" }, "r27" },
917 { { "i4" }, "r28" },
918 { { "i5" }, "r29" },
919 { { "i6", "fp" }, "r30" },
920 { { "i7" }, "r31" },
921};
922
923void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
924 unsigned &NumAliases) const {
925 Aliases = GCCRegAliases;
926 NumAliases = llvm::array_lengthof(GCCRegAliases);
927}
Gabor Greif49991682008-02-21 16:29:08 +0000928} // end anonymous namespace.
929
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000930namespace {
931class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
932public:
933 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +0000934 SparcV8TargetInfo(triple) {
935 SizeType = UnsignedInt;
936 PtrDiffType = SignedInt;
937 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000938
939 virtual void getTargetDefines(std::vector<char> &Defines) const {
940 SparcV8TargetInfo::getTargetDefines(Defines);
941 getSolarisDefines(Defines);
942 }
943};
944} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000945
Chris Lattnerb781dc792008-05-08 05:58:21 +0000946namespace {
947 class PIC16TargetInfo : public TargetInfo{
948 public:
949 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptad7959242008-10-31 09:52:39 +0000950 IntWidth = 16;
951 LongWidth = LongLongWidth = 32;
952 PointerWidth = 16;
953 IntAlign = 8;
954 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +0000955 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +0000956 SizeType = UnsignedInt;
957 IntMaxType = SignedLong;
958 UIntMaxType = UnsignedLong;
Chris Lattner7e4c81c2009-02-13 22:28:55 +0000959 IntPtrType = SignedShort;
Eli Friedmand50881c2008-11-02 02:43:55 +0000960 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000961 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000962 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000963 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
964 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000965 virtual void getTargetDefines(std::vector<char> &Defines) const {
966 Define(Defines, "__pic16");
967 }
968 virtual void getTargetBuiltins(const Builtin::Info *&Records,
969 unsigned &NumRecords) const {}
970 virtual const char *getVAListDeclaration() const { return "";}
971 virtual const char *getClobbers() const {return "";}
972 virtual const char *getTargetPrefix() const {return "";}
973 virtual void getGCCRegNames(const char * const *&Names,
974 unsigned &NumNames) const {}
Anders Carlsson58436352009-02-28 17:11:49 +0000975 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerb781dc792008-05-08 05:58:21 +0000976 TargetInfo::ConstraintInfo &info) const {
977 return true;
978 }
979 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
980 unsigned &NumAliases) const {}
981 virtual bool useGlobalsForAutomaticVariables() const {return true;}
982 };
983}
984
Chris Lattner5ba61f02006-10-14 07:39:34 +0000985//===----------------------------------------------------------------------===//
986// Driver code
987//===----------------------------------------------------------------------===//
988
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000989static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000990 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
991 TT[4] == '-' && TT[1] - '3' < 6);
992}
993
Chris Lattner855d0242008-03-05 01:18:20 +0000994/// CreateTargetInfo - Return the target info object for the specified target
995/// triple.
996TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000997 // OS detection; this isn't really anywhere near complete.
998 // Additions and corrections are welcome.
999 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +00001000 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001001 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +00001002 bool isSolaris = T.find("-solaris") != std::string::npos;
1003 bool isLinux = T.find("-linux") != std::string::npos;
1004 bool isWindows = T.find("-windows") != std::string::npos ||
1005 T.find("-win32") != std::string::npos ||
1006 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +00001007
Eli Friedman873f65a2008-08-21 00:13:15 +00001008 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1009 if (isDarwin)
1010 return new DarwinPPCTargetInfo(T);
1011 return new PPC32TargetInfo(T);
1012 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001013
Eli Friedman873f65a2008-08-21 00:13:15 +00001014 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1015 if (isDarwin)
1016 return new DarwinPPC64TargetInfo(T);
1017 return new PPC64TargetInfo(T);
1018 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001019
Eli Friedman873f65a2008-08-21 00:13:15 +00001020 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
1021 if (isDarwin)
1022 return new DarwinARMTargetInfo(T);
1023 return new ARMTargetInfo(T);
1024 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001025
Eli Friedman873f65a2008-08-21 00:13:15 +00001026 if (T.find("sparc-") == 0) {
1027 if (isSolaris)
1028 return new SolarisSparcV8TargetInfo(T);
1029 return new SparcV8TargetInfo(T);
1030 }
1031
Chris Lattnerd0b80c82009-02-20 17:04:14 +00001032 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001033 if (isDarwin)
1034 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001035 if (isLinux)
1036 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001037 if (isFreeBSD)
1038 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001039 return new X86_64TargetInfo(T);
1040 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001041
Chris Lattnerb781dc792008-05-08 05:58:21 +00001042 if (T.find("pic16-") == 0)
1043 return new PIC16TargetInfo(T);
1044
Eli Friedman873f65a2008-08-21 00:13:15 +00001045 if (IsX86(T)) {
1046 if (isDarwin)
1047 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001048 if (isLinux)
1049 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001050 if (isDragonFly)
1051 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001052 if (isFreeBSD)
1053 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001054 if (isWindows)
1055 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001056 return new X86_32TargetInfo(T);
1057 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001058
Chris Lattner855d0242008-03-05 01:18:20 +00001059 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001060}
Ted Kremenekc490bdb2008-03-04 17:47:18 +00001061