blob: 4e9c3a57a98689ea631914531631e86e4e129581 [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)
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000506 : TargetInfo(triple), SSELevel(NoMMXSSE) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000507 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000508 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000509 virtual void getTargetBuiltins(const Builtin::Info *&Records,
510 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000511 Records = BuiltinInfo;
512 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000513 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000514 virtual const char *getTargetPrefix() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000515 return "x86";
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000516 }
517 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000518 unsigned &NumNames) const {
519 Names = GCCRegNames;
520 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000521 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000522 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000523 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000524 Aliases = GCCRegAliases;
525 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000526 }
Anders Carlsson58436352009-02-28 17:11:49 +0000527 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000528 TargetInfo::ConstraintInfo &info) const;
529 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000530 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000531 return "~{dirflag},~{fpsr},~{flags}";
532 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000533 virtual void getTargetDefines(const LangOptions &Opts,
534 std::vector<char> &Defines) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000535 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
536 const std::string &Name,
537 bool Enabled) const;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000538 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000539 llvm::StringMap<bool> &Features) const;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000540 virtual void HandleTargetFeatures(const llvm::StringMap<bool> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +0000541};
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000542
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000543void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000544 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000545 // FIXME: This should not be here.
546 Features["3dnow"] = false;
547 Features["3dnowa"] = false;
548 Features["mmx"] = false;
549 Features["sse"] = false;
550 Features["sse2"] = false;
551 Features["sse3"] = false;
552 Features["ssse3"] = false;
553 Features["sse41"] = false;
554 Features["sse42"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000555
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000556 // LLVM does not currently recognize this.
557 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000558
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000559 // FIXME: This *really* should not be here.
560
561 // X86_64 always has SSE2.
562 if (PointerWidth == 64)
563 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
564
565 // FIXME: LLVM says core2 has SSSE3, but gcc doesn't define
566 // __SSSE3__ with it? What else is going on here?
567 if (CPU == "core2")
568 Features["ssse3"] = Features["sse3"] = Features["sse2"] = Features["sse"] =
569 Features["mmx"] = true;
Daniel Dunbare5ae0962009-05-06 04:58:14 +0000570 else if (CPU == "yonah")
571 Features["sse3"] = Features["sse2"] = Features["sse"] =
572 Features["mmx"] = true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000573 else if (CPU == "pentium4")
574 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
575}
576
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000577bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
578 const std::string &Name,
579 bool Enabled) const {
580 // FIXME: This *really* should not be here.
581 if (!Features.count(Name) && Name != "sse4")
582 return false;
583
584 if (Enabled) {
585 if (Name == "mmx")
586 Features["mmx"] = true;
587 else if (Name == "sse")
588 Features["mmx"] = Features["sse"] = true;
589 else if (Name == "sse2")
590 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
591 else if (Name == "sse3")
592 Features["mmx"] = Features["sse"] = Features["sse2"] =
593 Features["sse3"] = true;
594 else if (Name == "ssse3")
595 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
596 Features["ssse3"] = true;
597 else if (Name == "sse4")
598 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
599 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
600 else if (Name == "3dnow")
601 Features["3dnowa"] = true;
602 else if (Name == "3dnowa")
603 Features["3dnow"] = Features["3dnowa"] = true;
604 } else {
605 if (Name == "mmx")
606 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
607 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
608 else if (Name == "sse")
609 Features["sse"] = Features["sse2"] = Features["sse3"] =
610 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
611 else if (Name == "sse2")
612 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
613 Features["sse41"] = Features["sse42"] = false;
614 else if (Name == "sse3")
615 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
616 Features["sse42"] = false;
617 else if (Name == "ssse3")
618 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
619 else if (Name == "sse4")
620 Features["sse41"] = Features["sse42"] = false;
621 else if (Name == "3dnow")
622 Features["3dnow"] = Features["3dnowa"] = false;
623 else if (Name == "3dnowa")
624 Features["3dnowa"] = false;
625 }
626
627 return true;
628}
629
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000630/// HandleTargetOptions - Perform initialization based on the user
631/// configured set of features.
632void X86TargetInfo::HandleTargetFeatures(const llvm::StringMap<bool>&Features) {
633 if (Features.lookup("sse42"))
634 SSELevel = SSE42;
635 else if (Features.lookup("sse41"))
636 SSELevel = SSE41;
637 else if (Features.lookup("ssse3"))
638 SSELevel = SSSE3;
639 else if (Features.lookup("sse3"))
640 SSELevel = SSE3;
641 else if (Features.lookup("sse2"))
642 SSELevel = SSE2;
643 else if (Features.lookup("sse"))
644 SSELevel = SSE1;
645 else if (Features.lookup("mmx"))
646 SSELevel = MMX;
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000647}
Chris Lattnerecd49032009-03-02 22:27:17 +0000648
649/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
650/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000651void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
652 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000653 // Target identification.
654 if (PointerWidth == 64) {
655 Define(Defs, "_LP64");
656 Define(Defs, "__LP64__");
657 Define(Defs, "__amd64__");
658 Define(Defs, "__amd64");
659 Define(Defs, "__x86_64");
660 Define(Defs, "__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000661 } else {
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000662 DefineStd(Defs, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +0000663 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000664
Chris Lattnerecd49032009-03-02 22:27:17 +0000665 // Target properties.
666 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000667
Chris Lattnerecd49032009-03-02 22:27:17 +0000668 // Subtarget options.
669 Define(Defs, "__nocona");
670 Define(Defs, "__nocona__");
671 Define(Defs, "__tune_nocona__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000672 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +0000673
Chris Lattner6df41af2009-04-19 17:32:33 +0000674 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
675 // functions in glibc header files that use FP Stack inline asm which the
676 // backend can't deal with (PR879).
677 Define(Defs, "__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000678
Chris Lattner96e43572009-03-02 22:40:39 +0000679 // Each case falls through to the previous one here.
680 switch (SSELevel) {
681 case SSE42:
682 Define(Defs, "__SSE4_2__");
683 case SSE41:
684 Define(Defs, "__SSE4_1__");
685 case SSSE3:
686 Define(Defs, "__SSSE3__");
687 case SSE3:
688 Define(Defs, "__SSE3__");
689 case SSE2:
690 Define(Defs, "__SSE2__");
691 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
692 case SSE1:
693 Define(Defs, "__SSE__");
694 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
695 case MMX:
696 Define(Defs, "__MMX__");
697 case NoMMXSSE:
698 break;
699 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000700}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000701
702
Eli Friedman3fd920a2008-08-20 02:34:37 +0000703bool
Anders Carlsson58436352009-02-28 17:11:49 +0000704X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000705 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000706 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000707 default: return false;
708 case 'a': // eax.
709 case 'b': // ebx.
710 case 'c': // ecx.
711 case 'd': // edx.
712 case 'S': // esi.
713 case 'D': // edi.
714 case 'A': // edx:eax.
715 case 't': // top of floating point stack.
716 case 'u': // second from top of floating point stack.
717 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000718 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000719 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000720 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000721 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +0000722 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000723 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +0000724 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000725 case 'N': // unsigned 8-bit integer constant for use with in and out
726 // instructions.
Chris Lattnerd9725f72009-04-26 07:16:29 +0000727 Info.setAllowsRegister();
Eli Friedman3fd920a2008-08-20 02:34:37 +0000728 return true;
729 }
730}
731
732std::string
733X86TargetInfo::convertConstraint(const char Constraint) const {
734 switch (Constraint) {
735 case 'a': return std::string("{ax}");
736 case 'b': return std::string("{bx}");
737 case 'c': return std::string("{cx}");
738 case 'd': return std::string("{dx}");
739 case 'S': return std::string("{si}");
740 case 'D': return std::string("{di}");
741 case 't': // top of floating point stack.
742 return std::string("{st}");
743 case 'u': // second from top of floating point stack.
744 return std::string("{st(1)}"); // second from top of floating point stack.
745 default:
746 return std::string(1, Constraint);
747 }
748}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000749} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000750
751namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000752// X86-32 generic target
753class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000754public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000755 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
756 DoubleAlign = LongLongAlign = 32;
757 LongDoubleWidth = 96;
758 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000759 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
760 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
761 "a0:0:64-f80:32:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +0000762 SizeType = UnsignedInt;
763 PtrDiffType = SignedInt;
764 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +0000765 RegParmMax = 3;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000766 }
767 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000768 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000769 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000770};
771} // end anonymous namespace
772
773namespace {
774// x86-32 Darwin (OS X) target
775class DarwinI386TargetInfo : public X86_32TargetInfo {
776public:
777 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
778 LongDoubleWidth = 128;
779 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +0000780 SizeType = UnsignedLong;
781 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000782 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
783 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
784 "a0:0:64-f80:128:128";
Eli Friedmand88c8a12009-04-19 21:38:35 +0000785 TLSSupported = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000786 }
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000787
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000788 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000789 return IsConstant ? "\01LC" : "\01lC";
790 }
791
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000792 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000793 return "__utf16_string_";
794 }
795
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000796 virtual const char *getUnicodeStringSection() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000797 return "__TEXT,__ustring";
798 }
799
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000800 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000801 return "\01LC";
802 }
803
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000804 virtual void getTargetDefines(const LangOptions &Opts,
805 std::vector<char> &Defines) const {
806 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000807 getDarwinDefines(Defines, Opts);
808 getDarwinOSXDefines(Defines, getTargetTriple());
Eli Friedman3fd920a2008-08-20 02:34:37 +0000809 }
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000810
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000811 /// getDefaultLangOptions - Allow the target to specify default settings for
812 /// various language options. These may be overridden by command line
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000813 /// options.
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000814 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000815 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000816 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000817};
818} // end anonymous namespace
819
820namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000821// x86-32 FreeBSD target
822class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
823public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000824 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman32ca82a2009-03-29 20:31:09 +0000825 X86_32TargetInfo(triple) { }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000826 virtual void getTargetDefines(const LangOptions &Opts,
827 std::vector<char> &Defines) const {
828 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000829 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000830 }
831};
832} // end anonymous namespace
833
834namespace {
Chris Lattner5637ef52008-08-23 18:23:14 +0000835// x86-32 DragonFly target
836class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
837public:
Eli Friedmand50881c2008-11-02 02:43:55 +0000838 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman32ca82a2009-03-29 20:31:09 +0000839 X86_32TargetInfo(triple) { }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000840 virtual void getTargetDefines(const LangOptions &Opts,
841 std::vector<char> &Defines) const {
842 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000843 getDragonFlyDefines(Opts, Defines);
Chris Lattner5637ef52008-08-23 18:23:14 +0000844 }
845};
846} // end anonymous namespace
847
848namespace {
Eli Friedmanff594f22008-08-21 00:24:02 +0000849// x86-32 Linux target
850class LinuxX86_32TargetInfo : public X86_32TargetInfo {
851public:
852 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000853 UserLabelPrefix = "";
Eli Friedmanff594f22008-08-21 00:24:02 +0000854 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000855 virtual void getTargetDefines(const LangOptions &Opts,
856 std::vector<char> &Defines) const {
857 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000858 getLinuxDefines(Opts, Defines);
Eli Friedmanff594f22008-08-21 00:24:02 +0000859 }
860};
861} // end anonymous namespace
862
863namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000864// x86-32 Windows target
865class WindowsX86_32TargetInfo : public X86_32TargetInfo {
866public:
867 WindowsX86_32TargetInfo(const std::string& triple)
868 : X86_32TargetInfo(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +0000869 TLSSupported = false;
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000870 // FIXME: Fix wchar_t.
871 // FIXME: We should probably enable -fms-extensions by default for
872 // this target.
873 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000874 virtual void getTargetDefines(const LangOptions &Opts,
875 std::vector<char> &Defines) const {
876 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000877 // This list is based off of the the list of things MingW defines
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000878 Define(Defines, "_WIN32");
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000879 DefineStd(Defines, "WIN32", Opts);
880 DefineStd(Defines, "WINNT", Opts);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000881 Define(Defines, "_X86_");
882 Define(Defines, "__MSVCRT__");
883 }
884};
885} // end anonymous namespace
886
887namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000888// x86-64 generic target
889class X86_64TargetInfo : public X86TargetInfo {
890public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000891 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000892 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner22ebe7b2009-01-28 06:58:19 +0000893 DoubleAlign = LongLongAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000894 LongDoubleWidth = 128;
895 LongDoubleAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000896 IntMaxType = SignedLong;
897 UIntMaxType = UnsignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +0000898 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +0000899
Eli Friedman873f65a2008-08-21 00:13:15 +0000900 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
901 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
902 "a0:0:64-f80:128:128";
Chris Lattner10a5b382007-01-29 05:24:35 +0000903 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000904 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000905 return "typedef struct __va_list_tag {"
906 " unsigned gp_offset;"
907 " unsigned fp_offset;"
908 " void* overflow_arg_area;"
909 " void* reg_save_area;"
910 "} __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000911 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000912};
913} // end anonymous namespace
914
915namespace {
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000916// x86-64 FreeBSD target
917class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
918public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000919 FreeBSDX86_64TargetInfo(const std::string &triple)
920 : X86_64TargetInfo(triple) {}
921 virtual void getTargetDefines(const LangOptions &Opts,
922 std::vector<char> &Defines) const {
923 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000924 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +0000925 }
926};
927} // end anonymous namespace
928
929namespace {
Daniel Dunbard0921de2008-09-23 17:37:57 +0000930// x86-64 Linux target
931class LinuxX86_64TargetInfo : public X86_64TargetInfo {
932public:
933 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner4ecd7532008-10-05 19:44:25 +0000934 UserLabelPrefix = "";
Daniel Dunbard0921de2008-09-23 17:37:57 +0000935 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000936 virtual void getTargetDefines(const LangOptions &Opts,
937 std::vector<char> &Defines) const {
938 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnera1321f12009-03-20 15:55:34 +0000939 getLinuxDefines(Opts, Defines);
Daniel Dunbard0921de2008-09-23 17:37:57 +0000940 }
941};
942} // end anonymous namespace
943
944namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000945// x86-64 Darwin (OS X) target
946class DarwinX86_64TargetInfo : public X86_64TargetInfo {
947public:
Eli Friedmand88c8a12009-04-19 21:38:35 +0000948 DarwinX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
949 TLSSupported = false;
950 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000951
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000953 return IsConstant ? "\01LC" : "\01lC";
954 }
955
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000956 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000957 return "__utf16_string_";
958 }
959
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000960 virtual const char *getUnicodeStringSection() const {
Daniel Dunbarfd6cfcf2009-04-03 00:57:44 +0000961 return "__TEXT,__ustring";
962 }
963
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000964 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbar08b216a2009-03-31 23:42:16 +0000965 return "\01L_unnamed_cfstring_";
966 }
967
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000968 virtual void getTargetDefines(const LangOptions &Opts,
969 std::vector<char> &Defines) const {
970 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000971 getDarwinDefines(Defines, Opts);
972 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000973 }
Daniel Dunbarb8767ac2008-08-23 08:43:39 +0000974
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000975 /// getDefaultLangOptions - Allow the target to specify default settings for
976 /// various language options. These may be overridden by command line
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000977 /// options.
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000978 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000979 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerc7c6dd42008-12-04 22:54:33 +0000980 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000981};
982} // end anonymous namespace.
983
Chris Lattner17df24e2008-04-21 18:56:49 +0000984namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +0000985class ARMTargetInfo : public TargetInfo {
Mike Stump9d54bd72009-04-08 02:07:04 +0000986 enum {
987 Armv4t,
988 Armv5,
989 Armv6,
990 XScale
991 } ArmArch;
Chris Lattner17df24e2008-04-21 18:56:49 +0000992public:
Eli Friedmanf05b7722008-08-20 07:44:10 +0000993 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
994 // FIXME: Are the defaults correct for ARM?
Eli Friedman873f65a2008-08-21 00:13:15 +0000995 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
996 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Chris Lattner0dc10262009-04-23 04:22:04 +0000997 if (triple.find("arm-") == 0 || triple.find("armv6-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +0000998 ArmArch = Armv6;
Chris Lattner0dc10262009-04-23 04:22:04 +0000999 else if (triple.find("armv5-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +00001000 ArmArch = Armv5;
Chris Lattner0dc10262009-04-23 04:22:04 +00001001 else if (triple.find("armv4t-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +00001002 ArmArch = Armv4t;
Chris Lattner0dc10262009-04-23 04:22:04 +00001003 else if (triple.find("xscale-") == 0)
Mike Stump9d54bd72009-04-08 02:07:04 +00001004 ArmArch = XScale;
Chris Lattner0dc10262009-04-23 04:22:04 +00001005 else if (triple.find("armv") == 0) {
1006 // FIXME: fuzzy match for other random weird arm triples. This is useful
1007 // for the static analyzer and other clients, but probably should be
1008 // re-evaluated when codegen is brought up.
1009 ArmArch = Armv6;
1010 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001011 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001012 virtual void getTargetDefines(const LangOptions &Opts,
1013 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001014 // Target identification.
1015 Define(Defs, "__arm");
1016 Define(Defs, "__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001017
Chris Lattnerecd49032009-03-02 22:27:17 +00001018 // Target properties.
1019 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001020
Mike Stump9d54bd72009-04-08 02:07:04 +00001021 // Subtarget options.
1022 if (ArmArch == Armv6) {
1023 Define(Defs, "__ARM_ARCH_6K__");
1024 Define(Defs, "__THUMB_INTERWORK__");
1025 } else if (ArmArch == Armv5) {
1026 Define(Defs, "__ARM_ARCH_5TEJ__");
1027 Define(Defs, "__THUMB_INTERWORK__");
1028 Define(Defs, "__SOFTFP__");
1029 } else if (ArmArch == Armv4t) {
1030 Define(Defs, "__ARM_ARCH_4T__");
1031 Define(Defs, "__SOFTFP__");
1032 } else if (ArmArch == XScale) {
1033 Define(Defs, "__ARM_ARCH_5TE__");
1034 Define(Defs, "__XSCALE__");
1035 Define(Defs, "__SOFTFP__");
1036 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001037 Define(Defs, "__ARMEL__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001038 }
1039 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1040 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001041 // FIXME: Implement.
1042 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +00001043 NumRecords = 0;
1044 }
1045 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001046 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001047 }
1048 virtual const char *getTargetPrefix() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001049 return "arm";
Chris Lattner17df24e2008-04-21 18:56:49 +00001050 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001051 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner17df24e2008-04-21 18:56:49 +00001052 unsigned &NumNames) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001053 // FIXME: Implement.
1054 Names = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +00001055 NumNames = 0;
1056 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001057 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner17df24e2008-04-21 18:56:49 +00001058 unsigned &NumAliases) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001059 // FIXME: Implement.
1060 Aliases = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +00001061 NumAliases = 0;
1062 }
Anders Carlsson58436352009-02-28 17:11:49 +00001063 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001064 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001065 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001066 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001067 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001068 case 'l': // r0-r7
1069 case 'h': // r8-r15
1070 case 'w': // VFP Floating point register single precision
1071 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001072 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001073 return true;
1074 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001075 return false;
1076 }
1077 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001078 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001079 return "";
1080 }
1081};
1082} // end anonymous namespace.
1083
Eli Friedmanf05b7722008-08-20 07:44:10 +00001084
1085namespace {
1086class DarwinARMTargetInfo : public ARMTargetInfo {
1087public:
Eli Friedmand88c8a12009-04-19 21:38:35 +00001088 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {
1089 TLSSupported = false;
1090 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001091
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001092 virtual void getTargetDefines(const LangOptions &Opts,
1093 std::vector<char> &Defines) const {
1094 ARMTargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar497ff132009-04-10 19:52:24 +00001095 getDarwinDefines(Defines, Opts);
1096 getDarwinIPhoneOSDefines(Defines, getTargetTriple());
Eli Friedmanf05b7722008-08-20 07:44:10 +00001097 }
1098};
1099} // end anonymous namespace.
1100
Chris Lattner5ba61f02006-10-14 07:39:34 +00001101namespace {
Daniel Dunbarc53305f2009-03-23 16:09:04 +00001102// arm FreeBSD target
1103class FreeBSDARMTargetInfo : public ARMTargetInfo {
1104public:
1105 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1106 virtual void getTargetDefines(const LangOptions &Opts,
1107 std::vector<char> &Defines) const {
1108 ARMTargetInfo::getTargetDefines(Opts, Defines);
1109 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
1110 }
1111};
1112} // end anonymous namespace
1113
1114namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001115class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00001116 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1117 static const char * const GCCRegNames[];
Gabor Greif49991682008-02-21 16:29:08 +00001118public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001119 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1120 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00001121 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1122 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001123 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001124 virtual void getTargetDefines(const LangOptions &Opts,
1125 std::vector<char> &Defines) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001126 // FIXME: This is missing a lot of important defines; some of the
1127 // missing stuff is likely to break system headers.
Gabor Greif49991682008-02-21 16:29:08 +00001128 Define(Defines, "__sparc");
Eli Friedmanb2bef7c2008-05-25 05:26:09 +00001129 Define(Defines, "__sparc__");
Gabor Greif49991682008-02-21 16:29:08 +00001130 Define(Defines, "__sparcv8");
1131 }
1132 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1133 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001134 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00001135 }
1136 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001137 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00001138 }
1139 virtual const char *getTargetPrefix() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001140 return "sparc";
Gabor Greif49991682008-02-21 16:29:08 +00001141 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001142 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00001143 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001144 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00001145 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001146 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00001147 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001148 // FIXME: Implement!
1149 return false;
Gabor Greif49991682008-02-21 16:29:08 +00001150 }
1151 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001152 // FIXME: Implement!
1153 return "";
Gabor Greif49991682008-02-21 16:29:08 +00001154 }
1155};
1156
Chris Lattner9b415d62009-01-27 01:58:38 +00001157const char * const SparcV8TargetInfo::GCCRegNames[] = {
1158 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1159 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1160 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1161 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1162};
1163
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001164void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00001165 unsigned &NumNames) const {
1166 Names = GCCRegNames;
1167 NumNames = llvm::array_lengthof(GCCRegNames);
1168}
1169
1170const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001171 { { "g0" }, "r0" },
1172 { { "g1" }, "r1" },
1173 { { "g2" }, "r2" },
1174 { { "g3" }, "r3" },
1175 { { "g4" }, "r4" },
1176 { { "g5" }, "r5" },
1177 { { "g6" }, "r6" },
1178 { { "g7" }, "r7" },
1179 { { "o0" }, "r8" },
1180 { { "o1" }, "r9" },
1181 { { "o2" }, "r10" },
1182 { { "o3" }, "r11" },
1183 { { "o4" }, "r12" },
1184 { { "o5" }, "r13" },
1185 { { "o6", "sp" }, "r14" },
1186 { { "o7" }, "r15" },
1187 { { "l0" }, "r16" },
1188 { { "l1" }, "r17" },
1189 { { "l2" }, "r18" },
1190 { { "l3" }, "r19" },
1191 { { "l4" }, "r20" },
1192 { { "l5" }, "r21" },
1193 { { "l6" }, "r22" },
1194 { { "l7" }, "r23" },
1195 { { "i0" }, "r24" },
1196 { { "i1" }, "r25" },
1197 { { "i2" }, "r26" },
1198 { { "i3" }, "r27" },
1199 { { "i4" }, "r28" },
1200 { { "i5" }, "r29" },
1201 { { "i6", "fp" }, "r30" },
1202 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00001203};
1204
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001205void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00001206 unsigned &NumAliases) const {
1207 Aliases = GCCRegAliases;
1208 NumAliases = llvm::array_lengthof(GCCRegAliases);
1209}
Gabor Greif49991682008-02-21 16:29:08 +00001210} // end anonymous namespace.
1211
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001212namespace {
1213class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1214public:
1215 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmand50881c2008-11-02 02:43:55 +00001216 SparcV8TargetInfo(triple) {
1217 SizeType = UnsignedInt;
1218 PtrDiffType = SignedInt;
1219 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001220
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001221 virtual void getTargetDefines(const LangOptions &Opts,
1222 std::vector<char> &Defines) const {
1223 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001224 getSolarisDefines(Defines);
1225 }
1226};
1227} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001228
Chris Lattnerb781dc792008-05-08 05:58:21 +00001229namespace {
1230 class PIC16TargetInfo : public TargetInfo{
1231 public:
1232 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001233 TLSSupported = false;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001234 IntWidth = 16;
1235 LongWidth = LongLongWidth = 32;
1236 PointerWidth = 16;
1237 IntAlign = 8;
1238 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +00001239 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001240 SizeType = UnsignedInt;
1241 IntMaxType = SignedLong;
1242 UIntMaxType = UnsignedLong;
Chris Lattner7e4c81c2009-02-13 22:28:55 +00001243 IntPtrType = SignedShort;
Eli Friedmand50881c2008-11-02 02:43:55 +00001244 PtrDiffType = SignedInt;
Sanjiv Gupta14f18f32008-08-18 10:05:22 +00001245 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattnerb781dc792008-05-08 05:58:21 +00001246 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +00001247 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1248 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001249 virtual void getTargetDefines(const LangOptions &Opts,
1250 std::vector<char> &Defines) const {
Chris Lattnerb781dc792008-05-08 05:58:21 +00001251 Define(Defines, "__pic16");
1252 }
1253 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1254 unsigned &NumRecords) const {}
1255 virtual const char *getVAListDeclaration() const { return "";}
1256 virtual const char *getClobbers() const {return "";}
Sanjiv Gupta4c5dfd32009-04-21 06:01:16 +00001257 virtual const char *getTargetPrefix() const {return "pic16";}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001258 virtual void getGCCRegNames(const char * const *&Names,
1259 unsigned &NumNames) const {}
1260 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerb781dc792008-05-08 05:58:21 +00001261 TargetInfo::ConstraintInfo &info) const {
1262 return true;
1263 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001264 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerb781dc792008-05-08 05:58:21 +00001265 unsigned &NumAliases) const {}
1266 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1267 };
1268}
1269
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001270namespace {
1271 class MSP430TargetInfo : public TargetInfo {
1272 static const char * const GCCRegNames[];
1273 public:
1274 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1275 TLSSupported = false;
1276 IntWidth = 16;
1277 LongWidth = LongLongWidth = 32;
1278 PointerWidth = 16;
1279 IntAlign = 8;
1280 LongAlign = LongLongAlign = 8;
1281 PointerAlign = 8;
1282 SizeType = UnsignedInt;
1283 IntMaxType = SignedLong;
1284 UIntMaxType = UnsignedLong;
1285 IntPtrType = SignedShort;
1286 PtrDiffType = SignedInt;
1287 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
1288 }
1289 virtual void getTargetDefines(const LangOptions &Opts,
1290 std::vector<char> &Defines) const {
1291 Define(Defines, "MSP430");
1292 Define(Defines, "__MSP430__");
1293 // FIXME: defines for different 'flavours' of MCU
1294 }
1295 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1296 unsigned &NumRecords) const {
1297 // FIXME: Implement.
1298 Records = 0;
1299 NumRecords = 0;
1300 }
1301 virtual const char *getTargetPrefix() const {
1302 return "msp430";
1303 }
1304 virtual void getGCCRegNames(const char * const *&Names,
1305 unsigned &NumNames) const;
1306 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1307 unsigned &NumAliases) const {
1308 // No aliases.
1309 Aliases = 0;
1310 NumAliases = 0;
1311 }
1312 virtual bool validateAsmConstraint(const char *&Name,
1313 TargetInfo::ConstraintInfo &info) const {
1314 // FIXME: implement
1315 return true;
1316 }
1317 virtual const char *getClobbers() const {
1318 // FIXME: Is this really right?
1319 return "";
1320 }
1321 virtual const char *getVAListDeclaration() const {
1322 // FIXME: implement
1323 return "";
1324 }
1325 };
1326
1327 const char * const MSP430TargetInfo::GCCRegNames[] = {
1328 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1329 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1330 };
1331
1332 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
1333 unsigned &NumNames) const {
1334 Names = GCCRegNames;
1335 NumNames = llvm::array_lengthof(GCCRegNames);
1336 }
1337}
1338
1339
Chris Lattner5ba61f02006-10-14 07:39:34 +00001340//===----------------------------------------------------------------------===//
1341// Driver code
1342//===----------------------------------------------------------------------===//
1343
Ted Kremenek0c2bea22007-12-04 17:07:35 +00001344static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +00001345 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1346 TT[4] == '-' && TT[1] - '3' < 6);
1347}
1348
Chris Lattner855d0242008-03-05 01:18:20 +00001349/// CreateTargetInfo - Return the target info object for the specified target
1350/// triple.
1351TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001352 // OS detection; this isn't really anywhere near complete.
1353 // Additions and corrections are welcome.
1354 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattner5637ef52008-08-23 18:23:14 +00001355 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001356 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman873f65a2008-08-21 00:13:15 +00001357 bool isSolaris = T.find("-solaris") != std::string::npos;
1358 bool isLinux = T.find("-linux") != std::string::npos;
1359 bool isWindows = T.find("-windows") != std::string::npos ||
1360 T.find("-win32") != std::string::npos ||
1361 T.find("-mingw") != std::string::npos;
Eli Friedmanb5366062008-05-20 14:21:01 +00001362
Eli Friedman873f65a2008-08-21 00:13:15 +00001363 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1364 if (isDarwin)
1365 return new DarwinPPCTargetInfo(T);
1366 return new PPC32TargetInfo(T);
1367 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001368
Eli Friedman873f65a2008-08-21 00:13:15 +00001369 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1370 if (isDarwin)
1371 return new DarwinPPC64TargetInfo(T);
1372 return new PPC64TargetInfo(T);
1373 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001374
Chris Lattner0dc10262009-04-23 04:22:04 +00001375 if (T.find("armv") == 0 || T.find("arm-") == 0 || T.find("xscale") == 0) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001376 if (isDarwin)
1377 return new DarwinARMTargetInfo(T);
Daniel Dunbarc53305f2009-03-23 16:09:04 +00001378 if (isFreeBSD)
1379 return new FreeBSDARMTargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001380 return new ARMTargetInfo(T);
1381 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001382
Eli Friedman873f65a2008-08-21 00:13:15 +00001383 if (T.find("sparc-") == 0) {
1384 if (isSolaris)
1385 return new SolarisSparcV8TargetInfo(T);
1386 return new SparcV8TargetInfo(T);
1387 }
1388
Chris Lattnerd0b80c82009-02-20 17:04:14 +00001389 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001390 if (isDarwin)
1391 return new DarwinX86_64TargetInfo(T);
Daniel Dunbard0921de2008-09-23 17:37:57 +00001392 if (isLinux)
1393 return new LinuxX86_64TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001394 if (isFreeBSD)
1395 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001396 return new X86_64TargetInfo(T);
1397 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001398
Chris Lattnerb781dc792008-05-08 05:58:21 +00001399 if (T.find("pic16-") == 0)
1400 return new PIC16TargetInfo(T);
1401
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001402 if (T.find("msp430-") == 0)
1403 return new MSP430TargetInfo(T);
1404
Eli Friedman873f65a2008-08-21 00:13:15 +00001405 if (IsX86(T)) {
1406 if (isDarwin)
1407 return new DarwinI386TargetInfo(T);
Eli Friedmanff594f22008-08-21 00:24:02 +00001408 if (isLinux)
1409 return new LinuxX86_32TargetInfo(T);
Chris Lattner5637ef52008-08-23 18:23:14 +00001410 if (isDragonFly)
1411 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner3c3e2cc2008-10-16 17:04:31 +00001412 if (isFreeBSD)
1413 return new FreeBSDX86_32TargetInfo(T);
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001414 if (isWindows)
1415 return new WindowsX86_32TargetInfo(T);
Eli Friedman873f65a2008-08-21 00:13:15 +00001416 return new X86_32TargetInfo(T);
1417 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001418
Chris Lattner855d0242008-03-05 01:18:20 +00001419 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +00001420}