blob: e0db82d2a81a581aca148f2dd871d77d965e889d [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//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// 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 Lattner1e1c0b92009-03-20 16:06:38 +000022#include "llvm/ADT/SmallString.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000023using namespace clang;
24
Chris Lattner5ba61f02006-10-14 07:39:34 +000025//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000026// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000027//===----------------------------------------------------------------------===//
28
Chris Lattnerb2d486a2007-10-06 06:57:34 +000029static void Define(std::vector<char> &Buf, const char *Macro,
30 const char *Val = "1") {
31 const char *Def = "#define ";
32 Buf.insert(Buf.end(), Def, Def+strlen(Def));
33 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
34 Buf.push_back(' ');
35 Buf.insert(Buf.end(), Val, Val+strlen(Val));
36 Buf.push_back('\n');
37}
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000042static void DefineStd(std::vector<char> &Buf, const char *MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
49 Define(Buf, MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
52 llvm::SmallString<20> TmpStr;
53 TmpStr = "__";
54 TmpStr += MacroName;
55 Define(Buf, TmpStr.c_str());
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000056
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057 // Define __unix__.
58 TmpStr += "__";
59 Define(Buf, TmpStr.c_str());
60}
61
Chris Lattner09d98f52008-10-05 21:50:58 +000062//===----------------------------------------------------------------------===//
63// Defines specific to certain operating systems.
64//===----------------------------------------------------------------------===//
65
Eli Friedmanda8f5a92008-08-20 07:28:14 +000066static void getSolarisDefines(std::vector<char> &Defs) {
67 Define(Defs, "__SUN__");
68 Define(Defs, "__SOLARIS__");
69}
Chris Lattner5ba61f02006-10-14 07:39:34 +000070
Chris Lattnera1321f12009-03-20 15:55:34 +000071static void getFreeBSDDefines(const LangOptions &Opts, bool is64Bit,
72 const char *Triple, std::vector<char> &Defs) {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000073 // FreeBSD defines; list based off of gcc output
74
75 const char *FreeBSD = strstr(Triple, "-freebsd");
76 FreeBSD += strlen("-freebsd");
77 char release[] = "X";
78 release[0] = FreeBSD[0];
79 char version[] = "X00001";
80 version[0] = FreeBSD[0];
81
82 Define(Defs, "__FreeBSD__", release);
83 Define(Defs, "__FreeBSD_cc_version", version);
84 Define(Defs, "__KPRINTF_ATTRIBUTE__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000085 DefineStd(Defs, "unix", Opts);
Anton Korobeynikov7e965952009-02-14 16:42:50 +000086 Define(Defs, "__ELF__", "1");
Chris Lattner3c3e2cc2008-10-16 17:04:31 +000087 if (is64Bit) {
88 Define(Defs, "__LP64__");
89 }
90}
91
Chris Lattnera1321f12009-03-20 15:55:34 +000092static void getDragonFlyDefines(const LangOptions &Opts,
93 std::vector<char> &Defs) {
Chris Lattner09d98f52008-10-05 21:50:58 +000094 // DragonFly defines; list based off of gcc output
95 Define(Defs, "__DragonFly__");
96 Define(Defs, "__DragonFly_cc_version", "100001");
97 Define(Defs, "__ELF__");
98 Define(Defs, "__KPRINTF_ATTRIBUTE__");
99 Define(Defs, "__tune_i386__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000100 DefineStd(Defs, "unix", Opts);
Chris Lattner09d98f52008-10-05 21:50:58 +0000101}
102
Chris Lattnera1321f12009-03-20 15:55:34 +0000103static void getLinuxDefines(const LangOptions &Opts, std::vector<char> &Defs) {
Chris Lattner09d98f52008-10-05 21:50:58 +0000104 // Linux defines; list based off of gcc output
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000105 DefineStd(Defs, "unix", Opts);
106 DefineStd(Defs, "linux", Opts);
Chris Lattner09d98f52008-10-05 21:50:58 +0000107 Define(Defs, "__gnu_linux__");
Argyrios Kyrtzidisd831cac2009-02-14 15:02:45 +0000108 Define(Defs, "__ELF__", "1");
Chris Lattner09d98f52008-10-05 21:50:58 +0000109}
110
Chris Lattner2ca529c2008-12-04 23:20:07 +0000111/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
Daniel Dunbar497ff132009-04-10 19:52:24 +0000112/// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
Chris Lattner2ca529c2008-12-04 23:20:07 +0000113/// not defined, return 0's. Return true if we have -darwin in the string or
114/// false otherwise.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000115static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min, unsigned &Revision) {
116 Maj = Min = Revision = 0;
Chris Lattner2ca529c2008-12-04 23:20:07 +0000117 const char *Darwin = strstr(Triple, "-darwin");
118 if (Darwin == 0) return false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000119
Chris Lattner2ca529c2008-12-04 23:20:07 +0000120 Darwin += strlen("-darwin");
121 if (Darwin[0] < '0' || Darwin[0] > '9')
122 return true;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
Chris Lattner2ca529c2008-12-04 23:20:07 +0000124 Maj = Darwin[0]-'0';
125 ++Darwin;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000126
Chris Lattner2ca529c2008-12-04 23:20:07 +0000127 // Handle "darwin11".
128 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
Daniel Dunbar497ff132009-04-10 19:52:24 +0000129 Maj = Maj*10 + (Darwin[0] - '0');
Chris Lattner2ca529c2008-12-04 23:20:07 +0000130 ++Darwin;
131 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000132
Chris Lattner2ca529c2008-12-04 23:20:07 +0000133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
Daniel Dunbar497ff132009-04-10 19:52:24 +0000134 if (Darwin[0] != '.')
135 return true;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000136
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 ++Darwin;
138 if (Darwin[0] < '0' || Darwin[0] > '9')
139 return true;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000140
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 Min = Darwin[0]-'0';
142 ++Darwin;
143
144 // Handle 10.4.11 -> darwin8.11
145 if (Min == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
146 Min = Min*10 + (Darwin[0] - '0');
147 ++Darwin;
148 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000149
Daniel Dunbar497ff132009-04-10 19:52:24 +0000150 // Handle revision darwin8.9.1
151 if (Darwin[0] != '.')
152 return true;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000153
Daniel Dunbar497ff132009-04-10 19:52:24 +0000154 ++Darwin;
155 if (Darwin[0] < '0' || Darwin[0] > '9')
156 return true;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000157
Daniel Dunbar497ff132009-04-10 19:52:24 +0000158 Revision = Darwin[0]-'0';
159 ++Darwin;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000160
Daniel Dunbar497ff132009-04-10 19:52:24 +0000161 if (Revision == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
162 Revision = Revision*10 + (Darwin[0] - '0');
163 ++Darwin;
164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000165
Chris Lattner2ca529c2008-12-04 23:20:07 +0000166 return true;
167}
168
Daniel Dunbar497ff132009-04-10 19:52:24 +0000169static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000170 Define(Defs, "__APPLE__");
171 Define(Defs, "__MACH__");
Chris Lattner81813122009-02-05 07:19:24 +0000172 Define(Defs, "OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000173
Chris Lattner2a5c0a32009-04-07 16:50:40 +0000174 // __weak is always defined, for use in blocks and with objc pointers.
175 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000176
Chris Lattner2a5c0a32009-04-07 16:50:40 +0000177 // Darwin defines __strong even in C mode (just to nothing).
178 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Chris Lattnerc2d14012009-04-07 04:48:21 +0000179 Define(Defs, "__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +0000180 else
Chris Lattnerc2d14012009-04-07 04:48:21 +0000181 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000182}
183
184static void getDarwinOSXDefines(std::vector<char> &Defs, const char *Triple) {
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000185 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000186 unsigned Maj, Min, Rev;
187 if (getDarwinNumber(Triple, Maj, Min, Rev)) {
188 char MacOSXStr[] = "1000";
Chris Lattner2ca529c2008-12-04 23:20:07 +0000189 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
190 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000191 MacOSXStr[2] = '0' + Maj-4;
192 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000193
Daniel Dunbar497ff132009-04-10 19:52:24 +0000194 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
195 // Cap 10.4.11 -> darwin8.11 -> "1049"
196 MacOSXStr[3] = std::min(Min, 9U)+'0';
197 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", MacOSXStr);
198 }
199}
200
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000201static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
Daniel Dunbar497ff132009-04-10 19:52:24 +0000202 const char *Triple) {
203 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
204 unsigned Maj, Min, Rev;
205 if (getDarwinNumber(Triple, Maj, Min, Rev)) {
206 // When targetting iPhone OS, interpret the minor version and
207 // revision as the iPhone OS version
208 char iPhoneOSStr[] = "10000";
209 if (Min >= 2 && Min <= 9) { // iPhone OS 2.0-9.0
210 // darwin9.2.0 -> 20000, darwin9.3.0 -> 30000, etc.
211 iPhoneOSStr[0] = '0' + Min;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000212 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000213
Daniel Dunbar497ff132009-04-10 19:52:24 +0000214 // Handle minor version: 2.2 -> darwin9.2.2 -> 20200
215 iPhoneOSStr[2] = std::min(Rev, 9U)+'0';
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000216 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
Daniel Dunbar497ff132009-04-10 19:52:24 +0000217 iPhoneOSStr);
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000218 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Chris Lattner2ca529c2008-12-04 23:20:07 +0000221/// GetDarwinLanguageOptions - Set the default language options for darwin.
222static void GetDarwinLanguageOptions(LangOptions &Opts,
223 const char *Triple) {
224 Opts.NeXTRuntime = true;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000225
Daniel Dunbar497ff132009-04-10 19:52:24 +0000226 unsigned Maj, Min, Rev;
227 if (!getDarwinNumber(Triple, Maj, Min, Rev))
Chris Lattner2ca529c2008-12-04 23:20:07 +0000228 return;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000229
Chris Lattner2ca529c2008-12-04 23:20:07 +0000230 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahanian13de2532009-02-12 17:54:33 +0000231 // As does nonfragile-abi for 64bit mode
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000232 if (Maj > 9)
Chris Lattner2ca529c2008-12-04 23:20:07 +0000233 Opts.Blocks = 1;
Fariborz Jahanian240f2b72009-02-24 23:34:44 +0000234
Fariborz Jahanian30b3ac52009-02-24 23:38:42 +0000235 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
236 Opts.ObjCNonFragileABI = 1;
Chris Lattner2ca529c2008-12-04 23:20:07 +0000237}
238
239
Chris Lattner09d98f52008-10-05 21:50:58 +0000240//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000241// Specific target implementations.
242//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000243
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000244namespace {
245// PPC abstract base class
246class PPCTargetInfo : public TargetInfo {
247 static const Builtin::Info BuiltinInfo[];
248 static const char * const GCCRegNames[];
249 static const TargetInfo::GCCRegAlias GCCRegAliases[];
250
251public:
252 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
253 CharIsSigned = false;
254 }
255 virtual void getTargetBuiltins(const Builtin::Info *&Records,
256 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000257 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000258 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000259 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000260
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000261 virtual void getTargetDefines(const LangOptions &Opts,
262 std::vector<char> &Defines) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000263
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000264 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000265 return "typedef char* __builtin_va_list;";
266 // This is the right definition for ABI/V4: System V.4/eabi.
267 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000268 " unsigned char gpr;"
269 " unsigned char fpr;"
270 " unsigned short reserved;"
271 " void* overflow_arg_area;"
272 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000273 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000274 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000275 virtual const char *getTargetPrefix() const {
276 return "ppc";
Anders Carlssonf511f642007-11-27 04:11:28 +0000277 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000278 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000279 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000280 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000281 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000282 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000283 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000284 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000285 default: return false;
286 case 'O': // Zero
287 return true;
288 case 'b': // Base register
289 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000290 Info.setAllowsRegister();
Anders Carlssonf511f642007-11-27 04:11:28 +0000291 return true;
292 }
293 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000294 virtual const char *getClobbers() const {
295 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000296 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000297};
Anders Carlssonf511f642007-11-27 04:11:28 +0000298
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000299const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000300#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
301#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000302#include "clang/AST/PPCBuiltins.def"
303};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000304
305
Chris Lattnerecd49032009-03-02 22:27:17 +0000306/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
307/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000308void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
309 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000310 // Target identification.
311 Define(Defs, "__ppc__");
312 Define(Defs, "_ARCH_PPC");
313 Define(Defs, "__POWERPC__");
314 if (PointerWidth == 64) {
315 Define(Defs, "_ARCH_PPC64");
316 Define(Defs, "_LP64");
317 Define(Defs, "__LP64__");
318 Define(Defs, "__ppc64__");
319 } else {
320 Define(Defs, "__ppc__");
321 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000322
Chris Lattnerecd49032009-03-02 22:27:17 +0000323 // Target properties.
324 Define(Defs, "_BIG_ENDIAN");
325 Define(Defs, "__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000326
Chris Lattnerecd49032009-03-02 22:27:17 +0000327 // Subtarget options.
328 Define(Defs, "__NATURAL_ALIGNMENT__");
329 Define(Defs, "__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000330
Chris Lattnerecd49032009-03-02 22:27:17 +0000331 // FIXME: Should be controlled by command line option.
332 Define(Defs, "__LONG_DOUBLE_128__");
333}
334
Chris Lattner17df24e2008-04-21 18:56:49 +0000335
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000336const char * const PPCTargetInfo::GCCRegNames[] = {
337 "0", "1", "2", "3", "4", "5", "6", "7",
338 "8", "9", "10", "11", "12", "13", "14", "15",
339 "16", "17", "18", "19", "20", "21", "22", "23",
340 "24", "25", "26", "27", "28", "29", "30", "31",
341 "0", "1", "2", "3", "4", "5", "6", "7",
342 "8", "9", "10", "11", "12", "13", "14", "15",
343 "16", "17", "18", "19", "20", "21", "22", "23",
344 "24", "25", "26", "27", "28", "29", "30", "31",
345 "mq", "lr", "ctr", "ap",
346 "0", "1", "2", "3", "4", "5", "6", "7",
347 "xer",
348 "0", "1", "2", "3", "4", "5", "6", "7",
349 "8", "9", "10", "11", "12", "13", "14", "15",
350 "16", "17", "18", "19", "20", "21", "22", "23",
351 "24", "25", "26", "27", "28", "29", "30", "31",
352 "vrsave", "vscr",
353 "spe_acc", "spefscr",
354 "sfp"
355};
Chris Lattner10a5b382007-01-29 05:24:35 +0000356
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000357void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000358 unsigned &NumNames) const {
359 Names = GCCRegNames;
360 NumNames = llvm::array_lengthof(GCCRegNames);
361}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000362
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000363const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
364 // While some of these aliases do map to different registers
365 // they still share the same register name.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000366 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
367 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
368 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
369 { { "cr3", "fr3", "r3", "v3"}, "3" },
370 { { "cr4", "fr4", "r4", "v4"}, "4" },
371 { { "cr5", "fr5", "r5", "v5"}, "5" },
372 { { "cr6", "fr6", "r6", "v6"}, "6" },
373 { { "cr7", "fr7", "r7", "v7"}, "7" },
374 { { "fr8", "r8", "v8"}, "8" },
375 { { "fr9", "r9", "v9"}, "9" },
376 { { "fr10", "r10", "v10"}, "10" },
377 { { "fr11", "r11", "v11"}, "11" },
378 { { "fr12", "r12", "v12"}, "12" },
379 { { "fr13", "r13", "v13"}, "13" },
380 { { "fr14", "r14", "v14"}, "14" },
381 { { "fr15", "r15", "v15"}, "15" },
382 { { "fr16", "r16", "v16"}, "16" },
383 { { "fr17", "r17", "v17"}, "17" },
384 { { "fr18", "r18", "v18"}, "18" },
385 { { "fr19", "r19", "v19"}, "19" },
386 { { "fr20", "r20", "v20"}, "20" },
387 { { "fr21", "r21", "v21"}, "21" },
388 { { "fr22", "r22", "v22"}, "22" },
389 { { "fr23", "r23", "v23"}, "23" },
390 { { "fr24", "r24", "v24"}, "24" },
391 { { "fr25", "r25", "v25"}, "25" },
392 { { "fr26", "r26", "v26"}, "26" },
393 { { "fr27", "r27", "v27"}, "27" },
394 { { "fr28", "r28", "v28"}, "28" },
395 { { "fr29", "r29", "v29"}, "29" },
396 { { "fr30", "r30", "v30"}, "30" },
397 { { "fr31", "r31", "v31"}, "31" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000398};
399
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000400void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000401 unsigned &NumAliases) const {
402 Aliases = GCCRegAliases;
403 NumAliases = llvm::array_lengthof(GCCRegAliases);
404}
405} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000406
Chris Lattner5ba61f02006-10-14 07:39:34 +0000407namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000408class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000409public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000410 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
411 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
412 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
413 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000414};
415} // end anonymous namespace.
416
417namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000418class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000419public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000420 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000421 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman873f65a2008-08-21 00:13:15 +0000422 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
423 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000424 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000425};
426} // end anonymous namespace.
427
Chris Lattner2ca529c2008-12-04 23:20:07 +0000428
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000429namespace {
430class DarwinPPCTargetInfo : public PPC32TargetInfo {
431public:
432 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000433 virtual void getTargetDefines(const LangOptions &Opts,
434 std::vector<char> &Defines) const {
435 PPC32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000436 getDarwinDefines(Defines, Opts);
437 getDarwinOSXDefines(Defines, getTargetTriple());
Chris Lattner10a5b382007-01-29 05:24:35 +0000438 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000439
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000440 /// getDefaultLangOptions - Allow the target to specify default settings for
441 /// various language options. These may be overridden by command line
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000442 /// options.
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000443 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000444 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000445 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000446};
447} // end anonymous namespace.
448
449namespace {
450class DarwinPPC64TargetInfo : public PPC64TargetInfo {
451public:
452 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000453 virtual void getTargetDefines(const LangOptions &Opts,
454 std::vector<char> &Defines) const {
455 PPC64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000456 getDarwinDefines(Defines, Opts);
457 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000458 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000459
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000460 /// getDefaultLangOptions - Allow the target to specify default settings for
461 /// various language options. These may be overridden by command line
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000462 /// options.
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000463 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000464 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000465 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000466};
467} // end anonymous namespace.
468
469namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000470// Namespace for x86 abstract base class
471const Builtin::Info BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000472#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
473#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedman3fd920a2008-08-20 02:34:37 +0000474#include "clang/AST/X86Builtins.def"
475};
Eli Friedmanb5366062008-05-20 14:21:01 +0000476
Eli Friedman3fd920a2008-08-20 02:34:37 +0000477const char *GCCRegNames[] = {
478 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
479 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
480 "argp", "flags", "fspr", "dirflag", "frame",
481 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
482 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
483 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
484 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
485};
486
487const TargetInfo::GCCRegAlias GCCRegAliases[] = {
488 { { "al", "ah", "eax", "rax" }, "ax" },
489 { { "bl", "bh", "ebx", "rbx" }, "bx" },
490 { { "cl", "ch", "ecx", "rcx" }, "cx" },
491 { { "dl", "dh", "edx", "rdx" }, "dx" },
492 { { "esi", "rsi" }, "si" },
493 { { "edi", "rdi" }, "di" },
494 { { "esp", "rsp" }, "sp" },
495 { { "ebp", "rbp" }, "bp" },
496};
497
498// X86 target abstract base class; x86-32 and x86-64 are very close, so
499// most of the implementation can be shared.
500class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000501 enum X86SSEEnum {
502 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
503 } SSELevel;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000504public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000505 X86TargetInfo(const std::string& triple)
Chris Lattner5c352962009-03-03 19:56:18 +0000506 : TargetInfo(triple),
507 // FIXME: hard coding to SSE2 for now. This should change to NoMMXSSE so
508 // that the driver controls this.
509 SSELevel(SSE2) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000510 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000511 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000512 virtual void getTargetBuiltins(const Builtin::Info *&Records,
513 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000514 Records = BuiltinInfo;
515 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000516 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000517 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000518 return "x86";
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000519 }
520 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000521 unsigned &NumNames) const {
522 Names = GCCRegNames;
523 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000524 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000525 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000526 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000527 Aliases = GCCRegAliases;
528 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000529 }
Anders Carlsson58436352009-02-28 17:11:49 +0000530 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000531 TargetInfo::ConstraintInfo &info) const;
532 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000533 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000534 return "~{dirflag},~{fpsr},~{flags}";
535 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000536 virtual void getTargetDefines(const LangOptions &Opts,
537 std::vector<char> &Defines) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000538
Chris Lattner5c352962009-03-03 19:56:18 +0000539 virtual int HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
540 std::string &ErrorReason);
Chris Lattner5ba61f02006-10-14 07:39:34 +0000541};
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000542
543/// HandleTargetOptions - Handle target-specific options like -msse2 and
544/// friends. An array of arguments is passed in: if they are all valid, this
545/// should handle them and return -1. If there is an error, the index of the
546/// invalid argument should be returned along with an optional error string.
Chris Lattner5c352962009-03-03 19:56:18 +0000547int X86TargetInfo::HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
548 std::string &ErrorReason) {
549 for (unsigned i = 0; i != NumStrs; ++i) {
550 const std::string &Feature = StrArray[i];
551 if (Feature.size() < 2) return i;
552 // Ignore explicitly disabled features.
553 if (Feature[0] == '-') continue;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000554
Chris Lattner5c352962009-03-03 19:56:18 +0000555 // Feature strings are of the form "+feature".
556 if (Feature[0] != '+') return i;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000557
Chris Lattner5c352962009-03-03 19:56:18 +0000558 // The set of supported subtarget features is defined in
559 // lib/Target/X86/X86.td. Here we recognize and map onto our internal
560 // state.
561 if (Feature == "+mmx")
562 SSELevel = std::max(SSELevel, MMX);
563 else if (Feature == "+sse")
564 SSELevel = std::max(SSELevel, SSE1);
565 else if (Feature == "+sse2")
566 SSELevel = std::max(SSELevel, SSE2);
567 else if (Feature == "+sse3")
568 SSELevel = std::max(SSELevel, SSE3);
569 else if (Feature == "+ssse3")
570 SSELevel = std::max(SSELevel, SSSE3);
571 else if (Feature == "+sse41")
572 SSELevel = std::max(SSELevel, SSE41);
573 else if (Feature == "+sse42")
574 SSELevel = std::max(SSELevel, SSE42);
575 else if (Feature == "+64bit" || Feature == "+slow-bt-mem")
576 // Ignore these features.
577 continue;
578 else
579 return i;
580 }
581 return -1;
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000582}
Chris Lattnerecd49032009-03-02 22:27:17 +0000583
584/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
585/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000586void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
587 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000588 // Target identification.
589 if (PointerWidth == 64) {
590 Define(Defs, "_LP64");
591 Define(Defs, "__LP64__");
592 Define(Defs, "__amd64__");
593 Define(Defs, "__amd64");
594 Define(Defs, "__x86_64");
595 Define(Defs, "__x86_64__");
596 Define(Defs, "__SSE3__");
597 } else {
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000598 DefineStd(Defs, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +0000599 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000600
Chris Lattnerecd49032009-03-02 22:27:17 +0000601 // Target properties.
602 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000603
Chris Lattnerecd49032009-03-02 22:27:17 +0000604 // Subtarget options.
605 Define(Defs, "__nocona");
606 Define(Defs, "__nocona__");
607 Define(Defs, "__tune_nocona__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000608 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +0000609
Chris Lattner6df41af2009-04-19 17:32:33 +0000610 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
611 // functions in glibc header files that use FP Stack inline asm which the
612 // backend can't deal with (PR879).
613 Define(Defs, "__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000614
Chris Lattner96e43572009-03-02 22:40:39 +0000615 // Each case falls through to the previous one here.
616 switch (SSELevel) {
617 case SSE42:
618 Define(Defs, "__SSE4_2__");
619 case SSE41:
620 Define(Defs, "__SSE4_1__");
621 case SSSE3:
622 Define(Defs, "__SSSE3__");
623 case SSE3:
624 Define(Defs, "__SSE3__");
625 case SSE2:
626 Define(Defs, "__SSE2__");
627 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
628 case SSE1:
629 Define(Defs, "__SSE__");
630 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
631 case MMX:
632 Define(Defs, "__MMX__");
633 case NoMMXSSE:
634 break;
635 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000636}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000637
638
Eli Friedman3fd920a2008-08-20 02:34:37 +0000639bool
Anders Carlsson58436352009-02-28 17:11:49 +0000640X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000641 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000642 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000643 default: return false;
644 case 'a': // eax.
645 case 'b': // ebx.
646 case 'c': // ecx.
647 case 'd': // edx.
648 case 'S': // esi.
649 case 'D': // edi.
650 case 'A': // edx:eax.
651 case 't': // top of floating point stack.
652 case 'u': // second from top of floating point stack.
653 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000654 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000655 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000656 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000657 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +0000658 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000659 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +0000660 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000661 case 'N': // unsigned 8-bit integer constant for use with in and out
662 // instructions.
Chris Lattnerd9725f72009-04-26 07:16:29 +0000663 Info.setAllowsRegister();
Eli Friedman3fd920a2008-08-20 02:34:37 +0000664 return true;
665 }
666}
667
668std::string
669X86TargetInfo::convertConstraint(const char Constraint) const {
670 switch (Constraint) {
671 case 'a': return std::string("{ax}");
672 case 'b': return std::string("{bx}");
673 case 'c': return std::string("{cx}");
674 case 'd': return std::string("{dx}");
675 case 'S': return std::string("{si}");
676 case 'D': return std::string("{di}");
677 case 't': // top of floating point stack.
678 return std::string("{st}");
679 case 'u': // second from top of floating point stack.
680 return std::string("{st(1)}"); // second from top of floating point stack.
681 default:
682 return std::string(1, Constraint);
683 }
684}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000685} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000686
687namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000688// X86-32 generic target
689class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000690public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000691 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
692 DoubleAlign = LongLongAlign = 32;
693 LongDoubleWidth = 96;
694 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000695 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
696 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
697 "a0:0:64-f80:32:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +0000698 SizeType = UnsignedInt;
699 PtrDiffType = SignedInt;
700 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +0000701 RegParmMax = 3;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000702 }
703 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000704 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000705 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000706};
707} // end anonymous namespace
708
709namespace {
710// x86-32 Darwin (OS X) target
711class DarwinI386TargetInfo : public X86_32TargetInfo {
712public:
713 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
714 LongDoubleWidth = 128;
715 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +0000716 SizeType = UnsignedLong;
717 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000718 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
719 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
720 "a0:0:64-f80:128:128";
Eli Friedmand88c8a12009-04-19 21:38:35 +0000721 TLSSupported = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000722 }
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000723
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000724 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000725 return IsConstant ? "\01LC" : "\01lC";
726 }
727
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000728 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000729 return "__utf16_string_";
730 }
731
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000732 virtual const char *getUnicodeStringSection() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000733 return "__TEXT,__ustring";
734 }
735
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000736 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000737 return "\01LC";
738 }
739
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000740 virtual void getTargetDefines(const LangOptions &Opts,
741 std::vector<char> &Defines) const {
742 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000743 getDarwinDefines(Defines, Opts);
744 getDarwinOSXDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000745 }
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000746
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000747 /// getDefaultLangOptions - Allow the target to specify default settings for
748 /// various language options. These may be overridden by command line
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000749 /// options.
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000750 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000751 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000752 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000753};
754} // end anonymous namespace
755
756namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000757// x86-32 FreeBSD target
758class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
759public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000760 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman32ca82a2009-03-29 20:31:09 +0000761 X86_32TargetInfo(triple) { }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000762 virtual void getTargetDefines(const LangOptions &Opts,
763 std::vector<char> &Defines) const {
764 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000765 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000766 }
767};
768} // end anonymous namespace
769
770namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000771// x86-32 DragonFly target
772class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
773public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000774 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman32ca82a2009-03-29 20:31:09 +0000775 X86_32TargetInfo(triple) { }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000776 virtual void getTargetDefines(const LangOptions &Opts,
777 std::vector<char> &Defines) const {
778 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000779 getDragonFlyDefines(Opts, Defines);
Chris Lattner5637ef52008-08-23 18:23:14 +0000780 }
781};
782} // end anonymous namespace
783
784namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000785// x86-32 Linux target
786class LinuxX86_32TargetInfo : public X86_32TargetInfo {
787public:
788 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000789 UserLabelPrefix = "";
Eli Friedmanff594f22008-08-21 00:24:02 +0000790 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000791 virtual void getTargetDefines(const LangOptions &Opts,
792 std::vector<char> &Defines) const {
793 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000794 getLinuxDefines(Opts, Defines);
Eli Friedmanff594f22008-08-21 00:24:02 +0000795 }
796};
797} // end anonymous namespace
798
799namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000800// x86-32 Windows target
801class WindowsX86_32TargetInfo : public X86_32TargetInfo {
802public:
803 WindowsX86_32TargetInfo(const std::string& triple)
804 : X86_32TargetInfo(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +0000805 TLSSupported = false;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000806 // FIXME: Fix wchar_t.
807 // FIXME: We should probably enable -fms-extensions by default for
808 // this target.
809 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000810 virtual void getTargetDefines(const LangOptions &Opts,
811 std::vector<char> &Defines) const {
812 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000813 // This list is based off of the the list of things MingW defines
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000814 Define(Defines, "_WIN32");
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000815 DefineStd(Defines, "WIN32", Opts);
816 DefineStd(Defines, "WINNT", Opts);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000817 Define(Defines, "_X86_");
818 Define(Defines, "__MSVCRT__");
819 }
820};
821} // end anonymous namespace
822
823namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000824// x86-64 generic target
825class X86_64TargetInfo : public X86TargetInfo {
826public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000827 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000828 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner22ebe7b2009-01-28 06:58:19 +0000829 DoubleAlign = LongLongAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000830 LongDoubleWidth = 128;
831 LongDoubleAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000832 IntMaxType = SignedLong;
833 UIntMaxType = UnsignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +0000834 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000835
Eli Friedman873f65a2008-08-21 00:13:15 +0000836 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
837 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
838 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000839 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000840 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000841 return "typedef struct __va_list_tag {"
842 " unsigned gp_offset;"
843 " unsigned fp_offset;"
844 " void* overflow_arg_area;"
845 " void* reg_save_area;"
846 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000847 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000848};
849} // end anonymous namespace
850
851namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000852// x86-64 FreeBSD target
853class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
854public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000855 FreeBSDX86_64TargetInfo(const std::string &triple)
856 : X86_64TargetInfo(triple) {}
857 virtual void getTargetDefines(const LangOptions &Opts,
858 std::vector<char> &Defines) const {
859 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000860 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000861 }
862};
863} // end anonymous namespace
864
865namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000866// x86-64 Linux target
867class LinuxX86_64TargetInfo : public X86_64TargetInfo {
868public:
869 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000870 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000871 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000872 virtual void getTargetDefines(const LangOptions &Opts,
873 std::vector<char> &Defines) const {
874 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000875 getLinuxDefines(Opts, Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000876 }
877};
878} // end anonymous namespace
879
880namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000881// x86-64 Darwin (OS X) target
882class DarwinX86_64TargetInfo : public X86_64TargetInfo {
883public:
Eli Friedmand88c8a12009-04-19 21:38:35 +0000884 DarwinX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
885 TLSSupported = false;
886 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000887
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000888 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000889 return IsConstant ? "\01LC" : "\01lC";
890 }
891
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000892 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000893 return "__utf16_string_";
894 }
895
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000896 virtual const char *getUnicodeStringSection() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000897 return "__TEXT,__ustring";
898 }
899
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000900 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000901 return "\01L_unnamed_cfstring_";
902 }
903
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000904 virtual void getTargetDefines(const LangOptions &Opts,
905 std::vector<char> &Defines) const {
906 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000907 getDarwinDefines(Defines, Opts);
908 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000909 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000910
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000911 /// getDefaultLangOptions - Allow the target to specify default settings for
912 /// various language options. These may be overridden by command line
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000913 /// options.
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000914 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000915 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000916 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000917};
918} // end anonymous namespace.
919
Chris Lattner17df24e2008-04-21 18:56:49 +0000920namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000921class ARMTargetInfo : public TargetInfo {
Mike Stump9d54bd72009-04-08 02:07:04 +0000922 enum {
923 Armv4t,
924 Armv5,
925 Armv6,
926 XScale
927 } ArmArch;
Chris Lattner17df24e2008-04-21 18:56:49 +0000928public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000929 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
930 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000931 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
932 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Chris Lattner0dc10262009-04-23 04:22:04 +0000933 if (triple.find("arm-") == 0 || triple.find("armv6-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +0000934 ArmArch = Armv6;
Chris Lattner0dc10262009-04-23 04:22:04 +0000935 else if (triple.find("armv5-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +0000936 ArmArch = Armv5;
Chris Lattner0dc10262009-04-23 04:22:04 +0000937 else if (triple.find("armv4t-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +0000938 ArmArch = Armv4t;
Chris Lattner0dc10262009-04-23 04:22:04 +0000939 else if (triple.find("xscale-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +0000940 ArmArch = XScale;
Chris Lattner0dc10262009-04-23 04:22:04 +0000941 else if (triple.find("armv") == 0) {
942 // FIXME: fuzzy match for other random weird arm triples. This is useful
943 // for the static analyzer and other clients, but probably should be
944 // re-evaluated when codegen is brought up.
945 ArmArch = Armv6;
946 }
Eli Friedmanb5366062008-05-20 14:21:01 +0000947 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000948 virtual void getTargetDefines(const LangOptions &Opts,
949 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000950 // Target identification.
951 Define(Defs, "__arm");
952 Define(Defs, "__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000953
Chris Lattnerecd49032009-03-02 22:27:17 +0000954 // Target properties.
955 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000956
Mike Stump9d54bd72009-04-08 02:07:04 +0000957 // Subtarget options.
958 if (ArmArch == Armv6) {
959 Define(Defs, "__ARM_ARCH_6K__");
960 Define(Defs, "__THUMB_INTERWORK__");
961 } else if (ArmArch == Armv5) {
962 Define(Defs, "__ARM_ARCH_5TEJ__");
963 Define(Defs, "__THUMB_INTERWORK__");
964 Define(Defs, "__SOFTFP__");
965 } else if (ArmArch == Armv4t) {
966 Define(Defs, "__ARM_ARCH_4T__");
967 Define(Defs, "__SOFTFP__");
968 } else if (ArmArch == XScale) {
969 Define(Defs, "__ARM_ARCH_5TE__");
970 Define(Defs, "__XSCALE__");
971 Define(Defs, "__SOFTFP__");
972 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000973 Define(Defs, "__ARMEL__");
Chris Lattner17df24e2008-04-21 18:56:49 +0000974 }
975 virtual void getTargetBuiltins(const Builtin::Info *&Records,
976 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000977 // FIXME: Implement.
978 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000979 NumRecords = 0;
980 }
981 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000982 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +0000983 }
984 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000985 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +0000986 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000987 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner17df24e2008-04-21 18:56:49 +0000988 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000989 // FIXME: Implement.
990 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000991 NumNames = 0;
992 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000993 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner17df24e2008-04-21 18:56:49 +0000994 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000995 // FIXME: Implement.
996 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +0000997 NumAliases = 0;
998 }
Anders Carlsson58436352009-02-28 17:11:49 +0000999 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001000 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001001 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001002 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001003 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001004 case 'l': // r0-r7
1005 case 'h': // r8-r15
1006 case 'w': // VFP Floating point register single precision
1007 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001008 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001009 return true;
1010 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001011 return false;
1012 }
1013 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001014 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001015 return "";
1016 }
1017};
1018} // end anonymous namespace.
1019
Eli Friedmanf05b7722008-08-20 07:44:10 +00001020
1021namespace {
1022class DarwinARMTargetInfo : public ARMTargetInfo {
1023public:
Eli Friedmand88c8a12009-04-19 21:38:35 +00001024 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {
1025 TLSSupported = false;
1026 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001027
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001028 virtual void getTargetDefines(const LangOptions &Opts,
1029 std::vector<char> &Defines) const {
1030 ARMTargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +00001031 getDarwinDefines(Defines, Opts);
1032 getDarwinIPhoneOSDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +00001033 }
1034};
1035} // end anonymous namespace.
1036
Chris Lattner5ba61f02006-10-14 07:39:34 +00001037namespace {
Daniel Dunbarc53305f2009-03-23 16:09:04 +00001038// arm FreeBSD target
1039class FreeBSDARMTargetInfo : public ARMTargetInfo {
1040public:
1041 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1042 virtual void getTargetDefines(const LangOptions &Opts,
1043 std::vector<char> &Defines) const {
1044 ARMTargetInfo::getTargetDefines(Opts, Defines);
1045 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
1046 }
1047};
1048} // end anonymous namespace
1049
1050namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001051class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00001052 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1053 static const char * const GCCRegNames[];
Gabor Greif49991682008-02-21 16:29:08 +00001054public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001055 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1056 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00001057 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1058 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001059 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001060 virtual void getTargetDefines(const LangOptions &Opts,
1061 std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001062 // FIXME: This is missing a lot of important defines; some of the
1063 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +00001064 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +00001065 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +00001066 Define(Defines, "__sparcv8");
1067 }
1068 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1069 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001070 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00001071 }
1072 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001073 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00001074 }
1075 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001076 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +00001077 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001078 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00001079 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001080 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00001081 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001082 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00001083 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001084 // FIXME: Implement!
1085 return false;
Gabor Greif49991682008-02-21 16:29:08 +00001086 }
1087 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001088 // FIXME: Implement!
1089 return "";
Gabor Greif49991682008-02-21 16:29:08 +00001090 }
1091};
1092
Chris Lattner9b415d62009-01-27 01:58:38 +00001093const char * const SparcV8TargetInfo::GCCRegNames[] = {
1094 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1095 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1096 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1097 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1098};
1099
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001100void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00001101 unsigned &NumNames) const {
1102 Names = GCCRegNames;
1103 NumNames = llvm::array_lengthof(GCCRegNames);
1104}
1105
1106const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001107 { { "g0" }, "r0" },
1108 { { "g1" }, "r1" },
1109 { { "g2" }, "r2" },
1110 { { "g3" }, "r3" },
1111 { { "g4" }, "r4" },
1112 { { "g5" }, "r5" },
1113 { { "g6" }, "r6" },
1114 { { "g7" }, "r7" },
1115 { { "o0" }, "r8" },
1116 { { "o1" }, "r9" },
1117 { { "o2" }, "r10" },
1118 { { "o3" }, "r11" },
1119 { { "o4" }, "r12" },
1120 { { "o5" }, "r13" },
1121 { { "o6", "sp" }, "r14" },
1122 { { "o7" }, "r15" },
1123 { { "l0" }, "r16" },
1124 { { "l1" }, "r17" },
1125 { { "l2" }, "r18" },
1126 { { "l3" }, "r19" },
1127 { { "l4" }, "r20" },
1128 { { "l5" }, "r21" },
1129 { { "l6" }, "r22" },
1130 { { "l7" }, "r23" },
1131 { { "i0" }, "r24" },
1132 { { "i1" }, "r25" },
1133 { { "i2" }, "r26" },
1134 { { "i3" }, "r27" },
1135 { { "i4" }, "r28" },
1136 { { "i5" }, "r29" },
1137 { { "i6", "fp" }, "r30" },
1138 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00001139};
1140
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001141void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00001142 unsigned &NumAliases) const {
1143 Aliases = GCCRegAliases;
1144 NumAliases = llvm::array_lengthof(GCCRegAliases);
1145}
Gabor Greif49991682008-02-21 16:29:08 +00001146} // end anonymous namespace.
1147
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001148namespace {
1149class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1150public:
1151 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +00001152 SparcV8TargetInfo(triple) {
1153 SizeType = UnsignedInt;
1154 PtrDiffType = SignedInt;
1155 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001156
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001157 virtual void getTargetDefines(const LangOptions &Opts,
1158 std::vector<char> &Defines) const {
1159 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001160 getSolarisDefines(Defines);
1161 }
1162};
1163} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001164
Chris Lattnerb781dc792008-05-08 05:58:21 +00001165namespace {
1166 class PIC16TargetInfo : public TargetInfo{
1167 public:
1168 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001169 TLSSupported = false;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001170 IntWidth = 16;
1171 LongWidth = LongLongWidth = 32;
1172 PointerWidth = 16;
1173 IntAlign = 8;
1174 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +00001175 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001176 SizeType = UnsignedInt;
1177 IntMaxType = SignedLong;
1178 UIntMaxType = UnsignedLong;
Chris Lattner7e4c81c2009-02-13 22:28:55 +00001179 IntPtrType = SignedShort;
Eli Friedmand50881c2008-11-02 02:43:55 +00001180 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +00001181 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +00001182 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +00001183 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1184 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001185 virtual void getTargetDefines(const LangOptions &Opts,
1186 std::vector<char> &Defines) const {
Chris Lattnerb781dc792008-05-08 05:58:21 +00001187 Define(Defines, "__pic16");
1188 }
1189 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1190 unsigned &NumRecords) const {}
1191 virtual const char *getVAListDeclaration() const { return "";}
1192 virtual const char *getClobbers() const {return "";}
Sanjiv Gupta4c5dfd32009-04-21 06:01:16 +00001193 virtual const char *getTargetPrefix() const {return "pic16";}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194 virtual void getGCCRegNames(const char * const *&Names,
1195 unsigned &NumNames) const {}
1196 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerb781dc792008-05-08 05:58:21 +00001197 TargetInfo::ConstraintInfo &info) const {
1198 return true;
1199 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001200 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerb781dc792008-05-08 05:58:21 +00001201 unsigned &NumAliases) const {}
1202 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1203 };
1204}
1205
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001206namespace {
1207 class MSP430TargetInfo : public TargetInfo {
1208 static const char * const GCCRegNames[];
1209 public:
1210 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1211 TLSSupported = false;
1212 IntWidth = 16;
1213 LongWidth = LongLongWidth = 32;
1214 PointerWidth = 16;
1215 IntAlign = 8;
1216 LongAlign = LongLongAlign = 8;
1217 PointerAlign = 8;
1218 SizeType = UnsignedInt;
1219 IntMaxType = SignedLong;
1220 UIntMaxType = UnsignedLong;
1221 IntPtrType = SignedShort;
1222 PtrDiffType = SignedInt;
1223 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
1224 }
1225 virtual void getTargetDefines(const LangOptions &Opts,
1226 std::vector<char> &Defines) const {
1227 Define(Defines, "MSP430");
1228 Define(Defines, "__MSP430__");
1229 // FIXME: defines for different 'flavours' of MCU
1230 }
1231 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1232 unsigned &NumRecords) const {
1233 // FIXME: Implement.
1234 Records = 0;
1235 NumRecords = 0;
1236 }
1237 virtual const char *getTargetPrefix() const {
1238 return "msp430";
1239 }
1240 virtual void getGCCRegNames(const char * const *&Names,
1241 unsigned &NumNames) const;
1242 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1243 unsigned &NumAliases) const {
1244 // No aliases.
1245 Aliases = 0;
1246 NumAliases = 0;
1247 }
1248 virtual bool validateAsmConstraint(const char *&Name,
1249 TargetInfo::ConstraintInfo &info) const {
1250 // FIXME: implement
1251 return true;
1252 }
1253 virtual const char *getClobbers() const {
1254 // FIXME: Is this really right?
1255 return "";
1256 }
1257 virtual const char *getVAListDeclaration() const {
1258 // FIXME: implement
1259 return "";
1260 }
1261 };
1262
1263 const char * const MSP430TargetInfo::GCCRegNames[] = {
1264 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1265 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1266 };
1267
1268 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
1269 unsigned &NumNames) const {
1270 Names = GCCRegNames;
1271 NumNames = llvm::array_lengthof(GCCRegNames);
1272 }
1273}
1274
1275
Chris Lattner5ba61f02006-10-14 07:39:34 +00001276//===----------------------------------------------------------------------===//
1277// Driver code
1278//===----------------------------------------------------------------------===//
1279
Ted Kremenek0c2bea22007-12-04 17:07:35 +00001280static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +00001281 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1282 TT[4] == '-' && TT[1] - '3' < 6);
1283}
1284
Chris Lattner855d0242008-03-05 01:18:20 +00001285/// CreateTargetInfo - Return the target info object for the specified target
1286/// triple.
1287TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001288 // OS detection; this isn't really anywhere near complete.
1289 // Additions and corrections are welcome.
1290 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +00001291 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001292 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +00001293 bool isSolaris = T.find("-solaris") != std::string::npos;
1294 bool isLinux = T.find("-linux") != std::string::npos;
1295 bool isWindows = T.find("-windows") != std::string::npos ||
1296 T.find("-win32") != std::string::npos ||
1297 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +00001298
Eli Friedman873f65a2008-08-21 00:13:15 +00001299 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1300 if (isDarwin)
1301 return new DarwinPPCTargetInfo(T);
1302 return new PPC32TargetInfo(T);
1303 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001304
Eli Friedman873f65a2008-08-21 00:13:15 +00001305 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1306 if (isDarwin)
1307 return new DarwinPPC64TargetInfo(T);
1308 return new PPC64TargetInfo(T);
1309 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001310
Chris Lattner0dc10262009-04-23 04:22:04 +00001311 if (T.find("armv") == 0 || T.find("arm-") == 0 || T.find("xscale") == 0) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001312 if (isDarwin)
1313 return new DarwinARMTargetInfo(T);
Daniel Dunbarc53305f2009-03-23 16:09:04 +00001314 if (isFreeBSD)
1315 return new FreeBSDARMTargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001316 return new ARMTargetInfo(T);
1317 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001318
Eli Friedman873f65a2008-08-21 00:13:15 +00001319 if (T.find("sparc-") == 0) {
1320 if (isSolaris)
1321 return new SolarisSparcV8TargetInfo(T);
1322 return new SparcV8TargetInfo(T);
1323 }
1324
Chris Lattnerd0b80c82009-02-20 17:04:14 +00001325 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001326 if (isDarwin)
1327 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001328 if (isLinux)
1329 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001330 if (isFreeBSD)
1331 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001332 return new X86_64TargetInfo(T);
1333 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001334
Chris Lattnerb781dc792008-05-08 05:58:21 +00001335 if (T.find("pic16-") == 0)
1336 return new PIC16TargetInfo(T);
1337
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001338 if (T.find("msp430-") == 0)
1339 return new MSP430TargetInfo(T);
1340
Eli Friedman873f65a2008-08-21 00:13:15 +00001341 if (IsX86(T)) {
1342 if (isDarwin)
1343 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001344 if (isLinux)
1345 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001346 if (isDragonFly)
1347 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001348 if (isFreeBSD)
1349 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001350 if (isWindows)
1351 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001352 return new X86_32TargetInfo(T);
1353 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001354
Chris Lattner855d0242008-03-05 01:18:20 +00001355 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001356}