blob: c1974be37623e5613465978bdad61d2c98c27e60 [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 Lattner2ca529c2008-12-04 23:20:07 +000089/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
90/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
91/// not defined, return 0's. Return true if we have -darwin in the string or
92/// false otherwise.
93static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
94 Maj = Min = 0;
95 const char *Darwin = strstr(Triple, "-darwin");
96 if (Darwin == 0) return false;
97
98 Darwin += strlen("-darwin");
99 if (Darwin[0] < '0' || Darwin[0] > '9')
100 return true;
101
102 Maj = Darwin[0]-'0';
103 ++Darwin;
104
105 // Handle "darwin11".
106 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
107 Maj = 10+Darwin[0]-'0';
108 ++Darwin;
109 }
110
111 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
112 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
113 Darwin[2] == '\0')
114 Min = Darwin[1]-'0';
115
116 return true;
117}
118
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000119static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000120 Define(Defs, "__APPLE__");
121 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000122
123 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattner2ca529c2008-12-04 23:20:07 +0000124 unsigned Maj, Min;
125 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattner97d74942008-09-30 20:30:12 +0000126 char DarwinStr[] = "1000";
Chris Lattner2ca529c2008-12-04 23:20:07 +0000127 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
128 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
129 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000130 }
Chris Lattner2ca529c2008-12-04 23:20:07 +0000131
132 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
133 DarwinStr[3] = Min+'0';
Chris Lattner97d74942008-09-30 20:30:12 +0000134 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000135 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000136}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000137
Chris Lattner2ca529c2008-12-04 23:20:07 +0000138/// GetDarwinLanguageOptions - Set the default language options for darwin.
139static void GetDarwinLanguageOptions(LangOptions &Opts,
140 const char *Triple) {
141 Opts.NeXTRuntime = true;
142
143 unsigned Maj, Min;
144 if (!getDarwinNumber(Triple, Maj, Min))
145 return;
146
147 // Blocks default to on for 10.6 (darwin10) and beyond.
148 if (Maj > 9)
149 Opts.Blocks = 1;
150}
151
152
Chris Lattner09d98f52008-10-05 21:50:58 +0000153//===----------------------------------------------------------------------===//
154// Defines specific to certain architectures.
155//===----------------------------------------------------------------------===//
Eli Friedmanff594f22008-08-21 00:24:02 +0000156
Chris Lattner1f5ad112006-10-14 18:32:12 +0000157/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
158/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000159static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000160 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000161 Define(Defs, "__ppc__");
162 Define(Defs, "_ARCH_PPC");
163 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000164 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000165 Define(Defs, "_ARCH_PPC64");
166 Define(Defs, "_LP64");
167 Define(Defs, "__LP64__");
168 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000169 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000170 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000171 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000172
Chris Lattner9c837532006-10-15 01:05:46 +0000173 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000174 Define(Defs, "_BIG_ENDIAN");
175 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000176
Chris Lattner9c837532006-10-15 01:05:46 +0000177 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000178 Define(Defs, "__NATURAL_ALIGNMENT__");
179 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000180
Chris Lattnerac7ed9a2008-10-05 21:49:27 +0000181 // FIXME: Should be controlled by command line option.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000182 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000183}
184
185/// getX86Defines - Return a set of the X86-specific #defines that are
186/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000187static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000188 // Target identification.
189 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000190 Define(Defs, "_LP64");
191 Define(Defs, "__LP64__");
192 Define(Defs, "__amd64__");
193 Define(Defs, "__amd64");
194 Define(Defs, "__x86_64");
195 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000196 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000197 Define(Defs, "__i386__");
198 Define(Defs, "__i386");
199 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000200 }
201
202 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000203 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000204
Chris Lattner9c837532006-10-15 01:05:46 +0000205 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000206 Define(Defs, "__nocona");
207 Define(Defs, "__nocona__");
208 Define(Defs, "__tune_nocona__");
209 Define(Defs, "__SSE2_MATH__");
210 Define(Defs, "__SSE2__");
211 Define(Defs, "__SSE_MATH__");
212 Define(Defs, "__SSE__");
213 Define(Defs, "__MMX__");
214 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000215}
216
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000217/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000218/// not tied to a specific subtarget.
219static void getARMDefines(std::vector<char> &Defs) {
220 // Target identification.
221 Define(Defs, "__arm");
222 Define(Defs, "__arm__");
223
224 // Target properties.
225 Define(Defs, "__LITTLE_ENDIAN__");
226
Chris Lattner17df24e2008-04-21 18:56:49 +0000227 // Subtarget options. [hard coded to v6 for now]
228 Define(Defs, "__ARM_ARCH_6K__");
229 Define(Defs, "__ARMEL__");
230 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner17df24e2008-04-21 18:56:49 +0000231}
232
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000233//===----------------------------------------------------------------------===//
234// Specific target implementations.
235//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000236
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000237namespace {
238// PPC abstract base class
239class PPCTargetInfo : public TargetInfo {
240 static const Builtin::Info BuiltinInfo[];
241 static const char * const GCCRegNames[];
242 static const TargetInfo::GCCRegAlias GCCRegAliases[];
243
244public:
245 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
246 CharIsSigned = false;
247 }
248 virtual void getTargetBuiltins(const Builtin::Info *&Records,
249 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000250 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000251 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000252 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000253 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000254 return "typedef char* __builtin_va_list;";
255 // This is the right definition for ABI/V4: System V.4/eabi.
256 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000257 " unsigned char gpr;"
258 " unsigned char fpr;"
259 " unsigned short reserved;"
260 " void* overflow_arg_area;"
261 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000262 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000263 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000264 virtual const char *getTargetPrefix() const {
265 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000266 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000267 virtual void getGCCRegNames(const char * const *&Names,
268 unsigned &NumNames) const;
269 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
270 unsigned &NumAliases) const;
271 virtual bool validateAsmConstraint(char c,
272 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000273 switch (c) {
274 default: return false;
275 case 'O': // Zero
276 return true;
277 case 'b': // Base register
278 case 'f': // Floating point register
279 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
280 return true;
281 }
282 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000283 virtual const char *getClobbers() const {
284 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000285 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000286};
Anders Carlssonf511f642007-11-27 04:11:28 +0000287
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000288const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
289#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
290#include "clang/AST/PPCBuiltins.def"
291};
Chris Lattner17df24e2008-04-21 18:56:49 +0000292
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000293const char * const PPCTargetInfo::GCCRegNames[] = {
294 "0", "1", "2", "3", "4", "5", "6", "7",
295 "8", "9", "10", "11", "12", "13", "14", "15",
296 "16", "17", "18", "19", "20", "21", "22", "23",
297 "24", "25", "26", "27", "28", "29", "30", "31",
298 "0", "1", "2", "3", "4", "5", "6", "7",
299 "8", "9", "10", "11", "12", "13", "14", "15",
300 "16", "17", "18", "19", "20", "21", "22", "23",
301 "24", "25", "26", "27", "28", "29", "30", "31",
302 "mq", "lr", "ctr", "ap",
303 "0", "1", "2", "3", "4", "5", "6", "7",
304 "xer",
305 "0", "1", "2", "3", "4", "5", "6", "7",
306 "8", "9", "10", "11", "12", "13", "14", "15",
307 "16", "17", "18", "19", "20", "21", "22", "23",
308 "24", "25", "26", "27", "28", "29", "30", "31",
309 "vrsave", "vscr",
310 "spe_acc", "spefscr",
311 "sfp"
312};
Chris Lattner10a5b382007-01-29 05:24:35 +0000313
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000314void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
315 unsigned &NumNames) const {
316 Names = GCCRegNames;
317 NumNames = llvm::array_lengthof(GCCRegNames);
318}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000319
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000320const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
321 // While some of these aliases do map to different registers
322 // they still share the same register name.
323 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
324 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
325 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
326 { { "cr3", "fr3", "r3", "v3"}, "3" },
327 { { "cr4", "fr4", "r4", "v4"}, "4" },
328 { { "cr5", "fr5", "r5", "v5"}, "5" },
329 { { "cr6", "fr6", "r6", "v6"}, "6" },
330 { { "cr7", "fr7", "r7", "v7"}, "7" },
331 { { "fr8", "r8", "v8"}, "8" },
332 { { "fr9", "r9", "v9"}, "9" },
333 { { "fr10", "r10", "v10"}, "10" },
334 { { "fr11", "r11", "v11"}, "11" },
335 { { "fr12", "r12", "v12"}, "12" },
336 { { "fr13", "r13", "v13"}, "13" },
337 { { "fr14", "r14", "v14"}, "14" },
338 { { "fr15", "r15", "v15"}, "15" },
339 { { "fr16", "r16", "v16"}, "16" },
340 { { "fr17", "r17", "v17"}, "17" },
341 { { "fr18", "r18", "v18"}, "18" },
342 { { "fr19", "r19", "v19"}, "19" },
343 { { "fr20", "r20", "v20"}, "20" },
344 { { "fr21", "r21", "v21"}, "21" },
345 { { "fr22", "r22", "v22"}, "22" },
346 { { "fr23", "r23", "v23"}, "23" },
347 { { "fr24", "r24", "v24"}, "24" },
348 { { "fr25", "r25", "v25"}, "25" },
349 { { "fr26", "r26", "v26"}, "26" },
350 { { "fr27", "r27", "v27"}, "27" },
351 { { "fr28", "r28", "v28"}, "28" },
352 { { "fr29", "r29", "v29"}, "29" },
353 { { "fr30", "r30", "v30"}, "30" },
354 { { "fr31", "r31", "v31"}, "31" },
355};
356
357void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
358 unsigned &NumAliases) const {
359 Aliases = GCCRegAliases;
360 NumAliases = llvm::array_lengthof(GCCRegAliases);
361}
362} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000363
Chris Lattner5ba61f02006-10-14 07:39:34 +0000364namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000365class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000366public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000367 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
368 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
369 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
370 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000371 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000372 getPowerPCDefines(Defines, false);
373 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000374};
375} // end anonymous namespace.
376
377namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000378class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000379public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000380 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000381 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000382 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
383 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000384 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000385 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000386 getPowerPCDefines(Defines, true);
387 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000388};
389} // end anonymous namespace.
390
Chris Lattner2ca529c2008-12-04 23:20:07 +0000391
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000392namespace {
393class DarwinPPCTargetInfo : public PPC32TargetInfo {
394public:
395 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
396 virtual void getTargetDefines(std::vector<char> &Defines) const {
397 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000398 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000399 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000400
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000401 /// getDefaultLangOptions - Allow the target to specify default settings for
402 /// various language options. These may be overridden by command line
403 /// options.
404 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000405 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000406 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000407};
408} // end anonymous namespace.
409
410namespace {
411class DarwinPPC64TargetInfo : public PPC64TargetInfo {
412public:
413 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
414 virtual void getTargetDefines(std::vector<char> &Defines) const {
415 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000416 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000417 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000418
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000419 /// getDefaultLangOptions - Allow the target to specify default settings for
420 /// various language options. These may be overridden by command line
421 /// options.
422 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000423 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000424 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000425};
426} // end anonymous namespace.
427
428namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000429// Namespace for x86 abstract base class
430const Builtin::Info BuiltinInfo[] = {
431#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
432#include "clang/AST/X86Builtins.def"
433};
Eli Friedmanb5366062008-05-20 14:21:01 +0000434
Eli Friedman3fd920a2008-08-20 02:34:37 +0000435const char *GCCRegNames[] = {
436 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
437 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
438 "argp", "flags", "fspr", "dirflag", "frame",
439 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
440 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
441 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
442 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
443};
444
445const TargetInfo::GCCRegAlias GCCRegAliases[] = {
446 { { "al", "ah", "eax", "rax" }, "ax" },
447 { { "bl", "bh", "ebx", "rbx" }, "bx" },
448 { { "cl", "ch", "ecx", "rcx" }, "cx" },
449 { { "dl", "dh", "edx", "rdx" }, "dx" },
450 { { "esi", "rsi" }, "si" },
451 { { "edi", "rdi" }, "di" },
452 { { "esp", "rsp" }, "sp" },
453 { { "ebp", "rbp" }, "bp" },
454};
455
456// X86 target abstract base class; x86-32 and x86-64 are very close, so
457// most of the implementation can be shared.
458class X86TargetInfo : public TargetInfo {
459public:
460 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
461 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000462 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000463 virtual void getTargetBuiltins(const Builtin::Info *&Records,
464 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000465 Records = BuiltinInfo;
466 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000467 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000468 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000469 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000470 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000471 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000472 unsigned &NumNames) const {
473 Names = GCCRegNames;
474 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000475 }
476 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
477 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000478 Aliases = GCCRegAliases;
479 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000480 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000481 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000482 TargetInfo::ConstraintInfo &info) const;
483 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000484 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000485 return "~{dirflag},~{fpsr},~{flags}";
486 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000487};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000488
489bool
490X86TargetInfo::validateAsmConstraint(char c,
491 TargetInfo::ConstraintInfo &info) const {
492 switch (c) {
493 default: return false;
494 case 'a': // eax.
495 case 'b': // ebx.
496 case 'c': // ecx.
497 case 'd': // edx.
498 case 'S': // esi.
499 case 'D': // edi.
500 case 'A': // edx:eax.
501 case 't': // top of floating point stack.
502 case 'u': // second from top of floating point stack.
503 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000504 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000505 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000506 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
507 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
508 // instructions.
509 case 'N': // unsigned 8-bit integer constant for use with in and out
510 // instructions.
511 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
512 return true;
513 }
514}
515
516std::string
517X86TargetInfo::convertConstraint(const char Constraint) const {
518 switch (Constraint) {
519 case 'a': return std::string("{ax}");
520 case 'b': return std::string("{bx}");
521 case 'c': return std::string("{cx}");
522 case 'd': return std::string("{dx}");
523 case 'S': return std::string("{si}");
524 case 'D': return std::string("{di}");
525 case 't': // top of floating point stack.
526 return std::string("{st}");
527 case 'u': // second from top of floating point stack.
528 return std::string("{st(1)}"); // second from top of floating point stack.
529 default:
530 return std::string(1, Constraint);
531 }
532}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000533} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000534
535namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000536// X86-32 generic target
537class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000538public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000539 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
540 DoubleAlign = LongLongAlign = 32;
541 LongDoubleWidth = 96;
542 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000543 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
544 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
545 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000546 }
547 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000548 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000549 }
550 virtual void getTargetDefines(std::vector<char> &Defines) const {
551 getX86Defines(Defines, false);
552 }
553};
554} // end anonymous namespace
555
556namespace {
557// x86-32 Darwin (OS X) target
558class DarwinI386TargetInfo : public X86_32TargetInfo {
559public:
560 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
561 LongDoubleWidth = 128;
562 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000563 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
564 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
565 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000566 }
567 virtual void getTargetDefines(std::vector<char> &Defines) const {
568 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000569 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000570 }
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000571 /// getDefaultLangOptions - Allow the target to specify default settings for
572 /// various language options. These may be overridden by command line
573 /// options.
574 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000575 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000576 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000577};
578} // end anonymous namespace
579
580namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000581// x86-32 FreeBSD target
582class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
583public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000584 FreeBSDX86_32TargetInfo(const std::string& triple) :
585 X86_32TargetInfo(triple) {
586 SizeType = UnsignedInt;
587 PtrDiffType = SignedInt;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000588 }
589 virtual void getTargetDefines(std::vector<char> &Defines) const {
590 X86_32TargetInfo::getTargetDefines(Defines);
591 getFreeBSDDefines(Defines, 0, getTargetTriple());
592 }
593};
594} // end anonymous namespace
595
596namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000597// x86-32 DragonFly target
598class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
599public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000600 DragonFlyX86_32TargetInfo(const std::string& triple) :
601 X86_32TargetInfo(triple) {
602 SizeType = UnsignedInt;
603 PtrDiffType = SignedInt;
Chris Lattner5637ef52008-08-23 18:23:14 +0000604 }
605 virtual void getTargetDefines(std::vector<char> &Defines) const {
606 X86_32TargetInfo::getTargetDefines(Defines);
607 getDragonFlyDefines(Defines);
608 }
609};
610} // end anonymous namespace
611
612namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000613// x86-32 Linux target
614class LinuxX86_32TargetInfo : public X86_32TargetInfo {
615public:
616 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000617 UserLabelPrefix = "";
Eli Friedmand50881c2008-11-02 02:43:55 +0000618 SizeType = UnsignedInt;
619 PtrDiffType = SignedInt;
Eli Friedmanff594f22008-08-21 00:24:02 +0000620 }
621 virtual void getTargetDefines(std::vector<char> &Defines) const {
622 X86_32TargetInfo::getTargetDefines(Defines);
623 getLinuxDefines(Defines);
624 }
625};
626} // end anonymous namespace
627
628namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000629// x86-32 Windows target
630class WindowsX86_32TargetInfo : public X86_32TargetInfo {
631public:
632 WindowsX86_32TargetInfo(const std::string& triple)
633 : X86_32TargetInfo(triple) {
634 // FIXME: Fix wchar_t.
635 // FIXME: We should probably enable -fms-extensions by default for
636 // this target.
Eli Friedmand50881c2008-11-02 02:43:55 +0000637 SizeType = UnsignedInt;
638 PtrDiffType = SignedInt;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000639 }
640 virtual void getTargetDefines(std::vector<char> &Defines) const {
641 X86_32TargetInfo::getTargetDefines(Defines);
642 // This list is based off of the the list of things MingW defines
643 Define(Defines, "__WIN32__");
644 Define(Defines, "__WIN32");
645 Define(Defines, "_WIN32");
646 Define(Defines, "WIN32");
647 Define(Defines, "__WINNT__");
648 Define(Defines, "__WINNT");
649 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000650 Define(Defines, "_X86_");
651 Define(Defines, "__MSVCRT__");
652 }
653};
654} // end anonymous namespace
655
656namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000657// x86-64 generic target
658class X86_64TargetInfo : public X86TargetInfo {
659public:
660 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000661 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000662 LongDoubleWidth = 128;
663 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000664 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
665 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
666 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000667 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000668 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000669 return "typedef struct __va_list_tag {"
670 " unsigned gp_offset;"
671 " unsigned fp_offset;"
672 " void* overflow_arg_area;"
673 " void* reg_save_area;"
674 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000675 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000676 virtual void getTargetDefines(std::vector<char> &Defines) const {
677 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000678 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000679};
680} // end anonymous namespace
681
682namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000683// x86-64 FreeBSD target
684class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
685public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000686 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000687 virtual void getTargetDefines(std::vector<char> &Defines) const {
688 X86_64TargetInfo::getTargetDefines(Defines);
689 getFreeBSDDefines(Defines, 1, getTargetTriple());
690 }
691};
692} // end anonymous namespace
693
694namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000695// x86-64 Linux target
696class LinuxX86_64TargetInfo : public X86_64TargetInfo {
697public:
698 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000699 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000700 }
701 virtual void getTargetDefines(std::vector<char> &Defines) const {
702 X86_64TargetInfo::getTargetDefines(Defines);
703 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000704 }
705};
706} // end anonymous namespace
707
708namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000709// x86-64 Darwin (OS X) target
710class DarwinX86_64TargetInfo : public X86_64TargetInfo {
711public:
712 DarwinX86_64TargetInfo(const std::string& triple) :
713 X86_64TargetInfo(triple) {}
714
715 virtual void getTargetDefines(std::vector<char> &Defines) const {
716 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000717 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000718 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000719
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000720 /// getDefaultLangOptions - Allow the target to specify default settings for
721 /// various language options. These may be overridden by command line
722 /// options.
723 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000724 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000725 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000726};
727} // end anonymous namespace.
728
Chris Lattner17df24e2008-04-21 18:56:49 +0000729namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000730class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000731public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000732 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
733 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000734 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
735 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000736 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000737 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000738 getARMDefines(Defines);
739 }
740 virtual void getTargetBuiltins(const Builtin::Info *&Records,
741 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000742 // FIXME: Implement.
743 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000744 NumRecords = 0;
745 }
746 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000747 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000748 }
749 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000750 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000751 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000752 virtual void getGCCRegNames(const char * const *&Names,
753 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000754 // FIXME: Implement.
755 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000756 NumNames = 0;
757 }
758 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
759 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000760 // FIXME: Implement.
761 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000762 NumAliases = 0;
763 }
764 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000765 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000766 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000767 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000768 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000769 case 'l': // r0-r7
770 case 'h': // r8-r15
771 case 'w': // VFP Floating point register single precision
772 case 'P': // VFP Floating point register double precision
773 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
774 return true;
775 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000776 return false;
777 }
778 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000779 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000780 return "";
781 }
782};
783} // end anonymous namespace.
784
Eli Friedmanf05b7722008-08-20 07:44:10 +0000785
786namespace {
787class DarwinARMTargetInfo : public ARMTargetInfo {
788public:
789 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
790
791 virtual void getTargetDefines(std::vector<char> &Defines) const {
792 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000793 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000794 }
795};
796} // end anonymous namespace.
797
Chris Lattner5ba61f02006-10-14 07:39:34 +0000798namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000799class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000800public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000801 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
802 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000803 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
804 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000805 }
Gabor Greif49991682008-02-21 16:29:08 +0000806 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000807 // FIXME: This is missing a lot of important defines; some of the
808 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000809 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000810 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000811 Define(Defines, "__sparcv8");
812 }
813 virtual void getTargetBuiltins(const Builtin::Info *&Records,
814 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000815 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000816 }
817 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000818 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000819 }
820 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000821 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000822 }
823 virtual void getGCCRegNames(const char * const *&Names,
824 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000825 // FIXME: Implement!
826 Names = 0;
827 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000828 }
829 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
830 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000831 // FIXME: Implement!
832 Aliases = 0;
833 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000834 }
835 virtual bool validateAsmConstraint(char c,
836 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000837 // FIXME: Implement!
838 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000839 }
840 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000841 // FIXME: Implement!
842 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000843 }
844};
845
846} // end anonymous namespace.
847
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000848namespace {
849class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
850public:
851 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +0000852 SparcV8TargetInfo(triple) {
853 SizeType = UnsignedInt;
854 PtrDiffType = SignedInt;
855 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000856
857 virtual void getTargetDefines(std::vector<char> &Defines) const {
858 SparcV8TargetInfo::getTargetDefines(Defines);
859 getSolarisDefines(Defines);
860 }
861};
862} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000863
Chris Lattnerb781dc792008-05-08 05:58:21 +0000864namespace {
865 class PIC16TargetInfo : public TargetInfo{
866 public:
867 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptad7959242008-10-31 09:52:39 +0000868 IntWidth = 16;
869 LongWidth = LongLongWidth = 32;
870 PointerWidth = 16;
871 IntAlign = 8;
872 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +0000873 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +0000874 SizeType = UnsignedInt;
875 IntMaxType = SignedLong;
876 UIntMaxType = UnsignedLong;
Eli Friedmand50881c2008-11-02 02:43:55 +0000877 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000878 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000879 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000880 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
881 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000882 virtual void getTargetDefines(std::vector<char> &Defines) const {
883 Define(Defines, "__pic16");
884 }
885 virtual void getTargetBuiltins(const Builtin::Info *&Records,
886 unsigned &NumRecords) const {}
887 virtual const char *getVAListDeclaration() const { return "";}
888 virtual const char *getClobbers() const {return "";}
889 virtual const char *getTargetPrefix() const {return "";}
890 virtual void getGCCRegNames(const char * const *&Names,
891 unsigned &NumNames) const {}
892 virtual bool validateAsmConstraint(char c,
893 TargetInfo::ConstraintInfo &info) const {
894 return true;
895 }
896 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
897 unsigned &NumAliases) const {}
898 virtual bool useGlobalsForAutomaticVariables() const {return true;}
899 };
900}
901
Chris Lattner5ba61f02006-10-14 07:39:34 +0000902//===----------------------------------------------------------------------===//
903// Driver code
904//===----------------------------------------------------------------------===//
905
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000906static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000907 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
908 TT[4] == '-' && TT[1] - '3' < 6);
909}
910
Chris Lattner855d0242008-03-05 01:18:20 +0000911/// CreateTargetInfo - Return the target info object for the specified target
912/// triple.
913TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000914 // OS detection; this isn't really anywhere near complete.
915 // Additions and corrections are welcome.
916 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000917 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000918 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000919 bool isSolaris = T.find("-solaris") != std::string::npos;
920 bool isLinux = T.find("-linux") != std::string::npos;
921 bool isWindows = T.find("-windows") != std::string::npos ||
922 T.find("-win32") != std::string::npos ||
923 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000924
Eli Friedman873f65a2008-08-21 00:13:15 +0000925 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
926 if (isDarwin)
927 return new DarwinPPCTargetInfo(T);
928 return new PPC32TargetInfo(T);
929 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000930
Eli Friedman873f65a2008-08-21 00:13:15 +0000931 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
932 if (isDarwin)
933 return new DarwinPPC64TargetInfo(T);
934 return new PPC64TargetInfo(T);
935 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000936
Eli Friedman873f65a2008-08-21 00:13:15 +0000937 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
938 if (isDarwin)
939 return new DarwinARMTargetInfo(T);
940 return new ARMTargetInfo(T);
941 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000942
Eli Friedman873f65a2008-08-21 00:13:15 +0000943 if (T.find("sparc-") == 0) {
944 if (isSolaris)
945 return new SolarisSparcV8TargetInfo(T);
946 return new SparcV8TargetInfo(T);
947 }
948
949 if (T.find("x86_64-") == 0) {
950 if (isDarwin)
951 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000952 if (isLinux)
953 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000954 if (isFreeBSD)
955 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000956 return new X86_64TargetInfo(T);
957 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000958
Chris Lattnerb781dc792008-05-08 05:58:21 +0000959 if (T.find("pic16-") == 0)
960 return new PIC16TargetInfo(T);
961
Eli Friedman873f65a2008-08-21 00:13:15 +0000962 if (IsX86(T)) {
963 if (isDarwin)
964 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000965 if (isLinux)
966 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000967 if (isDragonFly)
968 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000969 if (isFreeBSD)
970 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000971 if (isWindows)
972 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000973 return new X86_32TargetInfo(T);
974 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000975
Chris Lattner855d0242008-03-05 01:18:20 +0000976 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000977}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000978