blob: 4128946493ee7ef8377d4489e1b910a0104959ad [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
Nate Begeman95439102009-01-18 01:08:03 +000046static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit,
47 const char *Triple) {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000048 // FreeBSD defines; list based off of gcc output
49
50 const char *FreeBSD = strstr(Triple, "-freebsd");
51 FreeBSD += strlen("-freebsd");
52 char release[] = "X";
53 release[0] = FreeBSD[0];
54 char version[] = "X00001";
55 version[0] = FreeBSD[0];
56
57 Define(Defs, "__FreeBSD__", release);
58 Define(Defs, "__FreeBSD_cc_version", version);
59 Define(Defs, "__KPRINTF_ATTRIBUTE__");
60 Define(Defs, "unix");
61 Define(Defs, "bsd");
62 if (is64Bit) {
63 Define(Defs, "__LP64__");
64 }
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067static void getDragonFlyDefines(std::vector<char> &Defs) {
68 // DragonFly defines; list based off of gcc output
69 Define(Defs, "__DragonFly__");
70 Define(Defs, "__DragonFly_cc_version", "100001");
71 Define(Defs, "__ELF__");
72 Define(Defs, "__KPRINTF_ATTRIBUTE__");
73 Define(Defs, "__tune_i386__");
74 Define(Defs, "unix");
75 Define(Defs, "__unix");
76 Define(Defs, "__unix__");
77}
78
79static void getLinuxDefines(std::vector<char> &Defs) {
80 // Linux defines; list based off of gcc output
81 Define(Defs, "__unix__");
82 Define(Defs, "__unix");
83 Define(Defs, "unix");
84 Define(Defs, "__linux__");
85 Define(Defs, "__linux");
86 Define(Defs, "linux");
87 Define(Defs, "__gnu_linux__");
88}
89
Chris Lattner2ca529c2008-12-04 23:20:07 +000090/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
91/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
92/// not defined, return 0's. Return true if we have -darwin in the string or
93/// false otherwise.
94static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
95 Maj = Min = 0;
96 const char *Darwin = strstr(Triple, "-darwin");
97 if (Darwin == 0) return false;
98
99 Darwin += strlen("-darwin");
100 if (Darwin[0] < '0' || Darwin[0] > '9')
101 return true;
102
103 Maj = Darwin[0]-'0';
104 ++Darwin;
105
106 // Handle "darwin11".
107 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
108 Maj = 10+Darwin[0]-'0';
109 ++Darwin;
110 }
111
112 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
113 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
114 Darwin[2] == '\0')
115 Min = Darwin[1]-'0';
116
117 return true;
118}
119
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000120static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000121 Define(Defs, "__APPLE__");
122 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000123
124 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattner2ca529c2008-12-04 23:20:07 +0000125 unsigned Maj, Min;
126 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattner97d74942008-09-30 20:30:12 +0000127 char DarwinStr[] = "1000";
Chris Lattner2ca529c2008-12-04 23:20:07 +0000128 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
129 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
130 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000131 }
Chris Lattner2ca529c2008-12-04 23:20:07 +0000132
133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
134 DarwinStr[3] = Min+'0';
Chris Lattner97d74942008-09-30 20:30:12 +0000135 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000136 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000137}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000138
Chris Lattner2ca529c2008-12-04 23:20:07 +0000139/// GetDarwinLanguageOptions - Set the default language options for darwin.
140static void GetDarwinLanguageOptions(LangOptions &Opts,
141 const char *Triple) {
142 Opts.NeXTRuntime = true;
143
144 unsigned Maj, Min;
145 if (!getDarwinNumber(Triple, Maj, Min))
146 return;
147
148 // Blocks default to on for 10.6 (darwin10) and beyond.
149 if (Maj > 9)
150 Opts.Blocks = 1;
151}
152
153
Chris Lattner09d98f52008-10-05 21:50:58 +0000154//===----------------------------------------------------------------------===//
155// Defines specific to certain architectures.
156//===----------------------------------------------------------------------===//
Eli Friedmanff594f22008-08-21 00:24:02 +0000157
Chris Lattner1f5ad112006-10-14 18:32:12 +0000158/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
159/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000160static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000161 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000162 Define(Defs, "__ppc__");
163 Define(Defs, "_ARCH_PPC");
164 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000165 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000166 Define(Defs, "_ARCH_PPC64");
167 Define(Defs, "_LP64");
168 Define(Defs, "__LP64__");
169 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000170 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000171 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000172 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000173
Chris Lattner9c837532006-10-15 01:05:46 +0000174 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000175 Define(Defs, "_BIG_ENDIAN");
176 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000177
Chris Lattner9c837532006-10-15 01:05:46 +0000178 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000179 Define(Defs, "__NATURAL_ALIGNMENT__");
180 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000181
Chris Lattnerac7ed9a2008-10-05 21:49:27 +0000182 // FIXME: Should be controlled by command line option.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000183 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000184}
185
186/// getX86Defines - Return a set of the X86-specific #defines that are
187/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000188static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000189 // Target identification.
190 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000191 Define(Defs, "_LP64");
192 Define(Defs, "__LP64__");
193 Define(Defs, "__amd64__");
194 Define(Defs, "__amd64");
195 Define(Defs, "__x86_64");
196 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000197 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000198 Define(Defs, "__i386__");
199 Define(Defs, "__i386");
200 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000201 }
202
203 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000204 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000205
Chris Lattner9c837532006-10-15 01:05:46 +0000206 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000207 Define(Defs, "__nocona");
208 Define(Defs, "__nocona__");
209 Define(Defs, "__tune_nocona__");
210 Define(Defs, "__SSE2_MATH__");
211 Define(Defs, "__SSE2__");
212 Define(Defs, "__SSE_MATH__");
213 Define(Defs, "__SSE__");
214 Define(Defs, "__MMX__");
215 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000216}
217
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000218/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000219/// not tied to a specific subtarget.
220static void getARMDefines(std::vector<char> &Defs) {
221 // Target identification.
222 Define(Defs, "__arm");
223 Define(Defs, "__arm__");
224
225 // Target properties.
226 Define(Defs, "__LITTLE_ENDIAN__");
227
Chris Lattner17df24e2008-04-21 18:56:49 +0000228 // Subtarget options. [hard coded to v6 for now]
229 Define(Defs, "__ARM_ARCH_6K__");
230 Define(Defs, "__ARMEL__");
231 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner17df24e2008-04-21 18:56:49 +0000232}
233
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000234//===----------------------------------------------------------------------===//
235// Specific target implementations.
236//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000237
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000238namespace {
239// PPC abstract base class
240class PPCTargetInfo : public TargetInfo {
241 static const Builtin::Info BuiltinInfo[];
242 static const char * const GCCRegNames[];
243 static const TargetInfo::GCCRegAlias GCCRegAliases[];
244
245public:
246 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
247 CharIsSigned = false;
248 }
249 virtual void getTargetBuiltins(const Builtin::Info *&Records,
250 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000251 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000252 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000253 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000254 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000255 return "typedef char* __builtin_va_list;";
256 // This is the right definition for ABI/V4: System V.4/eabi.
257 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000258 " unsigned char gpr;"
259 " unsigned char fpr;"
260 " unsigned short reserved;"
261 " void* overflow_arg_area;"
262 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000263 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000264 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000265 virtual const char *getTargetPrefix() const {
266 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000267 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000268 virtual void getGCCRegNames(const char * const *&Names,
269 unsigned &NumNames) const;
270 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
271 unsigned &NumAliases) const;
272 virtual bool validateAsmConstraint(char c,
273 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000274 switch (c) {
275 default: return false;
276 case 'O': // Zero
277 return true;
278 case 'b': // Base register
279 case 'f': // Floating point register
280 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
281 return true;
282 }
283 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000284 virtual const char *getClobbers() const {
285 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000286 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000287};
Anders Carlssonf511f642007-11-27 04:11:28 +0000288
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000289const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
290#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
291#include "clang/AST/PPCBuiltins.def"
292};
Chris Lattner17df24e2008-04-21 18:56:49 +0000293
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000294const char * const PPCTargetInfo::GCCRegNames[] = {
295 "0", "1", "2", "3", "4", "5", "6", "7",
296 "8", "9", "10", "11", "12", "13", "14", "15",
297 "16", "17", "18", "19", "20", "21", "22", "23",
298 "24", "25", "26", "27", "28", "29", "30", "31",
299 "0", "1", "2", "3", "4", "5", "6", "7",
300 "8", "9", "10", "11", "12", "13", "14", "15",
301 "16", "17", "18", "19", "20", "21", "22", "23",
302 "24", "25", "26", "27", "28", "29", "30", "31",
303 "mq", "lr", "ctr", "ap",
304 "0", "1", "2", "3", "4", "5", "6", "7",
305 "xer",
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 "vrsave", "vscr",
311 "spe_acc", "spefscr",
312 "sfp"
313};
Chris Lattner10a5b382007-01-29 05:24:35 +0000314
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000315void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
316 unsigned &NumNames) const {
317 Names = GCCRegNames;
318 NumNames = llvm::array_lengthof(GCCRegNames);
319}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000320
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000321const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
322 // While some of these aliases do map to different registers
323 // they still share the same register name.
324 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
325 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
326 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
327 { { "cr3", "fr3", "r3", "v3"}, "3" },
328 { { "cr4", "fr4", "r4", "v4"}, "4" },
329 { { "cr5", "fr5", "r5", "v5"}, "5" },
330 { { "cr6", "fr6", "r6", "v6"}, "6" },
331 { { "cr7", "fr7", "r7", "v7"}, "7" },
332 { { "fr8", "r8", "v8"}, "8" },
333 { { "fr9", "r9", "v9"}, "9" },
334 { { "fr10", "r10", "v10"}, "10" },
335 { { "fr11", "r11", "v11"}, "11" },
336 { { "fr12", "r12", "v12"}, "12" },
337 { { "fr13", "r13", "v13"}, "13" },
338 { { "fr14", "r14", "v14"}, "14" },
339 { { "fr15", "r15", "v15"}, "15" },
340 { { "fr16", "r16", "v16"}, "16" },
341 { { "fr17", "r17", "v17"}, "17" },
342 { { "fr18", "r18", "v18"}, "18" },
343 { { "fr19", "r19", "v19"}, "19" },
344 { { "fr20", "r20", "v20"}, "20" },
345 { { "fr21", "r21", "v21"}, "21" },
346 { { "fr22", "r22", "v22"}, "22" },
347 { { "fr23", "r23", "v23"}, "23" },
348 { { "fr24", "r24", "v24"}, "24" },
349 { { "fr25", "r25", "v25"}, "25" },
350 { { "fr26", "r26", "v26"}, "26" },
351 { { "fr27", "r27", "v27"}, "27" },
352 { { "fr28", "r28", "v28"}, "28" },
353 { { "fr29", "r29", "v29"}, "29" },
354 { { "fr30", "r30", "v30"}, "30" },
355 { { "fr31", "r31", "v31"}, "31" },
356};
357
358void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
359 unsigned &NumAliases) const {
360 Aliases = GCCRegAliases;
361 NumAliases = llvm::array_lengthof(GCCRegAliases);
362}
363} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000364
Chris Lattner5ba61f02006-10-14 07:39:34 +0000365namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000366class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000367public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000368 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
369 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
370 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
371 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000372 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000373 getPowerPCDefines(Defines, false);
374 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000375};
376} // end anonymous namespace.
377
378namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000379class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000380public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000381 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000382 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000383 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
384 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000385 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000386 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000387 getPowerPCDefines(Defines, true);
388 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000389};
390} // end anonymous namespace.
391
Chris Lattner2ca529c2008-12-04 23:20:07 +0000392
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000393namespace {
394class DarwinPPCTargetInfo : public PPC32TargetInfo {
395public:
396 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
397 virtual void getTargetDefines(std::vector<char> &Defines) const {
398 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000399 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000400 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000401
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000402 /// getDefaultLangOptions - Allow the target to specify default settings for
403 /// various language options. These may be overridden by command line
404 /// options.
405 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000406 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000407 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000408};
409} // end anonymous namespace.
410
411namespace {
412class DarwinPPC64TargetInfo : public PPC64TargetInfo {
413public:
414 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
415 virtual void getTargetDefines(std::vector<char> &Defines) const {
416 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000417 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000418 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000419
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000420 /// getDefaultLangOptions - Allow the target to specify default settings for
421 /// various language options. These may be overridden by command line
422 /// options.
423 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000424 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000425 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000426};
427} // end anonymous namespace.
428
429namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000430// Namespace for x86 abstract base class
431const Builtin::Info BuiltinInfo[] = {
432#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
433#include "clang/AST/X86Builtins.def"
434};
Eli Friedmanb5366062008-05-20 14:21:01 +0000435
Eli Friedman3fd920a2008-08-20 02:34:37 +0000436const char *GCCRegNames[] = {
437 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
438 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
439 "argp", "flags", "fspr", "dirflag", "frame",
440 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
441 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
442 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
443 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
444};
445
446const TargetInfo::GCCRegAlias GCCRegAliases[] = {
447 { { "al", "ah", "eax", "rax" }, "ax" },
448 { { "bl", "bh", "ebx", "rbx" }, "bx" },
449 { { "cl", "ch", "ecx", "rcx" }, "cx" },
450 { { "dl", "dh", "edx", "rdx" }, "dx" },
451 { { "esi", "rsi" }, "si" },
452 { { "edi", "rdi" }, "di" },
453 { { "esp", "rsp" }, "sp" },
454 { { "ebp", "rbp" }, "bp" },
455};
456
457// X86 target abstract base class; x86-32 and x86-64 are very close, so
458// most of the implementation can be shared.
459class X86TargetInfo : public TargetInfo {
460public:
461 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
462 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000463 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000464 virtual void getTargetBuiltins(const Builtin::Info *&Records,
465 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000466 Records = BuiltinInfo;
467 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000468 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000469 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000470 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000471 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000472 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000473 unsigned &NumNames) const {
474 Names = GCCRegNames;
475 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000476 }
477 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
478 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000479 Aliases = GCCRegAliases;
480 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000481 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000482 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000483 TargetInfo::ConstraintInfo &info) const;
484 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000485 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000486 return "~{dirflag},~{fpsr},~{flags}";
487 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000488};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000489
490bool
491X86TargetInfo::validateAsmConstraint(char c,
492 TargetInfo::ConstraintInfo &info) const {
493 switch (c) {
494 default: return false;
495 case 'a': // eax.
496 case 'b': // ebx.
497 case 'c': // ecx.
498 case 'd': // edx.
499 case 'S': // esi.
500 case 'D': // edi.
501 case 'A': // edx:eax.
502 case 't': // top of floating point stack.
503 case 'u': // second from top of floating point stack.
504 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000505 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000506 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000507 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
508 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
509 // instructions.
510 case 'N': // unsigned 8-bit integer constant for use with in and out
511 // instructions.
512 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
513 return true;
514 }
515}
516
517std::string
518X86TargetInfo::convertConstraint(const char Constraint) const {
519 switch (Constraint) {
520 case 'a': return std::string("{ax}");
521 case 'b': return std::string("{bx}");
522 case 'c': return std::string("{cx}");
523 case 'd': return std::string("{dx}");
524 case 'S': return std::string("{si}");
525 case 'D': return std::string("{di}");
526 case 't': // top of floating point stack.
527 return std::string("{st}");
528 case 'u': // second from top of floating point stack.
529 return std::string("{st(1)}"); // second from top of floating point stack.
530 default:
531 return std::string(1, Constraint);
532 }
533}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000534} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000535
536namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000537// X86-32 generic target
538class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000539public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000540 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
541 DoubleAlign = LongLongAlign = 32;
542 LongDoubleWidth = 96;
543 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000544 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
545 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
546 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000547 }
548 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000549 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000550 }
551 virtual void getTargetDefines(std::vector<char> &Defines) const {
552 getX86Defines(Defines, false);
553 }
554};
555} // end anonymous namespace
556
557namespace {
558// x86-32 Darwin (OS X) target
559class DarwinI386TargetInfo : public X86_32TargetInfo {
560public:
561 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
562 LongDoubleWidth = 128;
563 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000564 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
565 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
566 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000567 }
568 virtual void getTargetDefines(std::vector<char> &Defines) const {
569 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000570 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000571 }
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000572 /// getDefaultLangOptions - Allow the target to specify default settings for
573 /// various language options. These may be overridden by command line
574 /// options.
575 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000576 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000577 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000578};
579} // end anonymous namespace
580
581namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000582// x86-32 FreeBSD target
583class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
584public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000585 FreeBSDX86_32TargetInfo(const std::string& triple) :
586 X86_32TargetInfo(triple) {
587 SizeType = UnsignedInt;
588 PtrDiffType = SignedInt;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000589 }
590 virtual void getTargetDefines(std::vector<char> &Defines) const {
591 X86_32TargetInfo::getTargetDefines(Defines);
592 getFreeBSDDefines(Defines, 0, getTargetTriple());
593 }
594};
595} // end anonymous namespace
596
597namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000598// x86-32 DragonFly target
599class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
600public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000601 DragonFlyX86_32TargetInfo(const std::string& triple) :
602 X86_32TargetInfo(triple) {
603 SizeType = UnsignedInt;
604 PtrDiffType = SignedInt;
Chris Lattner5637ef52008-08-23 18:23:14 +0000605 }
606 virtual void getTargetDefines(std::vector<char> &Defines) const {
607 X86_32TargetInfo::getTargetDefines(Defines);
608 getDragonFlyDefines(Defines);
609 }
610};
611} // end anonymous namespace
612
613namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000614// x86-32 Linux target
615class LinuxX86_32TargetInfo : public X86_32TargetInfo {
616public:
617 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000618 UserLabelPrefix = "";
Eli Friedmand50881c2008-11-02 02:43:55 +0000619 SizeType = UnsignedInt;
620 PtrDiffType = SignedInt;
Eli Friedmanff594f22008-08-21 00:24:02 +0000621 }
622 virtual void getTargetDefines(std::vector<char> &Defines) const {
623 X86_32TargetInfo::getTargetDefines(Defines);
624 getLinuxDefines(Defines);
625 }
626};
627} // end anonymous namespace
628
629namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000630// x86-32 Windows target
631class WindowsX86_32TargetInfo : public X86_32TargetInfo {
632public:
633 WindowsX86_32TargetInfo(const std::string& triple)
634 : X86_32TargetInfo(triple) {
635 // FIXME: Fix wchar_t.
636 // FIXME: We should probably enable -fms-extensions by default for
637 // this target.
Eli Friedmand50881c2008-11-02 02:43:55 +0000638 SizeType = UnsignedInt;
639 PtrDiffType = SignedInt;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000640 }
641 virtual void getTargetDefines(std::vector<char> &Defines) const {
642 X86_32TargetInfo::getTargetDefines(Defines);
643 // This list is based off of the the list of things MingW defines
644 Define(Defines, "__WIN32__");
645 Define(Defines, "__WIN32");
646 Define(Defines, "_WIN32");
647 Define(Defines, "WIN32");
648 Define(Defines, "__WINNT__");
649 Define(Defines, "__WINNT");
650 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000651 Define(Defines, "_X86_");
652 Define(Defines, "__MSVCRT__");
653 }
654};
655} // end anonymous namespace
656
657namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000658// x86-64 generic target
659class X86_64TargetInfo : public X86TargetInfo {
660public:
661 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000662 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000663 LongDoubleWidth = 128;
664 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000665 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
666 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
667 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000668 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000669 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000670 return "typedef struct __va_list_tag {"
671 " unsigned gp_offset;"
672 " unsigned fp_offset;"
673 " void* overflow_arg_area;"
674 " void* reg_save_area;"
675 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000676 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000677 virtual void getTargetDefines(std::vector<char> &Defines) const {
678 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000679 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000680};
681} // end anonymous namespace
682
683namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000684// x86-64 FreeBSD target
685class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
686public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000687 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000688 virtual void getTargetDefines(std::vector<char> &Defines) const {
689 X86_64TargetInfo::getTargetDefines(Defines);
690 getFreeBSDDefines(Defines, 1, getTargetTriple());
691 }
692};
693} // end anonymous namespace
694
695namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000696// x86-64 Linux target
697class LinuxX86_64TargetInfo : public X86_64TargetInfo {
698public:
699 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000700 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000701 }
702 virtual void getTargetDefines(std::vector<char> &Defines) const {
703 X86_64TargetInfo::getTargetDefines(Defines);
704 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000705 }
706};
707} // end anonymous namespace
708
709namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000710// x86-64 Darwin (OS X) target
711class DarwinX86_64TargetInfo : public X86_64TargetInfo {
712public:
713 DarwinX86_64TargetInfo(const std::string& triple) :
714 X86_64TargetInfo(triple) {}
715
716 virtual void getTargetDefines(std::vector<char> &Defines) const {
717 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000718 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000719 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000720
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000721 /// getDefaultLangOptions - Allow the target to specify default settings for
722 /// various language options. These may be overridden by command line
723 /// options.
724 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000725 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000726 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000727};
728} // end anonymous namespace.
729
Chris Lattner17df24e2008-04-21 18:56:49 +0000730namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000731class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000732public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000733 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
734 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000735 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
736 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000737 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000738 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000739 getARMDefines(Defines);
740 }
741 virtual void getTargetBuiltins(const Builtin::Info *&Records,
742 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000743 // FIXME: Implement.
744 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000745 NumRecords = 0;
746 }
747 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000748 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000749 }
750 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000751 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000752 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000753 virtual void getGCCRegNames(const char * const *&Names,
754 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000755 // FIXME: Implement.
756 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000757 NumNames = 0;
758 }
759 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
760 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000761 // FIXME: Implement.
762 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000763 NumAliases = 0;
764 }
765 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000766 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000767 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000768 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000769 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000770 case 'l': // r0-r7
771 case 'h': // r8-r15
772 case 'w': // VFP Floating point register single precision
773 case 'P': // VFP Floating point register double precision
774 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
775 return true;
776 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000777 return false;
778 }
779 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000780 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000781 return "";
782 }
783};
784} // end anonymous namespace.
785
Eli Friedmanf05b7722008-08-20 07:44:10 +0000786
787namespace {
788class DarwinARMTargetInfo : public ARMTargetInfo {
789public:
790 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
791
792 virtual void getTargetDefines(std::vector<char> &Defines) const {
793 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000794 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000795 }
796};
797} // end anonymous namespace.
798
Chris Lattner5ba61f02006-10-14 07:39:34 +0000799namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000800class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000801public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000802 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
803 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000804 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
805 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000806 }
Gabor Greif49991682008-02-21 16:29:08 +0000807 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000808 // FIXME: This is missing a lot of important defines; some of the
809 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000810 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000811 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000812 Define(Defines, "__sparcv8");
813 }
814 virtual void getTargetBuiltins(const Builtin::Info *&Records,
815 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000816 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000817 }
818 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000819 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000820 }
821 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000822 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000823 }
824 virtual void getGCCRegNames(const char * const *&Names,
825 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000826 // FIXME: Implement!
827 Names = 0;
828 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000829 }
830 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
831 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000832 // FIXME: Implement!
833 Aliases = 0;
834 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000835 }
836 virtual bool validateAsmConstraint(char c,
837 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000838 // FIXME: Implement!
839 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000840 }
841 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000842 // FIXME: Implement!
843 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000844 }
845};
846
847} // end anonymous namespace.
848
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000849namespace {
850class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
851public:
852 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +0000853 SparcV8TargetInfo(triple) {
854 SizeType = UnsignedInt;
855 PtrDiffType = SignedInt;
856 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000857
858 virtual void getTargetDefines(std::vector<char> &Defines) const {
859 SparcV8TargetInfo::getTargetDefines(Defines);
860 getSolarisDefines(Defines);
861 }
862};
863} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000864
Chris Lattnerb781dc792008-05-08 05:58:21 +0000865namespace {
866 class PIC16TargetInfo : public TargetInfo{
867 public:
868 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptad7959242008-10-31 09:52:39 +0000869 IntWidth = 16;
870 LongWidth = LongLongWidth = 32;
871 PointerWidth = 16;
872 IntAlign = 8;
873 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +0000874 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +0000875 SizeType = UnsignedInt;
876 IntMaxType = SignedLong;
877 UIntMaxType = UnsignedLong;
Eli Friedmand50881c2008-11-02 02:43:55 +0000878 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000879 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000880 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000881 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
882 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000883 virtual void getTargetDefines(std::vector<char> &Defines) const {
884 Define(Defines, "__pic16");
885 }
886 virtual void getTargetBuiltins(const Builtin::Info *&Records,
887 unsigned &NumRecords) const {}
888 virtual const char *getVAListDeclaration() const { return "";}
889 virtual const char *getClobbers() const {return "";}
890 virtual const char *getTargetPrefix() const {return "";}
891 virtual void getGCCRegNames(const char * const *&Names,
892 unsigned &NumNames) const {}
893 virtual bool validateAsmConstraint(char c,
894 TargetInfo::ConstraintInfo &info) const {
895 return true;
896 }
897 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
898 unsigned &NumAliases) const {}
899 virtual bool useGlobalsForAutomaticVariables() const {return true;}
900 };
901}
902
Chris Lattner5ba61f02006-10-14 07:39:34 +0000903//===----------------------------------------------------------------------===//
904// Driver code
905//===----------------------------------------------------------------------===//
906
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000907static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000908 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
909 TT[4] == '-' && TT[1] - '3' < 6);
910}
911
Chris Lattner855d0242008-03-05 01:18:20 +0000912/// CreateTargetInfo - Return the target info object for the specified target
913/// triple.
914TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000915 // OS detection; this isn't really anywhere near complete.
916 // Additions and corrections are welcome.
917 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000918 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000919 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000920 bool isSolaris = T.find("-solaris") != std::string::npos;
921 bool isLinux = T.find("-linux") != std::string::npos;
922 bool isWindows = T.find("-windows") != std::string::npos ||
923 T.find("-win32") != std::string::npos ||
924 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000925
Eli Friedman873f65a2008-08-21 00:13:15 +0000926 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
927 if (isDarwin)
928 return new DarwinPPCTargetInfo(T);
929 return new PPC32TargetInfo(T);
930 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000931
Eli Friedman873f65a2008-08-21 00:13:15 +0000932 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
933 if (isDarwin)
934 return new DarwinPPC64TargetInfo(T);
935 return new PPC64TargetInfo(T);
936 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000937
Eli Friedman873f65a2008-08-21 00:13:15 +0000938 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
939 if (isDarwin)
940 return new DarwinARMTargetInfo(T);
941 return new ARMTargetInfo(T);
942 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000943
Eli Friedman873f65a2008-08-21 00:13:15 +0000944 if (T.find("sparc-") == 0) {
945 if (isSolaris)
946 return new SolarisSparcV8TargetInfo(T);
947 return new SparcV8TargetInfo(T);
948 }
949
950 if (T.find("x86_64-") == 0) {
951 if (isDarwin)
952 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000953 if (isLinux)
954 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000955 if (isFreeBSD)
956 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000957 return new X86_64TargetInfo(T);
958 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000959
Chris Lattnerb781dc792008-05-08 05:58:21 +0000960 if (T.find("pic16-") == 0)
961 return new PIC16TargetInfo(T);
962
Eli Friedman873f65a2008-08-21 00:13:15 +0000963 if (IsX86(T)) {
964 if (isDarwin)
965 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000966 if (isLinux)
967 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000968 if (isDragonFly)
969 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000970 if (isFreeBSD)
971 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000972 if (isWindows)
973 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000974 return new X86_32TargetInfo(T);
975 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000976
Chris Lattner855d0242008-03-05 01:18:20 +0000977 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000978}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000979