blob: 7578b1b7d87db2ffbcd8f61faa263289eb077db2 [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"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000020using namespace clang;
21
Chris Lattner5ba61f02006-10-14 07:39:34 +000022//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000023// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
25
Chris Lattnerb2d486a2007-10-06 06:57:34 +000026static void Define(std::vector<char> &Buf, const char *Macro,
27 const char *Val = "1") {
28 const char *Def = "#define ";
29 Buf.insert(Buf.end(), Def, Def+strlen(Def));
30 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
31 Buf.push_back(' ');
32 Buf.insert(Buf.end(), Val, Val+strlen(Val));
33 Buf.push_back('\n');
34}
35
Chris Lattner09d98f52008-10-05 21:50:58 +000036//===----------------------------------------------------------------------===//
37// Defines specific to certain operating systems.
38//===----------------------------------------------------------------------===//
39
Eli Friedmanda8f5a92008-08-20 07:28:14 +000040static void getSolarisDefines(std::vector<char> &Defs) {
41 Define(Defs, "__SUN__");
42 Define(Defs, "__SOLARIS__");
43}
Chris Lattner5ba61f02006-10-14 07:39:34 +000044
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000045static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit, const char *Triple) {
46 // FreeBSD defines; list based off of gcc output
47
48 const char *FreeBSD = strstr(Triple, "-freebsd");
49 FreeBSD += strlen("-freebsd");
50 char release[] = "X";
51 release[0] = FreeBSD[0];
52 char version[] = "X00001";
53 version[0] = FreeBSD[0];
54
55 Define(Defs, "__FreeBSD__", release);
56 Define(Defs, "__FreeBSD_cc_version", version);
57 Define(Defs, "__KPRINTF_ATTRIBUTE__");
58 Define(Defs, "unix");
59 Define(Defs, "bsd");
60 if (is64Bit) {
61 Define(Defs, "__LP64__");
62 }
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065static void getDragonFlyDefines(std::vector<char> &Defs) {
66 // DragonFly defines; list based off of gcc output
67 Define(Defs, "__DragonFly__");
68 Define(Defs, "__DragonFly_cc_version", "100001");
69 Define(Defs, "__ELF__");
70 Define(Defs, "__KPRINTF_ATTRIBUTE__");
71 Define(Defs, "__tune_i386__");
72 Define(Defs, "unix");
73 Define(Defs, "__unix");
74 Define(Defs, "__unix__");
75}
76
77static void getLinuxDefines(std::vector<char> &Defs) {
78 // Linux defines; list based off of gcc output
79 Define(Defs, "__unix__");
80 Define(Defs, "__unix");
81 Define(Defs, "unix");
82 Define(Defs, "__linux__");
83 Define(Defs, "__linux");
84 Define(Defs, "linux");
85 Define(Defs, "__gnu_linux__");
86}
87
Chris Lattnerb3793bb2008-09-30 01:00:25 +000088static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +000089 Define(Defs, "__APPLE__");
90 Define(Defs, "__MACH__");
Chris Lattnerb3793bb2008-09-30 01:00:25 +000091
92 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
93 const char *Darwin = strstr(Triple, "-darwin");
94 if (Darwin) {
Chris Lattner97d74942008-09-30 20:30:12 +000095 char DarwinStr[] = "1000";
Chris Lattnerb3793bb2008-09-30 01:00:25 +000096 Darwin += strlen("-darwin");
Chris Lattner97d74942008-09-30 20:30:12 +000097 if (Darwin[0] >= '0' && Darwin[0] <= '9') {
98 unsigned DarwinNo = Darwin[0]-'0';
99 ++Darwin;
100
101 // Handle "darwin11".
102 if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
103 DarwinNo = 10+Darwin[0]-'0';
104 ++Darwin;
105 }
106
107 if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000108 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
109 DarwinStr[2] = '0' + DarwinNo-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000110 }
Chris Lattner97d74942008-09-30 20:30:12 +0000111
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 DarwinStr[3] = Darwin[1];
116
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000117 }
Chris Lattner97d74942008-09-30 20:30:12 +0000118 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000119 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000120}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000121
Chris Lattner09d98f52008-10-05 21:50:58 +0000122//===----------------------------------------------------------------------===//
123// Defines specific to certain architectures.
124//===----------------------------------------------------------------------===//
Eli Friedmanff594f22008-08-21 00:24:02 +0000125
Chris Lattner1f5ad112006-10-14 18:32:12 +0000126/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
127/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000128static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000129 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000130 Define(Defs, "__ppc__");
131 Define(Defs, "_ARCH_PPC");
132 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000133 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000134 Define(Defs, "_ARCH_PPC64");
135 Define(Defs, "_LP64");
136 Define(Defs, "__LP64__");
137 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000138 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000139 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000140 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000141
Chris Lattner9c837532006-10-15 01:05:46 +0000142 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000143 Define(Defs, "_BIG_ENDIAN");
144 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000145
Chris Lattner9c837532006-10-15 01:05:46 +0000146 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000147 Define(Defs, "__NATURAL_ALIGNMENT__");
148 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000149
Chris Lattnerac7ed9a2008-10-05 21:49:27 +0000150 // FIXME: Should be controlled by command line option.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000151 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000152}
153
154/// getX86Defines - Return a set of the X86-specific #defines that are
155/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000156static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000157 // Target identification.
158 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000159 Define(Defs, "_LP64");
160 Define(Defs, "__LP64__");
161 Define(Defs, "__amd64__");
162 Define(Defs, "__amd64");
163 Define(Defs, "__x86_64");
164 Define(Defs, "__x86_64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000165 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000166 Define(Defs, "__i386__");
167 Define(Defs, "__i386");
168 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000169 }
170
171 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000172 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000173
Chris Lattner9c837532006-10-15 01:05:46 +0000174 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000175 Define(Defs, "__nocona");
176 Define(Defs, "__nocona__");
177 Define(Defs, "__tune_nocona__");
178 Define(Defs, "__SSE2_MATH__");
179 Define(Defs, "__SSE2__");
180 Define(Defs, "__SSE_MATH__");
181 Define(Defs, "__SSE__");
182 Define(Defs, "__MMX__");
183 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000184}
185
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000186/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000187/// not tied to a specific subtarget.
188static void getARMDefines(std::vector<char> &Defs) {
189 // Target identification.
190 Define(Defs, "__arm");
191 Define(Defs, "__arm__");
192
193 // Target properties.
194 Define(Defs, "__LITTLE_ENDIAN__");
195
Chris Lattner17df24e2008-04-21 18:56:49 +0000196 // Subtarget options. [hard coded to v6 for now]
197 Define(Defs, "__ARM_ARCH_6K__");
198 Define(Defs, "__ARMEL__");
199 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner17df24e2008-04-21 18:56:49 +0000200}
201
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000202//===----------------------------------------------------------------------===//
203// Specific target implementations.
204//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000205
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000206namespace {
207// PPC abstract base class
208class PPCTargetInfo : public TargetInfo {
209 static const Builtin::Info BuiltinInfo[];
210 static const char * const GCCRegNames[];
211 static const TargetInfo::GCCRegAlias GCCRegAliases[];
212
213public:
214 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
215 CharIsSigned = false;
216 }
217 virtual void getTargetBuiltins(const Builtin::Info *&Records,
218 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000219 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000220 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000221 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000222 virtual const char *getVAListDeclaration() const {
223 return "typedef struct __va_list_tag {"
224 " unsigned char gpr;"
225 " unsigned char fpr;"
226 " unsigned short reserved;"
227 " void* overflow_arg_area;"
228 " void* reg_save_area;"
229 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000230 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000231 virtual const char *getTargetPrefix() const {
232 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000233 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000234 virtual void getGCCRegNames(const char * const *&Names,
235 unsigned &NumNames) const;
236 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
237 unsigned &NumAliases) const;
238 virtual bool validateAsmConstraint(char c,
239 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000240 switch (c) {
241 default: return false;
242 case 'O': // Zero
243 return true;
244 case 'b': // Base register
245 case 'f': // Floating point register
246 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
247 return true;
248 }
249 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000250 virtual const char *getClobbers() const {
251 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000252 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000253};
Anders Carlssonf511f642007-11-27 04:11:28 +0000254
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000255const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
256#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
257#include "clang/AST/PPCBuiltins.def"
258};
Chris Lattner17df24e2008-04-21 18:56:49 +0000259
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000260const char * const PPCTargetInfo::GCCRegNames[] = {
261 "0", "1", "2", "3", "4", "5", "6", "7",
262 "8", "9", "10", "11", "12", "13", "14", "15",
263 "16", "17", "18", "19", "20", "21", "22", "23",
264 "24", "25", "26", "27", "28", "29", "30", "31",
265 "0", "1", "2", "3", "4", "5", "6", "7",
266 "8", "9", "10", "11", "12", "13", "14", "15",
267 "16", "17", "18", "19", "20", "21", "22", "23",
268 "24", "25", "26", "27", "28", "29", "30", "31",
269 "mq", "lr", "ctr", "ap",
270 "0", "1", "2", "3", "4", "5", "6", "7",
271 "xer",
272 "0", "1", "2", "3", "4", "5", "6", "7",
273 "8", "9", "10", "11", "12", "13", "14", "15",
274 "16", "17", "18", "19", "20", "21", "22", "23",
275 "24", "25", "26", "27", "28", "29", "30", "31",
276 "vrsave", "vscr",
277 "spe_acc", "spefscr",
278 "sfp"
279};
Chris Lattner10a5b382007-01-29 05:24:35 +0000280
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000281void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
282 unsigned &NumNames) const {
283 Names = GCCRegNames;
284 NumNames = llvm::array_lengthof(GCCRegNames);
285}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000286
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000287const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
288 // While some of these aliases do map to different registers
289 // they still share the same register name.
290 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
291 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
292 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
293 { { "cr3", "fr3", "r3", "v3"}, "3" },
294 { { "cr4", "fr4", "r4", "v4"}, "4" },
295 { { "cr5", "fr5", "r5", "v5"}, "5" },
296 { { "cr6", "fr6", "r6", "v6"}, "6" },
297 { { "cr7", "fr7", "r7", "v7"}, "7" },
298 { { "fr8", "r8", "v8"}, "8" },
299 { { "fr9", "r9", "v9"}, "9" },
300 { { "fr10", "r10", "v10"}, "10" },
301 { { "fr11", "r11", "v11"}, "11" },
302 { { "fr12", "r12", "v12"}, "12" },
303 { { "fr13", "r13", "v13"}, "13" },
304 { { "fr14", "r14", "v14"}, "14" },
305 { { "fr15", "r15", "v15"}, "15" },
306 { { "fr16", "r16", "v16"}, "16" },
307 { { "fr17", "r17", "v17"}, "17" },
308 { { "fr18", "r18", "v18"}, "18" },
309 { { "fr19", "r19", "v19"}, "19" },
310 { { "fr20", "r20", "v20"}, "20" },
311 { { "fr21", "r21", "v21"}, "21" },
312 { { "fr22", "r22", "v22"}, "22" },
313 { { "fr23", "r23", "v23"}, "23" },
314 { { "fr24", "r24", "v24"}, "24" },
315 { { "fr25", "r25", "v25"}, "25" },
316 { { "fr26", "r26", "v26"}, "26" },
317 { { "fr27", "r27", "v27"}, "27" },
318 { { "fr28", "r28", "v28"}, "28" },
319 { { "fr29", "r29", "v29"}, "29" },
320 { { "fr30", "r30", "v30"}, "30" },
321 { { "fr31", "r31", "v31"}, "31" },
322};
323
324void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
325 unsigned &NumAliases) const {
326 Aliases = GCCRegAliases;
327 NumAliases = llvm::array_lengthof(GCCRegAliases);
328}
329} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000330
Chris Lattner5ba61f02006-10-14 07:39:34 +0000331namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000332class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000333public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000334 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
335 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
336 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
337 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000338 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000339 getPowerPCDefines(Defines, false);
340 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000341};
342} // end anonymous namespace.
343
344namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000345class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000346public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000347 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000348 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000349 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
350 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000351 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000352 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000353 getPowerPCDefines(Defines, true);
354 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000355};
356} // end anonymous namespace.
357
358namespace {
359class DarwinPPCTargetInfo : public PPC32TargetInfo {
360public:
361 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
362 virtual void getTargetDefines(std::vector<char> &Defines) const {
363 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000364 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000365 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000366
367 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000368};
369} // end anonymous namespace.
370
371namespace {
372class DarwinPPC64TargetInfo : public PPC64TargetInfo {
373public:
374 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
375 virtual void getTargetDefines(std::vector<char> &Defines) const {
376 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000377 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000378 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000379
380 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000381};
382} // end anonymous namespace.
383
384namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000385// Namespace for x86 abstract base class
386const Builtin::Info BuiltinInfo[] = {
387#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
388#include "clang/AST/X86Builtins.def"
389};
Eli Friedmanb5366062008-05-20 14:21:01 +0000390
Eli Friedman3fd920a2008-08-20 02:34:37 +0000391const char *GCCRegNames[] = {
392 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
393 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
394 "argp", "flags", "fspr", "dirflag", "frame",
395 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
396 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
397 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
398 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
399};
400
401const TargetInfo::GCCRegAlias GCCRegAliases[] = {
402 { { "al", "ah", "eax", "rax" }, "ax" },
403 { { "bl", "bh", "ebx", "rbx" }, "bx" },
404 { { "cl", "ch", "ecx", "rcx" }, "cx" },
405 { { "dl", "dh", "edx", "rdx" }, "dx" },
406 { { "esi", "rsi" }, "si" },
407 { { "edi", "rdi" }, "di" },
408 { { "esp", "rsp" }, "sp" },
409 { { "ebp", "rbp" }, "bp" },
410};
411
412// X86 target abstract base class; x86-32 and x86-64 are very close, so
413// most of the implementation can be shared.
414class X86TargetInfo : public TargetInfo {
415public:
416 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
417 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000418 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000419 virtual void getTargetBuiltins(const Builtin::Info *&Records,
420 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000421 Records = BuiltinInfo;
422 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000423 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000424 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000425 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000426 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000427 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000428 unsigned &NumNames) const {
429 Names = GCCRegNames;
430 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000431 }
432 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
433 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000434 Aliases = GCCRegAliases;
435 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000436 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000437 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000438 TargetInfo::ConstraintInfo &info) const;
439 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000440 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000441 return "~{dirflag},~{fpsr},~{flags}";
442 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000443};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000444
445bool
446X86TargetInfo::validateAsmConstraint(char c,
447 TargetInfo::ConstraintInfo &info) const {
448 switch (c) {
449 default: return false;
450 case 'a': // eax.
451 case 'b': // ebx.
452 case 'c': // ecx.
453 case 'd': // edx.
454 case 'S': // esi.
455 case 'D': // edi.
456 case 'A': // edx:eax.
457 case 't': // top of floating point stack.
458 case 'u': // second from top of floating point stack.
459 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000460 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000461 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000462 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
463 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
464 // instructions.
465 case 'N': // unsigned 8-bit integer constant for use with in and out
466 // instructions.
467 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
468 return true;
469 }
470}
471
472std::string
473X86TargetInfo::convertConstraint(const char Constraint) const {
474 switch (Constraint) {
475 case 'a': return std::string("{ax}");
476 case 'b': return std::string("{bx}");
477 case 'c': return std::string("{cx}");
478 case 'd': return std::string("{dx}");
479 case 'S': return std::string("{si}");
480 case 'D': return std::string("{di}");
481 case 't': // top of floating point stack.
482 return std::string("{st}");
483 case 'u': // second from top of floating point stack.
484 return std::string("{st(1)}"); // second from top of floating point stack.
485 default:
486 return std::string(1, Constraint);
487 }
488}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000489} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000490
491namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000492// X86-32 generic target
493class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000494public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000495 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
496 DoubleAlign = LongLongAlign = 32;
497 LongDoubleWidth = 96;
498 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000499 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
500 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
501 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000502 }
503 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000504 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000505 }
506 virtual void getTargetDefines(std::vector<char> &Defines) const {
507 getX86Defines(Defines, false);
508 }
509};
510} // end anonymous namespace
511
512namespace {
513// x86-32 Darwin (OS X) target
514class DarwinI386TargetInfo : public X86_32TargetInfo {
515public:
516 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
517 LongDoubleWidth = 128;
518 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000519 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
520 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
521 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000522 }
523 virtual void getTargetDefines(std::vector<char> &Defines) const {
524 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000525 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000526 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000527 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000528};
529} // end anonymous namespace
530
531namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000532// x86-32 FreeBSD target
533class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
534public:
535 FreeBSDX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
536 }
537 virtual void getTargetDefines(std::vector<char> &Defines) const {
538 X86_32TargetInfo::getTargetDefines(Defines);
539 getFreeBSDDefines(Defines, 0, getTargetTriple());
540 }
541};
542} // end anonymous namespace
543
544namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000545// x86-32 DragonFly target
546class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
547public:
548 DragonFlyX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
549 }
550 virtual void getTargetDefines(std::vector<char> &Defines) const {
551 X86_32TargetInfo::getTargetDefines(Defines);
552 getDragonFlyDefines(Defines);
553 }
554};
555} // end anonymous namespace
556
557namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000558// x86-32 Linux target
559class LinuxX86_32TargetInfo : public X86_32TargetInfo {
560public:
561 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000562 UserLabelPrefix = "";
Eli Friedmanff594f22008-08-21 00:24:02 +0000563 }
564 virtual void getTargetDefines(std::vector<char> &Defines) const {
565 X86_32TargetInfo::getTargetDefines(Defines);
566 getLinuxDefines(Defines);
567 }
568};
569} // end anonymous namespace
570
571namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000572// x86-32 Windows target
573class WindowsX86_32TargetInfo : public X86_32TargetInfo {
574public:
575 WindowsX86_32TargetInfo(const std::string& triple)
576 : X86_32TargetInfo(triple) {
577 // FIXME: Fix wchar_t.
578 // FIXME: We should probably enable -fms-extensions by default for
579 // this target.
580 }
581 virtual void getTargetDefines(std::vector<char> &Defines) const {
582 X86_32TargetInfo::getTargetDefines(Defines);
583 // This list is based off of the the list of things MingW defines
584 Define(Defines, "__WIN32__");
585 Define(Defines, "__WIN32");
586 Define(Defines, "_WIN32");
587 Define(Defines, "WIN32");
588 Define(Defines, "__WINNT__");
589 Define(Defines, "__WINNT");
590 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000591 Define(Defines, "_X86_");
592 Define(Defines, "__MSVCRT__");
593 }
594};
595} // end anonymous namespace
596
597namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000598// x86-64 generic target
599class X86_64TargetInfo : public X86TargetInfo {
600public:
601 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000602 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000603 LongDoubleWidth = 128;
604 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000605 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
606 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
607 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000608 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000609 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000610 return "typedef struct __va_list_tag {"
611 " unsigned gp_offset;"
612 " unsigned fp_offset;"
613 " void* overflow_arg_area;"
614 " void* reg_save_area;"
615 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000616 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000617 virtual void getTargetDefines(std::vector<char> &Defines) const {
618 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000619 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000620};
621} // end anonymous namespace
622
623namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000624// x86-64 FreeBSD target
625class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
626public:
627 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
628 }
629 virtual void getTargetDefines(std::vector<char> &Defines) const {
630 X86_64TargetInfo::getTargetDefines(Defines);
631 getFreeBSDDefines(Defines, 1, getTargetTriple());
632 }
633};
634} // end anonymous namespace
635
636namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000637// x86-64 Linux target
638class LinuxX86_64TargetInfo : public X86_64TargetInfo {
639public:
640 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000641 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000642 }
643 virtual void getTargetDefines(std::vector<char> &Defines) const {
644 X86_64TargetInfo::getTargetDefines(Defines);
645 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000646 }
647};
648} // end anonymous namespace
649
650namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000651// x86-64 Darwin (OS X) target
652class DarwinX86_64TargetInfo : public X86_64TargetInfo {
653public:
654 DarwinX86_64TargetInfo(const std::string& triple) :
655 X86_64TargetInfo(triple) {}
656
657 virtual void getTargetDefines(std::vector<char> &Defines) const {
658 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000659 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000660 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000661
662 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000663};
664} // end anonymous namespace.
665
Chris Lattner17df24e2008-04-21 18:56:49 +0000666namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000667class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000668public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000669 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
670 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000671 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
672 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000673 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000674 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000675 getARMDefines(Defines);
676 }
677 virtual void getTargetBuiltins(const Builtin::Info *&Records,
678 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000679 // FIXME: Implement.
680 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000681 NumRecords = 0;
682 }
683 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000684 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000685 }
686 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000687 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000688 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000689 virtual void getGCCRegNames(const char * const *&Names,
690 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000691 // FIXME: Implement.
692 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000693 NumNames = 0;
694 }
695 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
696 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000697 // FIXME: Implement.
698 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000699 NumAliases = 0;
700 }
701 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000702 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000703 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000704 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000705 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000706 case 'l': // r0-r7
707 case 'h': // r8-r15
708 case 'w': // VFP Floating point register single precision
709 case 'P': // VFP Floating point register double precision
710 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
711 return true;
712 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000713 return false;
714 }
715 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000716 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000717 return "";
718 }
719};
720} // end anonymous namespace.
721
Eli Friedmanf05b7722008-08-20 07:44:10 +0000722
723namespace {
724class DarwinARMTargetInfo : public ARMTargetInfo {
725public:
726 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
727
728 virtual void getTargetDefines(std::vector<char> &Defines) const {
729 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000730 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000731 }
732};
733} // end anonymous namespace.
734
Chris Lattner5ba61f02006-10-14 07:39:34 +0000735namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000736class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000737public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000738 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
739 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000740 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
741 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000742 }
Gabor Greif49991682008-02-21 16:29:08 +0000743 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000744 // FIXME: This is missing a lot of important defines; some of the
745 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000746 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000747 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000748 Define(Defines, "__sparcv8");
749 }
750 virtual void getTargetBuiltins(const Builtin::Info *&Records,
751 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000752 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000753 }
754 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000755 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000756 }
757 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000758 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000759 }
760 virtual void getGCCRegNames(const char * const *&Names,
761 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000762 // FIXME: Implement!
763 Names = 0;
764 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000765 }
766 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
767 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000768 // FIXME: Implement!
769 Aliases = 0;
770 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000771 }
772 virtual bool validateAsmConstraint(char c,
773 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000774 // FIXME: Implement!
775 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000776 }
777 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000778 // FIXME: Implement!
779 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000780 }
781};
782
783} // end anonymous namespace.
784
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000785namespace {
786class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
787public:
788 SolarisSparcV8TargetInfo(const std::string& triple) :
789 SparcV8TargetInfo(triple) {}
790
791 virtual void getTargetDefines(std::vector<char> &Defines) const {
792 SparcV8TargetInfo::getTargetDefines(Defines);
793 getSolarisDefines(Defines);
794 }
795};
796} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000797
Chris Lattnerb781dc792008-05-08 05:58:21 +0000798namespace {
799 class PIC16TargetInfo : public TargetInfo{
800 public:
801 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000802 // FIXME: Is IntAlign really supposed to be 16? There seems
803 // little point on a platform with 8-bit loads.
804 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
Chris Lattner6512a882008-10-05 20:06:37 +0000805 LongWidth = 16;
Eli Friedmanb5366062008-05-20 14:21:01 +0000806 PointerAlign = 8;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000807 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000808 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000809 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
810 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000811 virtual void getTargetDefines(std::vector<char> &Defines) const {
812 Define(Defines, "__pic16");
813 }
814 virtual void getTargetBuiltins(const Builtin::Info *&Records,
815 unsigned &NumRecords) const {}
816 virtual const char *getVAListDeclaration() const { return "";}
817 virtual const char *getClobbers() const {return "";}
818 virtual const char *getTargetPrefix() const {return "";}
819 virtual void getGCCRegNames(const char * const *&Names,
820 unsigned &NumNames) const {}
821 virtual bool validateAsmConstraint(char c,
822 TargetInfo::ConstraintInfo &info) const {
823 return true;
824 }
825 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
826 unsigned &NumAliases) const {}
827 virtual bool useGlobalsForAutomaticVariables() const {return true;}
828 };
829}
830
Chris Lattner5ba61f02006-10-14 07:39:34 +0000831//===----------------------------------------------------------------------===//
832// Driver code
833//===----------------------------------------------------------------------===//
834
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000835static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000836 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
837 TT[4] == '-' && TT[1] - '3' < 6);
838}
839
Chris Lattner855d0242008-03-05 01:18:20 +0000840/// CreateTargetInfo - Return the target info object for the specified target
841/// triple.
842TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000843 // OS detection; this isn't really anywhere near complete.
844 // Additions and corrections are welcome.
845 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000846 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000847 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000848 bool isSolaris = T.find("-solaris") != std::string::npos;
849 bool isLinux = T.find("-linux") != std::string::npos;
850 bool isWindows = T.find("-windows") != std::string::npos ||
851 T.find("-win32") != std::string::npos ||
852 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000853
Eli Friedman873f65a2008-08-21 00:13:15 +0000854 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
855 if (isDarwin)
856 return new DarwinPPCTargetInfo(T);
857 return new PPC32TargetInfo(T);
858 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000859
Eli Friedman873f65a2008-08-21 00:13:15 +0000860 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
861 if (isDarwin)
862 return new DarwinPPC64TargetInfo(T);
863 return new PPC64TargetInfo(T);
864 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000865
Eli Friedman873f65a2008-08-21 00:13:15 +0000866 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
867 if (isDarwin)
868 return new DarwinARMTargetInfo(T);
869 return new ARMTargetInfo(T);
870 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000871
Eli Friedman873f65a2008-08-21 00:13:15 +0000872 if (T.find("sparc-") == 0) {
873 if (isSolaris)
874 return new SolarisSparcV8TargetInfo(T);
875 return new SparcV8TargetInfo(T);
876 }
877
878 if (T.find("x86_64-") == 0) {
879 if (isDarwin)
880 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000881 if (isLinux)
882 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000883 if (isFreeBSD)
884 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000885 return new X86_64TargetInfo(T);
886 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000887
Chris Lattnerb781dc792008-05-08 05:58:21 +0000888 if (T.find("pic16-") == 0)
889 return new PIC16TargetInfo(T);
890
Eli Friedman873f65a2008-08-21 00:13:15 +0000891 if (IsX86(T)) {
892 if (isDarwin)
893 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000894 if (isLinux)
895 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000896 if (isDragonFly)
897 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000898 if (isFreeBSD)
899 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000900 if (isWindows)
901 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000902 return new X86_32TargetInfo(T);
903 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000904
Chris Lattner855d0242008-03-05 01:18:20 +0000905 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000906}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000907