blob: b983f26bb343ad16d0e43ccd3fb1294c8d8c59d8 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Douglas Gregor9eebd972009-02-16 21:58:21 +000015// FIXME: Layering violation
Chris Lattner10a5b382007-01-29 05:24:35 +000016#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000017#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000018#include "clang/Basic/TargetInfo.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000019#include "clang/Basic/LangOptions.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000020#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000021#include "llvm/ADT/APFloat.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000022using namespace clang;
23
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000025// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000026//===----------------------------------------------------------------------===//
27
Chris Lattnerb2d486a2007-10-06 06:57:34 +000028static void Define(std::vector<char> &Buf, const char *Macro,
29 const char *Val = "1") {
30 const char *Def = "#define ";
31 Buf.insert(Buf.end(), Def, Def+strlen(Def));
32 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
33 Buf.push_back(' ');
34 Buf.insert(Buf.end(), Val, Val+strlen(Val));
35 Buf.push_back('\n');
36}
37
Chris Lattner09d98f52008-10-05 21:50:58 +000038//===----------------------------------------------------------------------===//
39// Defines specific to certain operating systems.
40//===----------------------------------------------------------------------===//
41
Eli Friedmanda8f5a92008-08-20 07:28:14 +000042static void getSolarisDefines(std::vector<char> &Defs) {
43 Define(Defs, "__SUN__");
44 Define(Defs, "__SOLARIS__");
45}
Chris Lattner5ba61f02006-10-14 07:39:34 +000046
Nate Begeman95439102009-01-18 01:08:03 +000047static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit,
48 const char *Triple) {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000049 // FreeBSD defines; list based off of gcc output
50
51 const char *FreeBSD = strstr(Triple, "-freebsd");
52 FreeBSD += strlen("-freebsd");
53 char release[] = "X";
54 release[0] = FreeBSD[0];
55 char version[] = "X00001";
56 version[0] = FreeBSD[0];
57
58 Define(Defs, "__FreeBSD__", release);
59 Define(Defs, "__FreeBSD_cc_version", version);
60 Define(Defs, "__KPRINTF_ATTRIBUTE__");
61 Define(Defs, "unix");
Anton Korobeynikov7e965952009-02-14 16:42:50 +000062 Define(Defs, "__ELF__", "1");
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000063 if (is64Bit) {
64 Define(Defs, "__LP64__");
65 }
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068static void getDragonFlyDefines(std::vector<char> &Defs) {
69 // DragonFly defines; list based off of gcc output
70 Define(Defs, "__DragonFly__");
71 Define(Defs, "__DragonFly_cc_version", "100001");
72 Define(Defs, "__ELF__");
73 Define(Defs, "__KPRINTF_ATTRIBUTE__");
74 Define(Defs, "__tune_i386__");
75 Define(Defs, "unix");
76 Define(Defs, "__unix");
77 Define(Defs, "__unix__");
78}
79
80static void getLinuxDefines(std::vector<char> &Defs) {
81 // Linux defines; list based off of gcc output
82 Define(Defs, "__unix__");
83 Define(Defs, "__unix");
84 Define(Defs, "unix");
85 Define(Defs, "__linux__");
86 Define(Defs, "__linux");
87 Define(Defs, "linux");
88 Define(Defs, "__gnu_linux__");
Argyrios Kyrtzidisd831cac2009-02-14 15:02:45 +000089 Define(Defs, "__ELF__", "1");
Chris Lattner09d98f52008-10-05 21:50:58 +000090}
91
Chris Lattner2ca529c2008-12-04 23:20:07 +000092/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
93/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
94/// not defined, return 0's. Return true if we have -darwin in the string or
95/// false otherwise.
96static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
97 Maj = Min = 0;
98 const char *Darwin = strstr(Triple, "-darwin");
99 if (Darwin == 0) return false;
100
101 Darwin += strlen("-darwin");
102 if (Darwin[0] < '0' || Darwin[0] > '9')
103 return true;
104
105 Maj = Darwin[0]-'0';
106 ++Darwin;
107
108 // Handle "darwin11".
109 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
110 Maj = 10+Darwin[0]-'0';
111 ++Darwin;
112 }
113
114 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
115 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
116 Darwin[2] == '\0')
117 Min = Darwin[1]-'0';
118
119 return true;
120}
121
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000122static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000123 Define(Defs, "__APPLE__");
124 Define(Defs, "__MACH__");
Chris Lattner81813122009-02-05 07:19:24 +0000125 Define(Defs, "OBJC_NEW_PROPERTIES");
126
127 // FIXME: OBJC_ZEROCOST_EXCEPTIONS when using zero cost eh.
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000128
129 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattner2ca529c2008-12-04 23:20:07 +0000130 unsigned Maj, Min;
131 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattner97d74942008-09-30 20:30:12 +0000132 char DarwinStr[] = "1000";
Chris Lattner2ca529c2008-12-04 23:20:07 +0000133 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
134 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
135 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000136 }
Chris Lattner2ca529c2008-12-04 23:20:07 +0000137
138 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
139 DarwinStr[3] = Min+'0';
Chris Lattner97d74942008-09-30 20:30:12 +0000140 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000141 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000142}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000143
Chris Lattner2ca529c2008-12-04 23:20:07 +0000144/// GetDarwinLanguageOptions - Set the default language options for darwin.
145static void GetDarwinLanguageOptions(LangOptions &Opts,
146 const char *Triple) {
147 Opts.NeXTRuntime = true;
148
149 unsigned Maj, Min;
150 if (!getDarwinNumber(Triple, Maj, Min))
151 return;
152
153 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahanian13de2532009-02-12 17:54:33 +0000154 // As does nonfragile-abi for 64bit mode
Fariborz Jahanian240f2b72009-02-24 23:34:44 +0000155 if (Maj > 9)
Chris Lattner2ca529c2008-12-04 23:20:07 +0000156 Opts.Blocks = 1;
Fariborz Jahanian240f2b72009-02-24 23:34:44 +0000157
Fariborz Jahanian30b3ac52009-02-24 23:38:42 +0000158 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
159 Opts.ObjCNonFragileABI = 1;
Chris Lattner2ca529c2008-12-04 23:20:07 +0000160}
161
162
Chris Lattner09d98f52008-10-05 21:50:58 +0000163//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000164// Specific target implementations.
165//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000166
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000167namespace {
168// PPC abstract base class
169class PPCTargetInfo : public TargetInfo {
170 static const Builtin::Info BuiltinInfo[];
171 static const char * const GCCRegNames[];
172 static const TargetInfo::GCCRegAlias GCCRegAliases[];
173
174public:
175 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
176 CharIsSigned = false;
177 }
178 virtual void getTargetBuiltins(const Builtin::Info *&Records,
179 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000180 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000181 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000182 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000183
184 virtual void getTargetDefines(std::vector<char> &Defines) const;
185
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000186 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000187 return "typedef char* __builtin_va_list;";
188 // This is the right definition for ABI/V4: System V.4/eabi.
189 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000190 " unsigned char gpr;"
191 " unsigned char fpr;"
192 " unsigned short reserved;"
193 " void* overflow_arg_area;"
194 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000195 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000196 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000197 virtual const char *getTargetPrefix() const {
198 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000199 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000200 virtual void getGCCRegNames(const char * const *&Names,
201 unsigned &NumNames) const;
202 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
203 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000204 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000205 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000206 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000207 default: return false;
208 case 'O': // Zero
209 return true;
210 case 'b': // Base register
211 case 'f': // Floating point register
212 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
213 return true;
214 }
215 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000216 virtual const char *getClobbers() const {
217 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000218 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000219};
Anders Carlssonf511f642007-11-27 04:11:28 +0000220
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000221const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000222#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
223#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000224#include "clang/AST/PPCBuiltins.def"
225};
Chris Lattnerecd49032009-03-02 22:27:17 +0000226
227
228/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
229/// #defines that are not tied to a specific subtarget.
230void PPCTargetInfo::getTargetDefines(std::vector<char> &Defs) const {
231 // Target identification.
232 Define(Defs, "__ppc__");
233 Define(Defs, "_ARCH_PPC");
234 Define(Defs, "__POWERPC__");
235 if (PointerWidth == 64) {
236 Define(Defs, "_ARCH_PPC64");
237 Define(Defs, "_LP64");
238 Define(Defs, "__LP64__");
239 Define(Defs, "__ppc64__");
240 } else {
241 Define(Defs, "__ppc__");
242 }
243
244 // Target properties.
245 Define(Defs, "_BIG_ENDIAN");
246 Define(Defs, "__BIG_ENDIAN__");
247
248 // Subtarget options.
249 Define(Defs, "__NATURAL_ALIGNMENT__");
250 Define(Defs, "__REGISTER_PREFIX__", "");
251
252 // FIXME: Should be controlled by command line option.
253 Define(Defs, "__LONG_DOUBLE_128__");
254}
255
Chris Lattner17df24e2008-04-21 18:56:49 +0000256
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000257const char * const PPCTargetInfo::GCCRegNames[] = {
258 "0", "1", "2", "3", "4", "5", "6", "7",
259 "8", "9", "10", "11", "12", "13", "14", "15",
260 "16", "17", "18", "19", "20", "21", "22", "23",
261 "24", "25", "26", "27", "28", "29", "30", "31",
262 "0", "1", "2", "3", "4", "5", "6", "7",
263 "8", "9", "10", "11", "12", "13", "14", "15",
264 "16", "17", "18", "19", "20", "21", "22", "23",
265 "24", "25", "26", "27", "28", "29", "30", "31",
266 "mq", "lr", "ctr", "ap",
267 "0", "1", "2", "3", "4", "5", "6", "7",
268 "xer",
269 "0", "1", "2", "3", "4", "5", "6", "7",
270 "8", "9", "10", "11", "12", "13", "14", "15",
271 "16", "17", "18", "19", "20", "21", "22", "23",
272 "24", "25", "26", "27", "28", "29", "30", "31",
273 "vrsave", "vscr",
274 "spe_acc", "spefscr",
275 "sfp"
276};
Chris Lattner10a5b382007-01-29 05:24:35 +0000277
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000278void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
279 unsigned &NumNames) const {
280 Names = GCCRegNames;
281 NumNames = llvm::array_lengthof(GCCRegNames);
282}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000283
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000284const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
285 // While some of these aliases do map to different registers
286 // they still share the same register name.
287 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
288 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
289 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
290 { { "cr3", "fr3", "r3", "v3"}, "3" },
291 { { "cr4", "fr4", "r4", "v4"}, "4" },
292 { { "cr5", "fr5", "r5", "v5"}, "5" },
293 { { "cr6", "fr6", "r6", "v6"}, "6" },
294 { { "cr7", "fr7", "r7", "v7"}, "7" },
295 { { "fr8", "r8", "v8"}, "8" },
296 { { "fr9", "r9", "v9"}, "9" },
297 { { "fr10", "r10", "v10"}, "10" },
298 { { "fr11", "r11", "v11"}, "11" },
299 { { "fr12", "r12", "v12"}, "12" },
300 { { "fr13", "r13", "v13"}, "13" },
301 { { "fr14", "r14", "v14"}, "14" },
302 { { "fr15", "r15", "v15"}, "15" },
303 { { "fr16", "r16", "v16"}, "16" },
304 { { "fr17", "r17", "v17"}, "17" },
305 { { "fr18", "r18", "v18"}, "18" },
306 { { "fr19", "r19", "v19"}, "19" },
307 { { "fr20", "r20", "v20"}, "20" },
308 { { "fr21", "r21", "v21"}, "21" },
309 { { "fr22", "r22", "v22"}, "22" },
310 { { "fr23", "r23", "v23"}, "23" },
311 { { "fr24", "r24", "v24"}, "24" },
312 { { "fr25", "r25", "v25"}, "25" },
313 { { "fr26", "r26", "v26"}, "26" },
314 { { "fr27", "r27", "v27"}, "27" },
315 { { "fr28", "r28", "v28"}, "28" },
316 { { "fr29", "r29", "v29"}, "29" },
317 { { "fr30", "r30", "v30"}, "30" },
318 { { "fr31", "r31", "v31"}, "31" },
319};
320
321void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
322 unsigned &NumAliases) const {
323 Aliases = GCCRegAliases;
324 NumAliases = llvm::array_lengthof(GCCRegAliases);
325}
326} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000327
Chris Lattner5ba61f02006-10-14 07:39:34 +0000328namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000329class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000330public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000331 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
332 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
333 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
334 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000335};
336} // end anonymous namespace.
337
338namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000339class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000340public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000341 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000342 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000343 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
344 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000345 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000346};
347} // end anonymous namespace.
348
Chris Lattner2ca529c2008-12-04 23:20:07 +0000349
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000350namespace {
351class DarwinPPCTargetInfo : public PPC32TargetInfo {
352public:
353 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
354 virtual void getTargetDefines(std::vector<char> &Defines) const {
355 PPC32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000356 getDarwinDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000357 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000358
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000359 /// getDefaultLangOptions - Allow the target to specify default settings for
360 /// various language options. These may be overridden by command line
361 /// options.
362 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000363 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000364 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000365};
366} // end anonymous namespace.
367
368namespace {
369class DarwinPPC64TargetInfo : public PPC64TargetInfo {
370public:
371 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
372 virtual void getTargetDefines(std::vector<char> &Defines) const {
373 PPC64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000374 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000375 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000376
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000377 /// getDefaultLangOptions - Allow the target to specify default settings for
378 /// various language options. These may be overridden by command line
379 /// options.
380 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000381 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000382 }
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[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000389#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
390#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedman3fd920a2008-08-20 02:34:37 +0000391#include "clang/AST/X86Builtins.def"
392};
Eli Friedmanb5366062008-05-20 14:21:01 +0000393
Eli Friedman3fd920a2008-08-20 02:34:37 +0000394const char *GCCRegNames[] = {
395 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
396 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
397 "argp", "flags", "fspr", "dirflag", "frame",
398 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
399 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
400 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
401 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
402};
403
404const TargetInfo::GCCRegAlias GCCRegAliases[] = {
405 { { "al", "ah", "eax", "rax" }, "ax" },
406 { { "bl", "bh", "ebx", "rbx" }, "bx" },
407 { { "cl", "ch", "ecx", "rcx" }, "cx" },
408 { { "dl", "dh", "edx", "rdx" }, "dx" },
409 { { "esi", "rsi" }, "si" },
410 { { "edi", "rdi" }, "di" },
411 { { "esp", "rsp" }, "sp" },
412 { { "ebp", "rbp" }, "bp" },
413};
414
415// X86 target abstract base class; x86-32 and x86-64 are very close, so
416// most of the implementation can be shared.
417class X86TargetInfo : public TargetInfo {
418public:
419 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
420 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000421 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000422 virtual void getTargetBuiltins(const Builtin::Info *&Records,
423 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000424 Records = BuiltinInfo;
425 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000426 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000427 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000428 return "x86";
Anders Carlsson050f4942007-12-08 19:32:57 +0000429 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000430 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000431 unsigned &NumNames) const {
432 Names = GCCRegNames;
433 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000434 }
435 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
436 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000437 Aliases = GCCRegAliases;
438 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000439 }
Anders Carlsson58436352009-02-28 17:11:49 +0000440 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000441 TargetInfo::ConstraintInfo &info) const;
442 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000443 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000444 return "~{dirflag},~{fpsr},~{flags}";
445 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000446 virtual void getTargetDefines(std::vector<char> &Defines) const;
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000447
448 virtual int HandleTargetOptions(std::string *StrArray, unsigned NumStrs,
449 std::string &ErrorReason);
Chris Lattner5ba61f02006-10-14 07:39:34 +0000450};
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000451
452/// HandleTargetOptions - Handle target-specific options like -msse2 and
453/// friends. An array of arguments is passed in: if they are all valid, this
454/// should handle them and return -1. If there is an error, the index of the
455/// invalid argument should be returned along with an optional error string.
456int X86TargetInfo::HandleTargetOptions(std::string *StrArray, unsigned NumStrs,
457 std::string &ErrorReason) {
458 if (NumStrs == 0)
459 return -1;
460 return 0;
461}
Chris Lattnerecd49032009-03-02 22:27:17 +0000462
463/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
464/// that are not tied to a specific subtarget.
465void X86TargetInfo::getTargetDefines(std::vector<char> &Defs) const {
466 // Target identification.
467 if (PointerWidth == 64) {
468 Define(Defs, "_LP64");
469 Define(Defs, "__LP64__");
470 Define(Defs, "__amd64__");
471 Define(Defs, "__amd64");
472 Define(Defs, "__x86_64");
473 Define(Defs, "__x86_64__");
474 Define(Defs, "__SSE3__");
475 } else {
476 Define(Defs, "__i386__");
477 Define(Defs, "__i386");
478 Define(Defs, "i386");
479 }
480
481 // Target properties.
482 Define(Defs, "__LITTLE_ENDIAN__");
483
484 // Subtarget options.
485 Define(Defs, "__nocona");
486 Define(Defs, "__nocona__");
487 Define(Defs, "__tune_nocona__");
488 Define(Defs, "__SSE2_MATH__");
489 Define(Defs, "__SSE2__");
490 Define(Defs, "__SSE_MATH__");
491 Define(Defs, "__SSE__");
492 Define(Defs, "__MMX__");
493 Define(Defs, "__REGISTER_PREFIX__", "");
494}
495
Eli Friedman3fd920a2008-08-20 02:34:37 +0000496
497bool
Anders Carlsson58436352009-02-28 17:11:49 +0000498X86TargetInfo::validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000499 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000500 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000501 default: return false;
502 case 'a': // eax.
503 case 'b': // ebx.
504 case 'c': // ecx.
505 case 'd': // edx.
506 case 'S': // esi.
507 case 'D': // edi.
508 case 'A': // edx:eax.
509 case 't': // top of floating point stack.
510 case 'u': // second from top of floating point stack.
511 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000512 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000513 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000514 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssona0b89212009-01-24 18:03:09 +0000515 case 'e': // 32-bit signed integer constant for use with zero-extending
516 // x86_64 instructions.
517 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
518 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000519 case 'N': // unsigned 8-bit integer constant for use with in and out
520 // instructions.
521 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
522 return true;
523 }
524}
525
526std::string
527X86TargetInfo::convertConstraint(const char Constraint) const {
528 switch (Constraint) {
529 case 'a': return std::string("{ax}");
530 case 'b': return std::string("{bx}");
531 case 'c': return std::string("{cx}");
532 case 'd': return std::string("{dx}");
533 case 'S': return std::string("{si}");
534 case 'D': return std::string("{di}");
535 case 't': // top of floating point stack.
536 return std::string("{st}");
537 case 'u': // second from top of floating point stack.
538 return std::string("{st(1)}"); // second from top of floating point stack.
539 default:
540 return std::string(1, Constraint);
541 }
542}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000543} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000544
545namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000546// X86-32 generic target
547class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000548public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000549 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
550 DoubleAlign = LongLongAlign = 32;
551 LongDoubleWidth = 96;
552 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000553 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
554 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
555 "a0:0:64-f80:32:32";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000556 }
557 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000558 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000559 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000560};
561} // end anonymous namespace
562
563namespace {
564// x86-32 Darwin (OS X) target
565class DarwinI386TargetInfo : public X86_32TargetInfo {
566public:
567 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
568 LongDoubleWidth = 128;
569 LongDoubleAlign = 128;
Chris Lattner81813122009-02-05 07:19:24 +0000570 PtrDiffType = SignedInt;
Eli Friedman873f65a2008-08-21 00:13:15 +0000571 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
572 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
573 "a0:0:64-f80:128:128";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000574 }
575 virtual void getTargetDefines(std::vector<char> &Defines) const {
576 X86_32TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000577 getDarwinDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000578 }
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000579 /// getDefaultLangOptions - Allow the target to specify default settings for
580 /// various language options. These may be overridden by command line
581 /// options.
582 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000583 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000584 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000585};
586} // end anonymous namespace
587
588namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000589// x86-32 FreeBSD target
590class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
591public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000592 FreeBSDX86_32TargetInfo(const std::string& triple) :
593 X86_32TargetInfo(triple) {
594 SizeType = UnsignedInt;
595 PtrDiffType = SignedInt;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000596 }
597 virtual void getTargetDefines(std::vector<char> &Defines) const {
598 X86_32TargetInfo::getTargetDefines(Defines);
599 getFreeBSDDefines(Defines, 0, getTargetTriple());
600 }
601};
602} // end anonymous namespace
603
604namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000605// x86-32 DragonFly target
606class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
607public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000608 DragonFlyX86_32TargetInfo(const std::string& triple) :
609 X86_32TargetInfo(triple) {
610 SizeType = UnsignedInt;
611 PtrDiffType = SignedInt;
Chris Lattner5637ef52008-08-23 18:23:14 +0000612 }
613 virtual void getTargetDefines(std::vector<char> &Defines) const {
614 X86_32TargetInfo::getTargetDefines(Defines);
615 getDragonFlyDefines(Defines);
616 }
617};
618} // end anonymous namespace
619
620namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000621// x86-32 Linux target
622class LinuxX86_32TargetInfo : public X86_32TargetInfo {
623public:
624 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000625 UserLabelPrefix = "";
Eli Friedmand50881c2008-11-02 02:43:55 +0000626 SizeType = UnsignedInt;
627 PtrDiffType = SignedInt;
Chris Lattner7e4c81c2009-02-13 22:28:55 +0000628 IntPtrType = SignedInt;
Eli Friedmanff594f22008-08-21 00:24:02 +0000629 }
630 virtual void getTargetDefines(std::vector<char> &Defines) const {
631 X86_32TargetInfo::getTargetDefines(Defines);
632 getLinuxDefines(Defines);
633 }
634};
635} // end anonymous namespace
636
637namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000638// x86-32 Windows target
639class WindowsX86_32TargetInfo : public X86_32TargetInfo {
640public:
641 WindowsX86_32TargetInfo(const std::string& triple)
642 : X86_32TargetInfo(triple) {
643 // FIXME: Fix wchar_t.
644 // FIXME: We should probably enable -fms-extensions by default for
645 // this target.
Eli Friedmand50881c2008-11-02 02:43:55 +0000646 SizeType = UnsignedInt;
647 PtrDiffType = SignedInt;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000648 }
649 virtual void getTargetDefines(std::vector<char> &Defines) const {
650 X86_32TargetInfo::getTargetDefines(Defines);
651 // This list is based off of the the list of things MingW defines
652 Define(Defines, "__WIN32__");
653 Define(Defines, "__WIN32");
654 Define(Defines, "_WIN32");
655 Define(Defines, "WIN32");
656 Define(Defines, "__WINNT__");
657 Define(Defines, "__WINNT");
658 Define(Defines, "WINNT");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000659 Define(Defines, "_X86_");
660 Define(Defines, "__MSVCRT__");
661 }
662};
663} // end anonymous namespace
664
665namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000666// x86-64 generic target
667class X86_64TargetInfo : public X86TargetInfo {
668public:
669 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner22ebe7b2009-01-28 06:58:19 +0000671 DoubleAlign = LongLongAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000672 LongDoubleWidth = 128;
673 LongDoubleAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000674 IntMaxType = SignedLong;
675 UIntMaxType = UnsignedLong;
676
Eli Friedman873f65a2008-08-21 00:13:15 +0000677 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
678 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
679 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000680 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000681 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000682 return "typedef struct __va_list_tag {"
683 " unsigned gp_offset;"
684 " unsigned fp_offset;"
685 " void* overflow_arg_area;"
686 " void* reg_save_area;"
687 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000688 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000689};
690} // end anonymous namespace
691
692namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000693// x86-64 FreeBSD target
694class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
695public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000696 FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {}
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000697 virtual void getTargetDefines(std::vector<char> &Defines) const {
698 X86_64TargetInfo::getTargetDefines(Defines);
699 getFreeBSDDefines(Defines, 1, getTargetTriple());
700 }
701};
702} // end anonymous namespace
703
704namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000705// x86-64 Linux target
706class LinuxX86_64TargetInfo : public X86_64TargetInfo {
707public:
708 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000709 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000710 }
711 virtual void getTargetDefines(std::vector<char> &Defines) const {
712 X86_64TargetInfo::getTargetDefines(Defines);
713 getLinuxDefines(Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000714 }
715};
716} // end anonymous namespace
717
718namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000719// x86-64 Darwin (OS X) target
720class DarwinX86_64TargetInfo : public X86_64TargetInfo {
721public:
722 DarwinX86_64TargetInfo(const std::string& triple) :
723 X86_64TargetInfo(triple) {}
724
725 virtual void getTargetDefines(std::vector<char> &Defines) const {
726 X86_64TargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000727 getDarwinDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000728 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000729
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000730 /// getDefaultLangOptions - Allow the target to specify default settings for
731 /// various language options. These may be overridden by command line
732 /// options.
733 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000734 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000735 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000736};
737} // end anonymous namespace.
738
Chris Lattner17df24e2008-04-21 18:56:49 +0000739namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000740class ARMTargetInfo : public TargetInfo {
Chris Lattner17df24e2008-04-21 18:56:49 +0000741public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000742 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
743 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000744 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
745 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Eli Friedmanb5366062008-05-20 14:21:01 +0000746 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000747 virtual void getTargetDefines(std::vector<char> &Defs) const {
748 // Target identification.
749 Define(Defs, "__arm");
750 Define(Defs, "__arm__");
751
752 // Target properties.
753 Define(Defs, "__LITTLE_ENDIAN__");
754
755 // Subtarget options. [hard coded to v6 for now]
756 Define(Defs, "__ARM_ARCH_6K__");
757 Define(Defs, "__ARMEL__");
758 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner17df24e2008-04-21 18:56:49 +0000759 }
760 virtual void getTargetBuiltins(const Builtin::Info *&Records,
761 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000762 // FIXME: Implement.
763 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000764 NumRecords = 0;
765 }
766 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000767 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000768 }
769 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000770 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000771 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000772 virtual void getGCCRegNames(const char * const *&Names,
773 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000774 // FIXME: Implement.
775 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000776 NumNames = 0;
777 }
778 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
779 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000780 // FIXME: Implement.
781 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000782 NumAliases = 0;
783 }
Anders Carlsson58436352009-02-28 17:11:49 +0000784 virtual bool validateAsmConstraint(const char *&Name,
Nate Begeman2908fa02008-04-22 05:03:19 +0000785 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000786 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +0000787 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000788 default:
Nate Begeman2908fa02008-04-22 05:03:19 +0000789 case 'l': // r0-r7
790 case 'h': // r8-r15
791 case 'w': // VFP Floating point register single precision
792 case 'P': // VFP Floating point register double precision
793 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
794 return true;
795 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000796 return false;
797 }
798 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000799 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +0000800 return "";
801 }
802};
803} // end anonymous namespace.
804
Eli Friedmanf05b7722008-08-20 07:44:10 +0000805
806namespace {
807class DarwinARMTargetInfo : public ARMTargetInfo {
808public:
809 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
810
811 virtual void getTargetDefines(std::vector<char> &Defines) const {
812 ARMTargetInfo::getTargetDefines(Defines);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000813 getDarwinDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +0000814 }
815};
816} // end anonymous namespace.
817
Chris Lattner5ba61f02006-10-14 07:39:34 +0000818namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000819class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +0000820 static const TargetInfo::GCCRegAlias GCCRegAliases[];
821 static const char * const GCCRegNames[];
Gabor Greif49991682008-02-21 16:29:08 +0000822public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000823 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
824 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +0000825 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
826 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000827 }
Gabor Greif49991682008-02-21 16:29:08 +0000828 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000829 // FIXME: This is missing a lot of important defines; some of the
830 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +0000831 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +0000832 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +0000833 Define(Defines, "__sparcv8");
834 }
835 virtual void getTargetBuiltins(const Builtin::Info *&Records,
836 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000837 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +0000838 }
839 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000840 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +0000841 }
842 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000843 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +0000844 }
845 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +0000846 unsigned &NumNames) const;
Gabor Greif49991682008-02-21 16:29:08 +0000847 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +0000848 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000849 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +0000850 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000851 // FIXME: Implement!
852 return false;
Gabor Greif49991682008-02-21 16:29:08 +0000853 }
854 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000855 // FIXME: Implement!
856 return "";
Gabor Greif49991682008-02-21 16:29:08 +0000857 }
858};
859
Chris Lattner9b415d62009-01-27 01:58:38 +0000860const char * const SparcV8TargetInfo::GCCRegNames[] = {
861 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
862 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
863 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
864 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
865};
866
867void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
868 unsigned &NumNames) const {
869 Names = GCCRegNames;
870 NumNames = llvm::array_lengthof(GCCRegNames);
871}
872
873const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
874 { { "g0" }, "r0" },
875 { { "g1" }, "r1" },
876 { { "g2" }, "r2" },
877 { { "g3" }, "r3" },
878 { { "g4" }, "r4" },
879 { { "g5" }, "r5" },
880 { { "g6" }, "r6" },
881 { { "g7" }, "r7" },
882 { { "o0" }, "r8" },
883 { { "o1" }, "r9" },
884 { { "o2" }, "r10" },
885 { { "o3" }, "r11" },
886 { { "o4" }, "r12" },
887 { { "o5" }, "r13" },
888 { { "o6", "sp" }, "r14" },
889 { { "o7" }, "r15" },
890 { { "l0" }, "r16" },
891 { { "l1" }, "r17" },
892 { { "l2" }, "r18" },
893 { { "l3" }, "r19" },
894 { { "l4" }, "r20" },
895 { { "l5" }, "r21" },
896 { { "l6" }, "r22" },
897 { { "l7" }, "r23" },
898 { { "i0" }, "r24" },
899 { { "i1" }, "r25" },
900 { { "i2" }, "r26" },
901 { { "i3" }, "r27" },
902 { { "i4" }, "r28" },
903 { { "i5" }, "r29" },
904 { { "i6", "fp" }, "r30" },
905 { { "i7" }, "r31" },
906};
907
908void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
909 unsigned &NumAliases) const {
910 Aliases = GCCRegAliases;
911 NumAliases = llvm::array_lengthof(GCCRegAliases);
912}
Gabor Greif49991682008-02-21 16:29:08 +0000913} // end anonymous namespace.
914
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000915namespace {
916class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
917public:
918 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +0000919 SparcV8TargetInfo(triple) {
920 SizeType = UnsignedInt;
921 PtrDiffType = SignedInt;
922 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000923
924 virtual void getTargetDefines(std::vector<char> &Defines) const {
925 SparcV8TargetInfo::getTargetDefines(Defines);
926 getSolarisDefines(Defines);
927 }
928};
929} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +0000930
Chris Lattnerb781dc792008-05-08 05:58:21 +0000931namespace {
932 class PIC16TargetInfo : public TargetInfo{
933 public:
934 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptad7959242008-10-31 09:52:39 +0000935 IntWidth = 16;
936 LongWidth = LongLongWidth = 32;
937 PointerWidth = 16;
938 IntAlign = 8;
939 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +0000940 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +0000941 SizeType = UnsignedInt;
942 IntMaxType = SignedLong;
943 UIntMaxType = UnsignedLong;
Chris Lattner7e4c81c2009-02-13 22:28:55 +0000944 IntPtrType = SignedShort;
Eli Friedmand50881c2008-11-02 02:43:55 +0000945 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +0000946 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +0000947 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000948 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
949 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000950 virtual void getTargetDefines(std::vector<char> &Defines) const {
951 Define(Defines, "__pic16");
952 }
953 virtual void getTargetBuiltins(const Builtin::Info *&Records,
954 unsigned &NumRecords) const {}
955 virtual const char *getVAListDeclaration() const { return "";}
956 virtual const char *getClobbers() const {return "";}
957 virtual const char *getTargetPrefix() const {return "";}
958 virtual void getGCCRegNames(const char * const *&Names,
959 unsigned &NumNames) const {}
Anders Carlsson58436352009-02-28 17:11:49 +0000960 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerb781dc792008-05-08 05:58:21 +0000961 TargetInfo::ConstraintInfo &info) const {
962 return true;
963 }
964 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
965 unsigned &NumAliases) const {}
966 virtual bool useGlobalsForAutomaticVariables() const {return true;}
967 };
968}
969
Chris Lattner5ba61f02006-10-14 07:39:34 +0000970//===----------------------------------------------------------------------===//
971// Driver code
972//===----------------------------------------------------------------------===//
973
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000974static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000975 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
976 TT[4] == '-' && TT[1] - '3' < 6);
977}
978
Chris Lattner855d0242008-03-05 01:18:20 +0000979/// CreateTargetInfo - Return the target info object for the specified target
980/// triple.
981TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000982 // OS detection; this isn't really anywhere near complete.
983 // Additions and corrections are welcome.
984 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +0000985 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000986 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +0000987 bool isSolaris = T.find("-solaris") != std::string::npos;
988 bool isLinux = T.find("-linux") != std::string::npos;
989 bool isWindows = T.find("-windows") != std::string::npos ||
990 T.find("-win32") != std::string::npos ||
991 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +0000992
Eli Friedman873f65a2008-08-21 00:13:15 +0000993 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
994 if (isDarwin)
995 return new DarwinPPCTargetInfo(T);
996 return new PPC32TargetInfo(T);
997 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000998
Eli Friedman873f65a2008-08-21 00:13:15 +0000999 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1000 if (isDarwin)
1001 return new DarwinPPC64TargetInfo(T);
1002 return new PPC64TargetInfo(T);
1003 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001004
Eli Friedman873f65a2008-08-21 00:13:15 +00001005 if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
1006 if (isDarwin)
1007 return new DarwinARMTargetInfo(T);
1008 return new ARMTargetInfo(T);
1009 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001010
Eli Friedman873f65a2008-08-21 00:13:15 +00001011 if (T.find("sparc-") == 0) {
1012 if (isSolaris)
1013 return new SolarisSparcV8TargetInfo(T);
1014 return new SparcV8TargetInfo(T);
1015 }
1016
Chris Lattnerd0b80c82009-02-20 17:04:14 +00001017 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001018 if (isDarwin)
1019 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001020 if (isLinux)
1021 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001022 if (isFreeBSD)
1023 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001024 return new X86_64TargetInfo(T);
1025 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001026
Chris Lattnerb781dc792008-05-08 05:58:21 +00001027 if (T.find("pic16-") == 0)
1028 return new PIC16TargetInfo(T);
1029
Eli Friedman873f65a2008-08-21 00:13:15 +00001030 if (IsX86(T)) {
1031 if (isDarwin)
1032 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001033 if (isLinux)
1034 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001035 if (isDragonFly)
1036 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001037 if (isFreeBSD)
1038 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001039 if (isWindows)
1040 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001041 return new X86_32TargetInfo(T);
1042 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001043
Chris Lattner855d0242008-03-05 01:18:20 +00001044 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001045}
Ted Kremenekc490bdb2008-03-04 17:47:18 +00001046