blob: 71321f19cc8dc376619fdf1d293e5a836b8bc69c [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 {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000223 return "typedef char* __builtin_va_list;";
224 // This is the right definition for ABI/V4: System V.4/eabi.
225 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000226 " unsigned char gpr;"
227 " unsigned char fpr;"
228 " unsigned short reserved;"
229 " void* overflow_arg_area;"
230 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000231 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000232 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000233 virtual const char *getTargetPrefix() const {
234 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000235 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000236 virtual void getGCCRegNames(const char * const *&Names,
237 unsigned &NumNames) const;
238 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
239 unsigned &NumAliases) const;
240 virtual bool validateAsmConstraint(char c,
241 TargetInfo::ConstraintInfo &info) const {
Anders Carlssonf511f642007-11-27 04:11:28 +0000242 switch (c) {
243 default: return false;
244 case 'O': // Zero
245 return true;
246 case 'b': // Base register
247 case 'f': // Floating point register
248 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
249 return true;
250 }
251 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000252 virtual const char *getClobbers() const {
253 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000254 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000255};
Anders Carlssonf511f642007-11-27 04:11:28 +0000256
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000257const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
258#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
259#include "clang/AST/PPCBuiltins.def"
260};
Chris Lattner17df24e2008-04-21 18:56:49 +0000261
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000262const char * const PPCTargetInfo::GCCRegNames[] = {
263 "0", "1", "2", "3", "4", "5", "6", "7",
264 "8", "9", "10", "11", "12", "13", "14", "15",
265 "16", "17", "18", "19", "20", "21", "22", "23",
266 "24", "25", "26", "27", "28", "29", "30", "31",
267 "0", "1", "2", "3", "4", "5", "6", "7",
268 "8", "9", "10", "11", "12", "13", "14", "15",
269 "16", "17", "18", "19", "20", "21", "22", "23",
270 "24", "25", "26", "27", "28", "29", "30", "31",
271 "mq", "lr", "ctr", "ap",
272 "0", "1", "2", "3", "4", "5", "6", "7",
273 "xer",
274 "0", "1", "2", "3", "4", "5", "6", "7",
275 "8", "9", "10", "11", "12", "13", "14", "15",
276 "16", "17", "18", "19", "20", "21", "22", "23",
277 "24", "25", "26", "27", "28", "29", "30", "31",
278 "vrsave", "vscr",
279 "spe_acc", "spefscr",
280 "sfp"
281};
Chris Lattner10a5b382007-01-29 05:24:35 +0000282
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000283void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
284 unsigned &NumNames) const {
285 Names = GCCRegNames;
286 NumNames = llvm::array_lengthof(GCCRegNames);
287}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000288
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000289const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
290 // While some of these aliases do map to different registers
291 // they still share the same register name.
292 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
293 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
294 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
295 { { "cr3", "fr3", "r3", "v3"}, "3" },
296 { { "cr4", "fr4", "r4", "v4"}, "4" },
297 { { "cr5", "fr5", "r5", "v5"}, "5" },
298 { { "cr6", "fr6", "r6", "v6"}, "6" },
299 { { "cr7", "fr7", "r7", "v7"}, "7" },
300 { { "fr8", "r8", "v8"}, "8" },
301 { { "fr9", "r9", "v9"}, "9" },
302 { { "fr10", "r10", "v10"}, "10" },
303 { { "fr11", "r11", "v11"}, "11" },
304 { { "fr12", "r12", "v12"}, "12" },
305 { { "fr13", "r13", "v13"}, "13" },
306 { { "fr14", "r14", "v14"}, "14" },
307 { { "fr15", "r15", "v15"}, "15" },
308 { { "fr16", "r16", "v16"}, "16" },
309 { { "fr17", "r17", "v17"}, "17" },
310 { { "fr18", "r18", "v18"}, "18" },
311 { { "fr19", "r19", "v19"}, "19" },
312 { { "fr20", "r20", "v20"}, "20" },
313 { { "fr21", "r21", "v21"}, "21" },
314 { { "fr22", "r22", "v22"}, "22" },
315 { { "fr23", "r23", "v23"}, "23" },
316 { { "fr24", "r24", "v24"}, "24" },
317 { { "fr25", "r25", "v25"}, "25" },
318 { { "fr26", "r26", "v26"}, "26" },
319 { { "fr27", "r27", "v27"}, "27" },
320 { { "fr28", "r28", "v28"}, "28" },
321 { { "fr29", "r29", "v29"}, "29" },
322 { { "fr30", "r30", "v30"}, "30" },
323 { { "fr31", "r31", "v31"}, "31" },
324};
325
326void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
327 unsigned &NumAliases) const {
328 Aliases = GCCRegAliases;
329 NumAliases = llvm::array_lengthof(GCCRegAliases);
330}
331} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000332
Chris Lattner5ba61f02006-10-14 07:39:34 +0000333namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000334class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000335public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000336 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
337 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
338 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
339 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000340 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000341 getPowerPCDefines(Defines, false);
342 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000343};
344} // end anonymous namespace.
345
346namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000347class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000348public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000349 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000350 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000351 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
352 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000353 }
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000354 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000355 getPowerPCDefines(Defines, true);
356 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000357};
358} // end anonymous namespace.
359
360namespace {
361class DarwinPPCTargetInfo : public PPC32TargetInfo {
362public:
363 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
364 virtual void getTargetDefines(std::vector<char> &Defines) const {
365 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000366 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000367 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000368
369 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000370};
371} // end anonymous namespace.
372
373namespace {
374class DarwinPPC64TargetInfo : public PPC64TargetInfo {
375public:
376 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
377 virtual void getTargetDefines(std::vector<char> &Defines) const {
378 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000379 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000380 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000381
382 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000383};
384} // end anonymous namespace.
385
386namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000387// Namespace for x86 abstract base class
388const Builtin::Info BuiltinInfo[] = {
389#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
390#include "clang/AST/X86Builtins.def"
391};
Eli Friedmanb5366062008-05-20 14:21:01 +0000392
Eli Friedman3fd920a2008-08-20 02:34:37 +0000393const char *GCCRegNames[] = {
394 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
395 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
396 "argp", "flags", "fspr", "dirflag", "frame",
397 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
398 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
399 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
400 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
401};
402
403const TargetInfo::GCCRegAlias GCCRegAliases[] = {
404 { { "al", "ah", "eax", "rax" }, "ax" },
405 { { "bl", "bh", "ebx", "rbx" }, "bx" },
406 { { "cl", "ch", "ecx", "rcx" }, "cx" },
407 { { "dl", "dh", "edx", "rdx" }, "dx" },
408 { { "esi", "rsi" }, "si" },
409 { { "edi", "rdi" }, "di" },
410 { { "esp", "rsp" }, "sp" },
411 { { "ebp", "rbp" }, "bp" },
412};
413
414// X86 target abstract base class; x86-32 and x86-64 are very close, so
415// most of the implementation can be shared.
416class X86TargetInfo : public TargetInfo {
417public:
418 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
419 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000420 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000421 virtual void getTargetBuiltins(const Builtin::Info *&Records,
422 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000423 Records = BuiltinInfo;
424 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000425 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000426 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000427 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000428 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000429 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000430 unsigned &NumNames) const {
431 Names = GCCRegNames;
432 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000433 }
434 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
435 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000436 Aliases = GCCRegAliases;
437 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000438 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000439 virtual bool validateAsmConstraint(char c,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000440 TargetInfo::ConstraintInfo &info) const;
441 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000442 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000443 return "~{dirflag},~{fpsr},~{flags}";
444 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000445};
Eli Friedman3fd920a2008-08-20 02:34:37 +0000446
447bool
448X86TargetInfo::validateAsmConstraint(char c,
449 TargetInfo::ConstraintInfo &info) const {
450 switch (c) {
451 default: return false;
452 case 'a': // eax.
453 case 'b': // ebx.
454 case 'c': // ecx.
455 case 'd': // edx.
456 case 'S': // esi.
457 case 'D': // edi.
458 case 'A': // edx:eax.
459 case 't': // top of floating point stack.
460 case 'u': // second from top of floating point stack.
461 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000462 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000463 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000464 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
465 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
466 // instructions.
467 case 'N': // unsigned 8-bit integer constant for use with in and out
468 // instructions.
469 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
470 return true;
471 }
472}
473
474std::string
475X86TargetInfo::convertConstraint(const char Constraint) const {
476 switch (Constraint) {
477 case 'a': return std::string("{ax}");
478 case 'b': return std::string("{bx}");
479 case 'c': return std::string("{cx}");
480 case 'd': return std::string("{dx}");
481 case 'S': return std::string("{si}");
482 case 'D': return std::string("{di}");
483 case 't': // top of floating point stack.
484 return std::string("{st}");
485 case 'u': // second from top of floating point stack.
486 return std::string("{st(1)}"); // second from top of floating point stack.
487 default:
488 return std::string(1, Constraint);
489 }
490}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000491} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000492
493namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000494// X86-32 generic target
495class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000496public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000497 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
498 DoubleAlign = LongLongAlign = 32;
499 LongDoubleWidth = 96;
500 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000501 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
502 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
503 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000504 }
505 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000506 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000507 }
508 virtual void getTargetDefines(std::vector<char> &Defines) const {
509 getX86Defines(Defines, false);
510 }
511};
512} // end anonymous namespace
513
514namespace {
515// x86-32 Darwin (OS X) target
516class DarwinI386TargetInfo : public X86_32TargetInfo {
517public:
518 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
519 LongDoubleWidth = 128;
520 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000521 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
522 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
523 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000524 }
525 virtual void getTargetDefines(std::vector<char> &Defines) const {
526 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000527 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000528 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000529 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000530};
531} // end anonymous namespace
532
533namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000534// x86-32 FreeBSD target
535class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
536public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000537 FreeBSDX86_32TargetInfo(const std::string& triple) :
538 X86_32TargetInfo(triple) {
539 SizeType = UnsignedInt;
540 PtrDiffType = SignedInt;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000541 }
542 virtual void getTargetDefines(std::vector<char> &Defines) const {
543 X86_32TargetInfo::getTargetDefines(Defines);
544 getFreeBSDDefines(Defines, 0, getTargetTriple());
545 }
546};
547} // end anonymous namespace
548
549namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000550// x86-32 DragonFly target
551class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
552public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000553 DragonFlyX86_32TargetInfo(const std::string& triple) :
554 X86_32TargetInfo(triple) {
555 SizeType = UnsignedInt;
556 PtrDiffType = SignedInt;
Chris Lattner5637ef52008-08-23 18:23:14 +0000557 }
558 virtual void getTargetDefines(std::vector<char> &Defines) const {
559 X86_32TargetInfo::getTargetDefines(Defines);
560 getDragonFlyDefines(Defines);
561 }
562};
563} // end anonymous namespace
564
565namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000566// x86-32 Linux target
567class LinuxX86_32TargetInfo : public X86_32TargetInfo {
568public:
569 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000570 UserLabelPrefix = "";
Eli Friedmand50881c2008-11-02 02:43:55 +0000571 SizeType = UnsignedInt;
572 PtrDiffType = SignedInt;
Eli Friedmanff594f22008-08-21 00:24:02 +0000573 }
574 virtual void getTargetDefines(std::vector<char> &Defines) const {
575 X86_32TargetInfo::getTargetDefines(Defines);
576 getLinuxDefines(Defines);
577 }
578};
579} // end anonymous namespace
580
581namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000582// x86-32 Windows target
583class WindowsX86_32TargetInfo : public X86_32TargetInfo {
584public:
585 WindowsX86_32TargetInfo(const std::string& triple)
586 : X86_32TargetInfo(triple) {
587 // FIXME: Fix wchar_t.
588 // FIXME: We should probably enable -fms-extensions by default for
589 // this target.
Eli Friedmand50881c2008-11-02 02:43:55 +0000590 SizeType = UnsignedInt;
591 PtrDiffType = SignedInt;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000592 }
593 virtual void getTargetDefines(std::vector<char> &Defines) const {
594 X86_32TargetInfo::getTargetDefines(Defines);
595 // This list is based off of the the list of things MingW defines
596 Define(Defines, "__WIN32__");
597 Define(Defines, "__WIN32");
598 Define(Defines, "_WIN32");
599 Define(Defines, "WIN32");
600 Define(Defines, "__WINNT__");
601 Define(Defines, "__WINNT");
602 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000603 Define(Defines, "_X86_");
604 Define(Defines, "__MSVCRT__");
605 }
606};
607} // end anonymous namespace
608
609namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000610// x86-64 generic target
611class X86_64TargetInfo : public X86TargetInfo {
612public:
613 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000614 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000615 LongDoubleWidth = 128;
616 LongDoubleAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +0000617 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
618 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
619 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000620 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000621 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000622 return "typedef struct __va_list_tag {"
623 " unsigned gp_offset;"
624 " unsigned fp_offset;"
625 " void* overflow_arg_area;"
626 " void* reg_save_area;"
627 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000628 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000629 virtual void getTargetDefines(std::vector<char> &Defines) const {
630 getX86Defines(Defines, true);
Anders Carlsson050f4942007-12-08 19:32:57 +0000631 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000632};
633} // end anonymous namespace
634
635namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000636// x86-64 FreeBSD target
637class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
638public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000639 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000640 virtual void getTargetDefines(std::vector<char> &Defines) const {
641 X86_64TargetInfo::getTargetDefines(Defines);
642 getFreeBSDDefines(Defines, 1, getTargetTriple());
643 }
644};
645} // end anonymous namespace
646
647namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000648// x86-64 Linux target
649class LinuxX86_64TargetInfo : public X86_64TargetInfo {
650public:
651 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000652 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000653 }
654 virtual void getTargetDefines(std::vector<char> &Defines) const {
655 X86_64TargetInfo::getTargetDefines(Defines);
656 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000657 }
658};
659} // end anonymous namespace
660
661namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000662// x86-64 Darwin (OS X) target
663class DarwinX86_64TargetInfo : public X86_64TargetInfo {
664public:
665 DarwinX86_64TargetInfo(const std::string& triple) :
666 X86_64TargetInfo(triple) {}
667
668 virtual void getTargetDefines(std::vector<char> &Defines) const {
669 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000670 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000671 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000672
673 virtual bool useNeXTRuntimeAsDefault() const { return true; }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000674};
675} // end anonymous namespace.
676
Chris Lattner17df24e2008-04-21 18:56:49 +0000677namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000678class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000679public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000680 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
681 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000682 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
683 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000684 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000685 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner17df24e2008-04-21 18:56:49 +0000686 getARMDefines(Defines);
687 }
688 virtual void getTargetBuiltins(const Builtin::Info *&Records,
689 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000690 // FIXME: Implement.
691 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000692 NumRecords = 0;
693 }
694 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000695 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000696 }
697 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000698 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000699 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000700 virtual void getGCCRegNames(const char * const *&Names,
701 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000702 // FIXME: Implement.
703 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000704 NumNames = 0;
705 }
706 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
707 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000708 // FIXME: Implement.
709 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000710 NumAliases = 0;
711 }
712 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000713 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000714 // FIXME: Check if this is complete
Nate Begeman2908fa02008-04-22 05:03:19 +0000715 switch (c) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000716 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000717 case 'l': // r0-r7
718 case 'h': // r8-r15
719 case 'w': // VFP Floating point register single precision
720 case 'P': // VFP Floating point register double precision
721 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
722 return true;
723 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000724 return false;
725 }
726 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000727 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000728 return "";
729 }
730};
731} // end anonymous namespace.
732
Eli Friedmanf05b7722008-08-20 07:44:10 +0000733
734namespace {
735class DarwinARMTargetInfo : public ARMTargetInfo {
736public:
737 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
738
739 virtual void getTargetDefines(std::vector<char> &Defines) const {
740 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000741 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000742 }
743};
744} // end anonymous namespace.
745
Chris Lattner5ba61f02006-10-14 07:39:34 +0000746namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000747class SparcV8TargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +0000748public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000749 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
750 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000751 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
752 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000753 }
Gabor Greif49991682008-02-21 16:29:08 +0000754 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000755 // FIXME: This is missing a lot of important defines; some of the
756 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000757 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000758 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000759 Define(Defines, "__sparcv8");
760 }
761 virtual void getTargetBuiltins(const Builtin::Info *&Records,
762 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000763 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000764 }
765 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000766 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000767 }
768 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000769 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000770 }
771 virtual void getGCCRegNames(const char * const *&Names,
772 unsigned &NumNames) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000773 // FIXME: Implement!
774 Names = 0;
775 NumNames = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000776 }
777 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
778 unsigned &NumAliases) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000779 // FIXME: Implement!
780 Aliases = 0;
781 NumAliases = 0;
Gabor Greif49991682008-02-21 16:29:08 +0000782 }
783 virtual bool validateAsmConstraint(char c,
784 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000785 // FIXME: Implement!
786 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000787 }
788 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000789 // FIXME: Implement!
790 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000791 }
792};
793
794} // end anonymous namespace.
795
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000796namespace {
797class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
798public:
799 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +0000800 SparcV8TargetInfo(triple) {
801 SizeType = UnsignedInt;
802 PtrDiffType = SignedInt;
803 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000804
805 virtual void getTargetDefines(std::vector<char> &Defines) const {
806 SparcV8TargetInfo::getTargetDefines(Defines);
807 getSolarisDefines(Defines);
808 }
809};
810} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000811
Chris Lattnerb781dc792008-05-08 05:58:21 +0000812namespace {
813 class PIC16TargetInfo : public TargetInfo{
814 public:
815 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptad7959242008-10-31 09:52:39 +0000816 IntWidth = 16;
817 LongWidth = LongLongWidth = 32;
818 PointerWidth = 16;
819 IntAlign = 8;
820 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +0000821 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +0000822 SizeType = UnsignedInt;
823 IntMaxType = SignedLong;
824 UIntMaxType = UnsignedLong;
Eli Friedmand50881c2008-11-02 02:43:55 +0000825 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000826 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000827 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000828 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
829 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000830 virtual void getTargetDefines(std::vector<char> &Defines) const {
831 Define(Defines, "__pic16");
832 }
833 virtual void getTargetBuiltins(const Builtin::Info *&Records,
834 unsigned &NumRecords) const {}
835 virtual const char *getVAListDeclaration() const { return "";}
836 virtual const char *getClobbers() const {return "";}
837 virtual const char *getTargetPrefix() const {return "";}
838 virtual void getGCCRegNames(const char * const *&Names,
839 unsigned &NumNames) const {}
840 virtual bool validateAsmConstraint(char c,
841 TargetInfo::ConstraintInfo &info) const {
842 return true;
843 }
844 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
845 unsigned &NumAliases) const {}
846 virtual bool useGlobalsForAutomaticVariables() const {return true;}
847 };
848}
849
Chris Lattner5ba61f02006-10-14 07:39:34 +0000850//===----------------------------------------------------------------------===//
851// Driver code
852//===----------------------------------------------------------------------===//
853
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000854static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000855 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
856 TT[4] == '-' && TT[1] - '3' < 6);
857}
858
Chris Lattner855d0242008-03-05 01:18:20 +0000859/// CreateTargetInfo - Return the target info object for the specified target
860/// triple.
861TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000862 // OS detection; this isn't really anywhere near complete.
863 // Additions and corrections are welcome.
864 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000865 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000866 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000867 bool isSolaris = T.find("-solaris") != std::string::npos;
868 bool isLinux = T.find("-linux") != std::string::npos;
869 bool isWindows = T.find("-windows") != std::string::npos ||
870 T.find("-win32") != std::string::npos ||
871 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000872
Eli Friedman873f65a2008-08-21 00:13:15 +0000873 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
874 if (isDarwin)
875 return new DarwinPPCTargetInfo(T);
876 return new PPC32TargetInfo(T);
877 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000878
Eli Friedman873f65a2008-08-21 00:13:15 +0000879 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
880 if (isDarwin)
881 return new DarwinPPC64TargetInfo(T);
882 return new PPC64TargetInfo(T);
883 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000884
Eli Friedman873f65a2008-08-21 00:13:15 +0000885 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
886 if (isDarwin)
887 return new DarwinARMTargetInfo(T);
888 return new ARMTargetInfo(T);
889 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000890
Eli Friedman873f65a2008-08-21 00:13:15 +0000891 if (T.find("sparc-") == 0) {
892 if (isSolaris)
893 return new SolarisSparcV8TargetInfo(T);
894 return new SparcV8TargetInfo(T);
895 }
896
897 if (T.find("x86_64-") == 0) {
898 if (isDarwin)
899 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000900 if (isLinux)
901 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000902 if (isFreeBSD)
903 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000904 return new X86_64TargetInfo(T);
905 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000906
Chris Lattnerb781dc792008-05-08 05:58:21 +0000907 if (T.find("pic16-") == 0)
908 return new PIC16TargetInfo(T);
909
Eli Friedman873f65a2008-08-21 00:13:15 +0000910 if (IsX86(T)) {
911 if (isDarwin)
912 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +0000913 if (isLinux)
914 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +0000915 if (isDragonFly)
916 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000917 if (isFreeBSD)
918 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000919 if (isWindows)
920 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +0000921 return new X86_32TargetInfo(T);
922 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000923
Chris Lattner855d0242008-03-05 01:18:20 +0000924 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000925}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000926