blob: bb568b149b46711a827b6d3a0254aaebda686e25 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Douglas Gregorb1152d82009-02-16 21:58:21 +000015// FIXME: Layering violation
Reid Spencer5f016e22007-07-11 17:01:13 +000016#include "clang/AST/Builtins.h"
Anders Carlsson564f1de2007-12-09 23:17:02 +000017#include "clang/AST/TargetBuiltins.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000018#include "clang/Basic/TargetInfo.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000019#include "clang/Basic/LangOptions.h"
Anders Carlsson3346ae62007-11-24 23:38:12 +000020#include "llvm/ADT/STLExtras.h"
Eli Friedman25531262008-05-20 14:27:34 +000021#include "llvm/ADT/APFloat.h"
Chris Lattnerca45cff2009-03-20 16:06:38 +000022#include "llvm/ADT/SmallString.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000023using namespace clang;
24
Reid Spencer5f016e22007-07-11 17:01:13 +000025//===----------------------------------------------------------------------===//
26// Common code shared among targets.
27//===----------------------------------------------------------------------===//
28
Chris Lattnerd15fa822007-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 Lattnerca45cff2009-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 Korobeynikova7c47172009-05-03 13:42:53 +000042static void DefineStd(std::vector<char> &Buf, const char *MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000045
Chris Lattnerca45cff2009-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 Korobeynikova7c47172009-05-03 13:42:53 +000050
Chris Lattnerca45cff2009-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 Korobeynikova7c47172009-05-03 13:42:53 +000056
Chris Lattnerca45cff2009-03-20 16:06:38 +000057 // Define __unix__.
58 TmpStr += "__";
59 Define(Buf, TmpStr.c_str());
60}
61
Chris Lattnerd29b6302008-10-05 21:50:58 +000062//===----------------------------------------------------------------------===//
63// Defines specific to certain operating systems.
64//===----------------------------------------------------------------------===//
65
Eli Friedman01b86682008-08-20 07:28:14 +000066static void getSolarisDefines(std::vector<char> &Defs) {
67 Define(Defs, "__SUN__");
68 Define(Defs, "__SOLARIS__");
69}
Reid Spencer5f016e22007-07-11 17:01:13 +000070
Chris Lattner318ca712009-03-20 15:55:34 +000071static void getFreeBSDDefines(const LangOptions &Opts, bool is64Bit,
72 const char *Triple, std::vector<char> &Defs) {
Chris Lattnerfd0269d2008-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 Lattnerca45cff2009-03-20 16:06:38 +000085 DefineStd(Defs, "unix", Opts);
Anton Korobeynikov2793bda2009-02-14 16:42:50 +000086 Define(Defs, "__ELF__", "1");
Chris Lattnerfd0269d2008-10-16 17:04:31 +000087 if (is64Bit) {
88 Define(Defs, "__LP64__");
89 }
90}
91
Chris Lattner318ca712009-03-20 15:55:34 +000092static void getDragonFlyDefines(const LangOptions &Opts,
93 std::vector<char> &Defs) {
Chris Lattnerd29b6302008-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 Lattnerca45cff2009-03-20 16:06:38 +0000100 DefineStd(Defs, "unix", Opts);
Chris Lattnerd29b6302008-10-05 21:50:58 +0000101}
102
Chris Lattner318ca712009-03-20 15:55:34 +0000103static void getLinuxDefines(const LangOptions &Opts, std::vector<char> &Defs) {
Chris Lattnerd29b6302008-10-05 21:50:58 +0000104 // Linux defines; list based off of gcc output
Chris Lattnerca45cff2009-03-20 16:06:38 +0000105 DefineStd(Defs, "unix", Opts);
106 DefineStd(Defs, "linux", Opts);
Chris Lattnerd29b6302008-10-05 21:50:58 +0000107 Define(Defs, "__gnu_linux__");
Argyrios Kyrtzidis487cdee2009-02-14 15:02:45 +0000108 Define(Defs, "__ELF__", "1");
Chris Lattnerd29b6302008-10-05 21:50:58 +0000109}
110
Chris Lattnerae0ee032008-12-04 23:20:07 +0000111/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000112/// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
Chris Lattnerae0ee032008-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 Dunbar8d33cd72009-04-10 19:52:24 +0000115static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min, unsigned &Revision) {
116 Maj = Min = Revision = 0;
Chris Lattnerae0ee032008-12-04 23:20:07 +0000117 const char *Darwin = strstr(Triple, "-darwin");
118 if (Darwin == 0) return false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000119
Chris Lattnerae0ee032008-12-04 23:20:07 +0000120 Darwin += strlen("-darwin");
121 if (Darwin[0] < '0' || Darwin[0] > '9')
122 return true;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000123
Chris Lattnerae0ee032008-12-04 23:20:07 +0000124 Maj = Darwin[0]-'0';
125 ++Darwin;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000126
Chris Lattnerae0ee032008-12-04 23:20:07 +0000127 // Handle "darwin11".
128 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000129 Maj = Maj*10 + (Darwin[0] - '0');
Chris Lattnerae0ee032008-12-04 23:20:07 +0000130 ++Darwin;
131 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000132
Chris Lattnerae0ee032008-12-04 23:20:07 +0000133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000134 if (Darwin[0] != '.')
135 return true;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000136
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000137 ++Darwin;
138 if (Darwin[0] < '0' || Darwin[0] > '9')
139 return true;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000140
Daniel Dunbar8d33cd72009-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 Korobeynikova7c47172009-05-03 13:42:53 +0000149
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000150 // Handle revision darwin8.9.1
151 if (Darwin[0] != '.')
152 return true;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000153
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000154 ++Darwin;
155 if (Darwin[0] < '0' || Darwin[0] > '9')
156 return true;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000157
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000158 Revision = Darwin[0]-'0';
159 ++Darwin;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000160
Daniel Dunbar8d33cd72009-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 Korobeynikova7c47172009-05-03 13:42:53 +0000165
Chris Lattnerae0ee032008-12-04 23:20:07 +0000166 return true;
167}
168
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000169static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
Eli Friedman618234a2008-08-20 02:34:37 +0000170 Define(Defs, "__APPLE__");
171 Define(Defs, "__MACH__");
Chris Lattnerd427ad42009-02-05 07:19:24 +0000172 Define(Defs, "OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000173
Chris Lattner10d24272009-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 Korobeynikova7c47172009-05-03 13:42:53 +0000176
Chris Lattner10d24272009-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 Lattner3a5cbd32009-04-07 04:48:21 +0000179 Define(Defs, "__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +0000180 else
Chris Lattner3a5cbd32009-04-07 04:48:21 +0000181 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000182}
183
184static void getDarwinOSXDefines(std::vector<char> &Defs, const char *Triple) {
Chris Lattner8b30c412008-09-30 01:00:25 +0000185 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000186 unsigned Maj, Min, Rev;
187 if (getDarwinNumber(Triple, Maj, Min, Rev)) {
188 char MacOSXStr[] = "1000";
Chris Lattnerae0ee032008-12-04 23:20:07 +0000189 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
190 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000191 MacOSXStr[2] = '0' + Maj-4;
192 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000193
Daniel Dunbar8d33cd72009-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 Korobeynikova7c47172009-05-03 13:42:53 +0000201static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
Daniel Dunbar8d33cd72009-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 Lattner8b30c412008-09-30 01:00:25 +0000212 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000213
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000214 // Handle minor version: 2.2 -> darwin9.2.2 -> 20200
215 iPhoneOSStr[2] = std::min(Rev, 9U)+'0';
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000216 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000217 iPhoneOSStr);
Chris Lattner8b30c412008-09-30 01:00:25 +0000218 }
Eli Friedman618234a2008-08-20 02:34:37 +0000219}
Reid Spencer5f016e22007-07-11 17:01:13 +0000220
Chris Lattnerae0ee032008-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 Korobeynikova7c47172009-05-03 13:42:53 +0000225
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000226 unsigned Maj, Min, Rev;
227 if (!getDarwinNumber(Triple, Maj, Min, Rev))
Chris Lattnerae0ee032008-12-04 23:20:07 +0000228 return;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000229
Chris Lattnerae0ee032008-12-04 23:20:07 +0000230 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahaniana30b17b2009-02-12 17:54:33 +0000231 // As does nonfragile-abi for 64bit mode
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000232 if (Maj > 9)
Chris Lattnerae0ee032008-12-04 23:20:07 +0000233 Opts.Blocks = 1;
Fariborz Jahanian66a5c2c2009-02-24 23:34:44 +0000234
Fariborz Jahanian84d01332009-02-24 23:38:42 +0000235 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
236 Opts.ObjCNonFragileABI = 1;
Chris Lattnerae0ee032008-12-04 23:20:07 +0000237}
238
239
Chris Lattnerd29b6302008-10-05 21:50:58 +0000240//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000241// Specific target implementations.
242//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000243
Eli Friedmane4277982008-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 {
Reid Spencer5f016e22007-07-11 17:01:13 +0000257 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000258 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000259 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000260
Chris Lattner33328642009-03-20 15:52:06 +0000261 virtual void getTargetDefines(const LangOptions &Opts,
262 std::vector<char> &Defines) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000263
Eli Friedmane4277982008-08-20 23:11:40 +0000264 virtual const char *getVAListDeclaration() const {
Chris Lattnerd5998502008-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 Friedmane4277982008-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 Lattnerd5998502008-10-27 01:11:29 +0000273 "} __builtin_va_list[1];";*/
Anders Carlsson3346ae62007-11-24 23:38:12 +0000274 }
Eli Friedmane4277982008-08-20 23:11:40 +0000275 virtual const char *getTargetPrefix() const {
276 return "ppc";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000277 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000278 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000279 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000280 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000281 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000282 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000283 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000284 switch (*Name) {
Anders Carlssond04c6e22007-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 Lattner44def072009-04-26 07:16:29 +0000290 Info.setAllowsRegister();
Anders Carlssond04c6e22007-11-27 04:11:28 +0000291 return true;
292 }
293 }
Eli Friedmane4277982008-08-20 23:11:40 +0000294 virtual const char *getClobbers() const {
295 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000296 }
Eli Friedmane4277982008-08-20 23:11:40 +0000297};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000298
Eli Friedmane4277982008-08-20 23:11:40 +0000299const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregorb1152d82009-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 Friedmane4277982008-08-20 23:11:40 +0000302#include "clang/AST/PPCBuiltins.def"
303};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000304
305
Chris Lattnerc0f59212009-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 Lattner33328642009-03-20 15:52:06 +0000308void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
309 std::vector<char> &Defs) const {
Chris Lattnerc0f59212009-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 Korobeynikova7c47172009-05-03 13:42:53 +0000322
Chris Lattnerc0f59212009-03-02 22:27:17 +0000323 // Target properties.
324 Define(Defs, "_BIG_ENDIAN");
325 Define(Defs, "__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000326
Chris Lattnerc0f59212009-03-02 22:27:17 +0000327 // Subtarget options.
328 Define(Defs, "__NATURAL_ALIGNMENT__");
329 Define(Defs, "__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000330
Chris Lattnerc0f59212009-03-02 22:27:17 +0000331 // FIXME: Should be controlled by command line option.
332 Define(Defs, "__LONG_DOUBLE_128__");
333}
334
Chris Lattner393ff042008-04-21 18:56:49 +0000335
Eli Friedmane4277982008-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};
Reid Spencer5f016e22007-07-11 17:01:13 +0000356
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000357void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000358 unsigned &NumNames) const {
359 Names = GCCRegNames;
360 NumNames = llvm::array_lengthof(GCCRegNames);
361}
Reid Spencer5f016e22007-07-11 17:01:13 +0000362
Eli Friedmane4277982008-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 Korobeynikova7c47172009-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 Friedmane4277982008-08-20 23:11:40 +0000398};
399
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000400void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000401 unsigned &NumAliases) const {
402 Aliases = GCCRegAliases;
403 NumAliases = llvm::array_lengthof(GCCRegAliases);
404}
405} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000406
407namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000408class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000409public:
Eli Friedmaned855cb2008-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 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000414};
415} // end anonymous namespace.
416
417namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000418class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000419public:
Eli Friedmane4277982008-08-20 23:11:40 +0000420 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000421 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmaned855cb2008-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 Lattnerf291b102008-05-09 06:17:04 +0000424 }
Eli Friedmane4277982008-08-20 23:11:40 +0000425};
426} // end anonymous namespace.
427
Chris Lattnerae0ee032008-12-04 23:20:07 +0000428
Eli Friedmane4277982008-08-20 23:11:40 +0000429namespace {
430class DarwinPPCTargetInfo : public PPC32TargetInfo {
431public:
432 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
Chris Lattner33328642009-03-20 15:52:06 +0000433 virtual void getTargetDefines(const LangOptions &Opts,
434 std::vector<char> &Defines) const {
435 PPC32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000436 getDarwinDefines(Defines, Opts);
437 getDarwinOSXDefines(Defines, getTargetTriple());
Reid Spencer5f016e22007-07-11 17:01:13 +0000438 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000439
Chris Lattner8fc4dfb2008-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 Korobeynikova7c47172009-05-03 13:42:53 +0000442 /// options.
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000443 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000444 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000445 }
Eli Friedmane4277982008-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 Lattner33328642009-03-20 15:52:06 +0000453 virtual void getTargetDefines(const LangOptions &Opts,
454 std::vector<char> &Defines) const {
455 PPC64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000456 getDarwinDefines(Defines, Opts);
457 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000458 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000459
Chris Lattner8fc4dfb2008-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 Korobeynikova7c47172009-05-03 13:42:53 +0000462 /// options.
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000463 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000464 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000465 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000466};
467} // end anonymous namespace.
468
469namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000470// Namespace for x86 abstract base class
471const Builtin::Info BuiltinInfo[] = {
Douglas Gregorb1152d82009-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 Friedman618234a2008-08-20 02:34:37 +0000474#include "clang/AST/X86Builtins.def"
475};
Eli Friedman61538a72008-05-20 14:21:01 +0000476
Eli Friedman618234a2008-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 Lattner84f0ea82009-03-02 22:40:39 +0000501 enum X86SSEEnum {
502 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
503 } SSELevel;
Eli Friedman618234a2008-08-20 02:34:37 +0000504public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000505 X86TargetInfo(const std::string& triple)
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000506 : TargetInfo(triple), SSELevel(NoMMXSSE) {
Eli Friedman618234a2008-08-20 02:34:37 +0000507 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +0000508 }
509 virtual void getTargetBuiltins(const Builtin::Info *&Records,
510 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000511 Records = BuiltinInfo;
512 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000513 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000514 virtual const char *getTargetPrefix() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000515 return "x86";
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000516 }
517 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +0000518 unsigned &NumNames) const {
519 Names = GCCRegNames;
520 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +0000521 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000522 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000523 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000524 Aliases = GCCRegAliases;
525 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000526 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000527 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +0000528 TargetInfo::ConstraintInfo &info) const;
529 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000530 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000531 return "~{dirflag},~{fpsr},~{flags}";
532 }
Chris Lattner33328642009-03-20 15:52:06 +0000533 virtual void getTargetDefines(const LangOptions &Opts,
534 std::vector<char> &Defines) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000535
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000536 virtual void getDefaultFeatures(const std::string &CPU,
537 llvm::StringMap<bool> &Features);
538 virtual void HandleTargetFeatures(const llvm::StringMap<bool> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +0000539};
Chris Lattner3daed522009-03-02 22:20:04 +0000540
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000541void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
542 llvm::StringMap<bool> &Features) {
543 // FIXME: This should not be here.
544 Features["3dnow"] = false;
545 Features["3dnowa"] = false;
546 Features["mmx"] = false;
547 Features["sse"] = false;
548 Features["sse2"] = false;
549 Features["sse3"] = false;
550 Features["ssse3"] = false;
551 Features["sse41"] = false;
552 Features["sse42"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000553
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000554 // LLVM does not currently recognize this.
555 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000556
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000557 // FIXME: This *really* should not be here.
558
559 // X86_64 always has SSE2.
560 if (PointerWidth == 64)
561 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
562
563 // FIXME: LLVM says core2 has SSSE3, but gcc doesn't define
564 // __SSSE3__ with it? What else is going on here?
565 if (CPU == "core2")
566 Features["ssse3"] = Features["sse3"] = Features["sse2"] = Features["sse"] =
567 Features["mmx"] = true;
568 else if (CPU == "pentium4")
569 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
570}
571
572/// HandleTargetOptions - Perform initialization based on the user
573/// configured set of features.
574void X86TargetInfo::HandleTargetFeatures(const llvm::StringMap<bool>&Features) {
575 if (Features.lookup("sse42"))
576 SSELevel = SSE42;
577 else if (Features.lookup("sse41"))
578 SSELevel = SSE41;
579 else if (Features.lookup("ssse3"))
580 SSELevel = SSSE3;
581 else if (Features.lookup("sse3"))
582 SSELevel = SSE3;
583 else if (Features.lookup("sse2"))
584 SSELevel = SSE2;
585 else if (Features.lookup("sse"))
586 SSELevel = SSE1;
587 else if (Features.lookup("mmx"))
588 SSELevel = MMX;
Chris Lattner3daed522009-03-02 22:20:04 +0000589}
Chris Lattnerc0f59212009-03-02 22:27:17 +0000590
591/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
592/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000593void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
594 std::vector<char> &Defs) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000595 // Target identification.
596 if (PointerWidth == 64) {
597 Define(Defs, "_LP64");
598 Define(Defs, "__LP64__");
599 Define(Defs, "__amd64__");
600 Define(Defs, "__amd64");
601 Define(Defs, "__x86_64");
602 Define(Defs, "__x86_64__");
603 Define(Defs, "__SSE3__");
604 } else {
Chris Lattnerca45cff2009-03-20 16:06:38 +0000605 DefineStd(Defs, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +0000606 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000607
Chris Lattnerc0f59212009-03-02 22:27:17 +0000608 // Target properties.
609 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000610
Chris Lattnerc0f59212009-03-02 22:27:17 +0000611 // Subtarget options.
612 Define(Defs, "__nocona");
613 Define(Defs, "__nocona__");
614 Define(Defs, "__tune_nocona__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000615 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +0000616
Chris Lattner54175442009-04-19 17:32:33 +0000617 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
618 // functions in glibc header files that use FP Stack inline asm which the
619 // backend can't deal with (PR879).
620 Define(Defs, "__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000621
Chris Lattner84f0ea82009-03-02 22:40:39 +0000622 // Each case falls through to the previous one here.
623 switch (SSELevel) {
624 case SSE42:
625 Define(Defs, "__SSE4_2__");
626 case SSE41:
627 Define(Defs, "__SSE4_1__");
628 case SSSE3:
629 Define(Defs, "__SSSE3__");
630 case SSE3:
631 Define(Defs, "__SSE3__");
632 case SSE2:
633 Define(Defs, "__SSE2__");
634 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
635 case SSE1:
636 Define(Defs, "__SSE__");
637 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
638 case MMX:
639 Define(Defs, "__MMX__");
640 case NoMMXSSE:
641 break;
642 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000643}
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000644
645
Eli Friedman618234a2008-08-20 02:34:37 +0000646bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000647X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000648 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000649 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +0000650 default: return false;
651 case 'a': // eax.
652 case 'b': // ebx.
653 case 'c': // ecx.
654 case 'd': // edx.
655 case 'S': // esi.
656 case 'D': // edi.
657 case 'A': // edx:eax.
658 case 't': // top of floating point stack.
659 case 'u': // second from top of floating point stack.
660 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +0000661 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +0000662 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +0000663 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000664 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +0000665 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000666 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +0000667 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +0000668 case 'N': // unsigned 8-bit integer constant for use with in and out
669 // instructions.
Chris Lattner44def072009-04-26 07:16:29 +0000670 Info.setAllowsRegister();
Eli Friedman618234a2008-08-20 02:34:37 +0000671 return true;
672 }
673}
674
675std::string
676X86TargetInfo::convertConstraint(const char Constraint) const {
677 switch (Constraint) {
678 case 'a': return std::string("{ax}");
679 case 'b': return std::string("{bx}");
680 case 'c': return std::string("{cx}");
681 case 'd': return std::string("{dx}");
682 case 'S': return std::string("{si}");
683 case 'D': return std::string("{di}");
684 case 't': // top of floating point stack.
685 return std::string("{st}");
686 case 'u': // second from top of floating point stack.
687 return std::string("{st(1)}"); // second from top of floating point stack.
688 default:
689 return std::string(1, Constraint);
690 }
691}
Eli Friedman618234a2008-08-20 02:34:37 +0000692} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +0000693
694namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000695// X86-32 generic target
696class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000697public:
Eli Friedman618234a2008-08-20 02:34:37 +0000698 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
699 DoubleAlign = LongLongAlign = 32;
700 LongDoubleWidth = 96;
701 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000702 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
703 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
704 "a0:0:64-f80:32:32";
Eli Friedman1afabd92009-03-29 20:31:09 +0000705 SizeType = UnsignedInt;
706 PtrDiffType = SignedInt;
707 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +0000708 RegParmMax = 3;
Eli Friedman618234a2008-08-20 02:34:37 +0000709 }
710 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000711 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +0000712 }
Eli Friedman618234a2008-08-20 02:34:37 +0000713};
714} // end anonymous namespace
715
716namespace {
717// x86-32 Darwin (OS X) target
718class DarwinI386TargetInfo : public X86_32TargetInfo {
719public:
720 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
721 LongDoubleWidth = 128;
722 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +0000723 SizeType = UnsignedLong;
724 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000725 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
726 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
727 "a0:0:64-f80:128:128";
Eli Friedmanb030f022009-04-19 21:38:35 +0000728 TLSSupported = false;
Eli Friedman618234a2008-08-20 02:34:37 +0000729 }
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000730
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000731 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000732 return IsConstant ? "\01LC" : "\01lC";
733 }
734
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000735 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbara9668e02009-04-03 00:57:44 +0000736 return "__utf16_string_";
737 }
738
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000739 virtual const char *getUnicodeStringSection() const {
Daniel Dunbara9668e02009-04-03 00:57:44 +0000740 return "__TEXT,__ustring";
741 }
742
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000743 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000744 return "\01LC";
745 }
746
Chris Lattner33328642009-03-20 15:52:06 +0000747 virtual void getTargetDefines(const LangOptions &Opts,
748 std::vector<char> &Defines) const {
749 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000750 getDarwinDefines(Defines, Opts);
751 getDarwinOSXDefines(Defines, getTargetTriple());
Eli Friedman618234a2008-08-20 02:34:37 +0000752 }
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000753
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000754 /// getDefaultLangOptions - Allow the target to specify default settings for
755 /// various language options. These may be overridden by command line
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000756 /// options.
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000757 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000758 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000759 }
Eli Friedman618234a2008-08-20 02:34:37 +0000760};
761} // end anonymous namespace
762
763namespace {
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000764// x86-32 FreeBSD target
765class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
766public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000767 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman1afabd92009-03-29 20:31:09 +0000768 X86_32TargetInfo(triple) { }
Chris Lattner33328642009-03-20 15:52:06 +0000769 virtual void getTargetDefines(const LangOptions &Opts,
770 std::vector<char> &Defines) const {
771 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000772 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000773 }
774};
775} // end anonymous namespace
776
777namespace {
Chris Lattnereac7aee2008-08-23 18:23:14 +0000778// x86-32 DragonFly target
779class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
780public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000781 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman1afabd92009-03-29 20:31:09 +0000782 X86_32TargetInfo(triple) { }
Chris Lattner33328642009-03-20 15:52:06 +0000783 virtual void getTargetDefines(const LangOptions &Opts,
784 std::vector<char> &Defines) const {
785 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000786 getDragonFlyDefines(Opts, Defines);
Chris Lattnereac7aee2008-08-23 18:23:14 +0000787 }
788};
789} // end anonymous namespace
790
791namespace {
Eli Friedman0d4047b2008-08-21 00:24:02 +0000792// x86-32 Linux target
793class LinuxX86_32TargetInfo : public X86_32TargetInfo {
794public:
795 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner9b533162008-10-05 19:44:25 +0000796 UserLabelPrefix = "";
Eli Friedman0d4047b2008-08-21 00:24:02 +0000797 }
Chris Lattner33328642009-03-20 15:52:06 +0000798 virtual void getTargetDefines(const LangOptions &Opts,
799 std::vector<char> &Defines) const {
800 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000801 getLinuxDefines(Opts, Defines);
Eli Friedman0d4047b2008-08-21 00:24:02 +0000802 }
803};
804} // end anonymous namespace
805
806namespace {
Eli Friedman29a30502008-08-21 01:40:19 +0000807// x86-32 Windows target
808class WindowsX86_32TargetInfo : public X86_32TargetInfo {
809public:
810 WindowsX86_32TargetInfo(const std::string& triple)
811 : X86_32TargetInfo(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +0000812 TLSSupported = false;
Eli Friedman29a30502008-08-21 01:40:19 +0000813 // FIXME: Fix wchar_t.
814 // FIXME: We should probably enable -fms-extensions by default for
815 // this target.
816 }
Chris Lattner33328642009-03-20 15:52:06 +0000817 virtual void getTargetDefines(const LangOptions &Opts,
818 std::vector<char> &Defines) const {
819 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedman29a30502008-08-21 01:40:19 +0000820 // This list is based off of the the list of things MingW defines
Eli Friedman29a30502008-08-21 01:40:19 +0000821 Define(Defines, "_WIN32");
Chris Lattnerca45cff2009-03-20 16:06:38 +0000822 DefineStd(Defines, "WIN32", Opts);
823 DefineStd(Defines, "WINNT", Opts);
Eli Friedman29a30502008-08-21 01:40:19 +0000824 Define(Defines, "_X86_");
825 Define(Defines, "__MSVCRT__");
826 }
827};
828} // end anonymous namespace
829
830namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000831// x86-64 generic target
832class X86_64TargetInfo : public X86TargetInfo {
833public:
Chris Lattner33328642009-03-20 15:52:06 +0000834 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000835 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner778601f2009-01-28 06:58:19 +0000836 DoubleAlign = LongLongAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +0000837 LongDoubleWidth = 128;
838 LongDoubleAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +0000839 IntMaxType = SignedLong;
840 UIntMaxType = UnsignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +0000841 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +0000842
Eli Friedmaned855cb2008-08-21 00:13:15 +0000843 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
844 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
845 "a0:0:64-f80:128:128";
Reid Spencer5f016e22007-07-11 17:01:13 +0000846 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000847 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000848 return "typedef struct __va_list_tag {"
849 " unsigned gp_offset;"
850 " unsigned fp_offset;"
851 " void* overflow_arg_area;"
852 " void* reg_save_area;"
853 "} __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +0000854 }
Eli Friedman618234a2008-08-20 02:34:37 +0000855};
856} // end anonymous namespace
857
858namespace {
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000859// x86-64 FreeBSD target
860class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
861public:
Chris Lattner33328642009-03-20 15:52:06 +0000862 FreeBSDX86_64TargetInfo(const std::string &triple)
863 : X86_64TargetInfo(triple) {}
864 virtual void getTargetDefines(const LangOptions &Opts,
865 std::vector<char> &Defines) const {
866 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000867 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000868 }
869};
870} // end anonymous namespace
871
872namespace {
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000873// x86-64 Linux target
874class LinuxX86_64TargetInfo : public X86_64TargetInfo {
875public:
876 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner9b533162008-10-05 19:44:25 +0000877 UserLabelPrefix = "";
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000878 }
Chris Lattner33328642009-03-20 15:52:06 +0000879 virtual void getTargetDefines(const LangOptions &Opts,
880 std::vector<char> &Defines) const {
881 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000882 getLinuxDefines(Opts, Defines);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000883 }
884};
885} // end anonymous namespace
886
887namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000888// x86-64 Darwin (OS X) target
889class DarwinX86_64TargetInfo : public X86_64TargetInfo {
890public:
Eli Friedmanb030f022009-04-19 21:38:35 +0000891 DarwinX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
892 TLSSupported = false;
893 }
Eli Friedman618234a2008-08-20 02:34:37 +0000894
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000895 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000896 return IsConstant ? "\01LC" : "\01lC";
897 }
898
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000899 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbara9668e02009-04-03 00:57:44 +0000900 return "__utf16_string_";
901 }
902
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000903 virtual const char *getUnicodeStringSection() const {
Daniel Dunbara9668e02009-04-03 00:57:44 +0000904 return "__TEXT,__ustring";
905 }
906
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000907 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000908 return "\01L_unnamed_cfstring_";
909 }
910
Chris Lattner33328642009-03-20 15:52:06 +0000911 virtual void getTargetDefines(const LangOptions &Opts,
912 std::vector<char> &Defines) const {
913 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000914 getDarwinDefines(Defines, Opts);
915 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000916 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000917
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000918 /// getDefaultLangOptions - Allow the target to specify default settings for
919 /// various language options. These may be overridden by command line
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000920 /// options.
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000921 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000922 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000923 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000924};
925} // end anonymous namespace.
926
Chris Lattner393ff042008-04-21 18:56:49 +0000927namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +0000928class ARMTargetInfo : public TargetInfo {
Mike Stump437bb4b2009-04-08 02:07:04 +0000929 enum {
930 Armv4t,
931 Armv5,
932 Armv6,
933 XScale
934 } ArmArch;
Chris Lattner393ff042008-04-21 18:56:49 +0000935public:
Eli Friedmana9f54962008-08-20 07:44:10 +0000936 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
937 // FIXME: Are the defaults correct for ARM?
Eli Friedmaned855cb2008-08-21 00:13:15 +0000938 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
939 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Chris Lattner5b37dc02009-04-23 04:22:04 +0000940 if (triple.find("arm-") == 0 || triple.find("armv6-") == 0)
Mike Stump437bb4b2009-04-08 02:07:04 +0000941 ArmArch = Armv6;
Chris Lattner5b37dc02009-04-23 04:22:04 +0000942 else if (triple.find("armv5-") == 0)
Mike Stump437bb4b2009-04-08 02:07:04 +0000943 ArmArch = Armv5;
Chris Lattner5b37dc02009-04-23 04:22:04 +0000944 else if (triple.find("armv4t-") == 0)
Mike Stump437bb4b2009-04-08 02:07:04 +0000945 ArmArch = Armv4t;
Chris Lattner5b37dc02009-04-23 04:22:04 +0000946 else if (triple.find("xscale-") == 0)
Mike Stump437bb4b2009-04-08 02:07:04 +0000947 ArmArch = XScale;
Chris Lattner5b37dc02009-04-23 04:22:04 +0000948 else if (triple.find("armv") == 0) {
949 // FIXME: fuzzy match for other random weird arm triples. This is useful
950 // for the static analyzer and other clients, but probably should be
951 // re-evaluated when codegen is brought up.
952 ArmArch = Armv6;
953 }
Eli Friedman61538a72008-05-20 14:21:01 +0000954 }
Chris Lattner33328642009-03-20 15:52:06 +0000955 virtual void getTargetDefines(const LangOptions &Opts,
956 std::vector<char> &Defs) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000957 // Target identification.
958 Define(Defs, "__arm");
959 Define(Defs, "__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000960
Chris Lattnerc0f59212009-03-02 22:27:17 +0000961 // Target properties.
962 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000963
Mike Stump437bb4b2009-04-08 02:07:04 +0000964 // Subtarget options.
965 if (ArmArch == Armv6) {
966 Define(Defs, "__ARM_ARCH_6K__");
967 Define(Defs, "__THUMB_INTERWORK__");
968 } else if (ArmArch == Armv5) {
969 Define(Defs, "__ARM_ARCH_5TEJ__");
970 Define(Defs, "__THUMB_INTERWORK__");
971 Define(Defs, "__SOFTFP__");
972 } else if (ArmArch == Armv4t) {
973 Define(Defs, "__ARM_ARCH_4T__");
974 Define(Defs, "__SOFTFP__");
975 } else if (ArmArch == XScale) {
976 Define(Defs, "__ARM_ARCH_5TE__");
977 Define(Defs, "__XSCALE__");
978 Define(Defs, "__SOFTFP__");
979 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000980 Define(Defs, "__ARMEL__");
Chris Lattner393ff042008-04-21 18:56:49 +0000981 }
982 virtual void getTargetBuiltins(const Builtin::Info *&Records,
983 unsigned &NumRecords) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000984 // FIXME: Implement.
985 Records = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000986 NumRecords = 0;
987 }
988 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000989 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +0000990 }
991 virtual const char *getTargetPrefix() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000992 return "arm";
Chris Lattner393ff042008-04-21 18:56:49 +0000993 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000994 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner393ff042008-04-21 18:56:49 +0000995 unsigned &NumNames) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000996 // FIXME: Implement.
997 Names = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000998 NumNames = 0;
999 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001000 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner393ff042008-04-21 18:56:49 +00001001 unsigned &NumAliases) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001002 // FIXME: Implement.
1003 Aliases = 0;
Chris Lattner393ff042008-04-21 18:56:49 +00001004 NumAliases = 0;
1005 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001006 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001007 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001008 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001009 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001010 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001011 case 'l': // r0-r7
1012 case 'h': // r8-r15
1013 case 'w': // VFP Floating point register single precision
1014 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001015 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001016 return true;
1017 }
Chris Lattner393ff042008-04-21 18:56:49 +00001018 return false;
1019 }
1020 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001021 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001022 return "";
1023 }
1024};
1025} // end anonymous namespace.
1026
Eli Friedmana9f54962008-08-20 07:44:10 +00001027
1028namespace {
1029class DarwinARMTargetInfo : public ARMTargetInfo {
1030public:
Eli Friedmanb030f022009-04-19 21:38:35 +00001031 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {
1032 TLSSupported = false;
1033 }
Eli Friedmana9f54962008-08-20 07:44:10 +00001034
Chris Lattner33328642009-03-20 15:52:06 +00001035 virtual void getTargetDefines(const LangOptions &Opts,
1036 std::vector<char> &Defines) const {
1037 ARMTargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +00001038 getDarwinDefines(Defines, Opts);
1039 getDarwinIPhoneOSDefines(Defines, getTargetTriple());
Eli Friedmana9f54962008-08-20 07:44:10 +00001040 }
1041};
1042} // end anonymous namespace.
1043
Reid Spencer5f016e22007-07-11 17:01:13 +00001044namespace {
Daniel Dunbar1e0107a2009-03-23 16:09:04 +00001045// arm FreeBSD target
1046class FreeBSDARMTargetInfo : public ARMTargetInfo {
1047public:
1048 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1049 virtual void getTargetDefines(const LangOptions &Opts,
1050 std::vector<char> &Defines) const {
1051 ARMTargetInfo::getTargetDefines(Opts, Defines);
1052 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
1053 }
1054};
1055} // end anonymous namespace
1056
1057namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00001058class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00001059 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1060 static const char * const GCCRegNames[];
Gabor Greif26658672008-02-21 16:29:08 +00001061public:
Eli Friedman01b86682008-08-20 07:28:14 +00001062 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1063 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00001064 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1065 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedman01b86682008-08-20 07:28:14 +00001066 }
Chris Lattner33328642009-03-20 15:52:06 +00001067 virtual void getTargetDefines(const LangOptions &Opts,
1068 std::vector<char> &Defines) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001069 // FIXME: This is missing a lot of important defines; some of the
1070 // missing stuff is likely to break system headers.
Gabor Greif26658672008-02-21 16:29:08 +00001071 Define(Defines, "__sparc");
Eli Friedmanbf0c9bd2008-05-25 05:26:09 +00001072 Define(Defines, "__sparc__");
Gabor Greif26658672008-02-21 16:29:08 +00001073 Define(Defines, "__sparcv8");
1074 }
1075 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1076 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001077 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00001078 }
1079 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001080 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00001081 }
1082 virtual const char *getTargetPrefix() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001083 return "sparc";
Gabor Greif26658672008-02-21 16:29:08 +00001084 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001085 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00001086 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001087 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00001088 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001089 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00001090 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001091 // FIXME: Implement!
1092 return false;
Gabor Greif26658672008-02-21 16:29:08 +00001093 }
1094 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001095 // FIXME: Implement!
1096 return "";
Gabor Greif26658672008-02-21 16:29:08 +00001097 }
1098};
1099
Chris Lattnere957f532009-01-27 01:58:38 +00001100const char * const SparcV8TargetInfo::GCCRegNames[] = {
1101 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1102 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1103 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1104 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1105};
1106
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001107void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00001108 unsigned &NumNames) const {
1109 Names = GCCRegNames;
1110 NumNames = llvm::array_lengthof(GCCRegNames);
1111}
1112
1113const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001114 { { "g0" }, "r0" },
1115 { { "g1" }, "r1" },
1116 { { "g2" }, "r2" },
1117 { { "g3" }, "r3" },
1118 { { "g4" }, "r4" },
1119 { { "g5" }, "r5" },
1120 { { "g6" }, "r6" },
1121 { { "g7" }, "r7" },
1122 { { "o0" }, "r8" },
1123 { { "o1" }, "r9" },
1124 { { "o2" }, "r10" },
1125 { { "o3" }, "r11" },
1126 { { "o4" }, "r12" },
1127 { { "o5" }, "r13" },
1128 { { "o6", "sp" }, "r14" },
1129 { { "o7" }, "r15" },
1130 { { "l0" }, "r16" },
1131 { { "l1" }, "r17" },
1132 { { "l2" }, "r18" },
1133 { { "l3" }, "r19" },
1134 { { "l4" }, "r20" },
1135 { { "l5" }, "r21" },
1136 { { "l6" }, "r22" },
1137 { { "l7" }, "r23" },
1138 { { "i0" }, "r24" },
1139 { { "i1" }, "r25" },
1140 { { "i2" }, "r26" },
1141 { { "i3" }, "r27" },
1142 { { "i4" }, "r28" },
1143 { { "i5" }, "r29" },
1144 { { "i6", "fp" }, "r30" },
1145 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00001146};
1147
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001148void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00001149 unsigned &NumAliases) const {
1150 Aliases = GCCRegAliases;
1151 NumAliases = llvm::array_lengthof(GCCRegAliases);
1152}
Gabor Greif26658672008-02-21 16:29:08 +00001153} // end anonymous namespace.
1154
Eli Friedman01b86682008-08-20 07:28:14 +00001155namespace {
1156class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1157public:
1158 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmanf509d732008-11-02 02:43:55 +00001159 SparcV8TargetInfo(triple) {
1160 SizeType = UnsignedInt;
1161 PtrDiffType = SignedInt;
1162 }
Eli Friedman01b86682008-08-20 07:28:14 +00001163
Chris Lattner33328642009-03-20 15:52:06 +00001164 virtual void getTargetDefines(const LangOptions &Opts,
1165 std::vector<char> &Defines) const {
1166 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedman01b86682008-08-20 07:28:14 +00001167 getSolarisDefines(Defines);
1168 }
1169};
1170} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001171
Chris Lattner2621fd12008-05-08 05:58:21 +00001172namespace {
1173 class PIC16TargetInfo : public TargetInfo{
1174 public:
1175 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001176 TLSSupported = false;
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +00001177 IntWidth = 16;
1178 LongWidth = LongLongWidth = 32;
1179 PointerWidth = 16;
1180 IntAlign = 8;
1181 LongAlign = LongLongAlign = 8;
Eli Friedman61538a72008-05-20 14:21:01 +00001182 PointerAlign = 8;
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +00001183 SizeType = UnsignedInt;
1184 IntMaxType = SignedLong;
1185 UIntMaxType = UnsignedLong;
Chris Lattner6ad474f2009-02-13 22:28:55 +00001186 IntPtrType = SignedShort;
Eli Friedmanf509d732008-11-02 02:43:55 +00001187 PtrDiffType = SignedInt;
Sanjiv Gupta364af812008-08-18 10:05:22 +00001188 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner2621fd12008-05-08 05:58:21 +00001189 }
Chris Lattner927686f2008-05-09 06:08:39 +00001190 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1191 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner33328642009-03-20 15:52:06 +00001192 virtual void getTargetDefines(const LangOptions &Opts,
1193 std::vector<char> &Defines) const {
Chris Lattner2621fd12008-05-08 05:58:21 +00001194 Define(Defines, "__pic16");
1195 }
1196 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1197 unsigned &NumRecords) const {}
1198 virtual const char *getVAListDeclaration() const { return "";}
1199 virtual const char *getClobbers() const {return "";}
Sanjiv Gupta70aa5f92009-04-21 06:01:16 +00001200 virtual const char *getTargetPrefix() const {return "pic16";}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001201 virtual void getGCCRegNames(const char * const *&Names,
1202 unsigned &NumNames) const {}
1203 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner2621fd12008-05-08 05:58:21 +00001204 TargetInfo::ConstraintInfo &info) const {
1205 return true;
1206 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001207 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner2621fd12008-05-08 05:58:21 +00001208 unsigned &NumAliases) const {}
1209 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1210 };
1211}
1212
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00001213namespace {
1214 class MSP430TargetInfo : public TargetInfo {
1215 static const char * const GCCRegNames[];
1216 public:
1217 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1218 TLSSupported = false;
1219 IntWidth = 16;
1220 LongWidth = LongLongWidth = 32;
1221 PointerWidth = 16;
1222 IntAlign = 8;
1223 LongAlign = LongLongAlign = 8;
1224 PointerAlign = 8;
1225 SizeType = UnsignedInt;
1226 IntMaxType = SignedLong;
1227 UIntMaxType = UnsignedLong;
1228 IntPtrType = SignedShort;
1229 PtrDiffType = SignedInt;
1230 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
1231 }
1232 virtual void getTargetDefines(const LangOptions &Opts,
1233 std::vector<char> &Defines) const {
1234 Define(Defines, "MSP430");
1235 Define(Defines, "__MSP430__");
1236 // FIXME: defines for different 'flavours' of MCU
1237 }
1238 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1239 unsigned &NumRecords) const {
1240 // FIXME: Implement.
1241 Records = 0;
1242 NumRecords = 0;
1243 }
1244 virtual const char *getTargetPrefix() const {
1245 return "msp430";
1246 }
1247 virtual void getGCCRegNames(const char * const *&Names,
1248 unsigned &NumNames) const;
1249 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1250 unsigned &NumAliases) const {
1251 // No aliases.
1252 Aliases = 0;
1253 NumAliases = 0;
1254 }
1255 virtual bool validateAsmConstraint(const char *&Name,
1256 TargetInfo::ConstraintInfo &info) const {
1257 // FIXME: implement
1258 return true;
1259 }
1260 virtual const char *getClobbers() const {
1261 // FIXME: Is this really right?
1262 return "";
1263 }
1264 virtual const char *getVAListDeclaration() const {
1265 // FIXME: implement
1266 return "";
1267 }
1268 };
1269
1270 const char * const MSP430TargetInfo::GCCRegNames[] = {
1271 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1272 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1273 };
1274
1275 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
1276 unsigned &NumNames) const {
1277 Names = GCCRegNames;
1278 NumNames = llvm::array_lengthof(GCCRegNames);
1279 }
1280}
1281
1282
Reid Spencer5f016e22007-07-11 17:01:13 +00001283//===----------------------------------------------------------------------===//
1284// Driver code
1285//===----------------------------------------------------------------------===//
1286
Ted Kremenek8448d382007-12-04 17:07:35 +00001287static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +00001288 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1289 TT[4] == '-' && TT[1] - '3' < 6);
1290}
1291
Chris Lattner42e67372008-03-05 01:18:20 +00001292/// CreateTargetInfo - Return the target info object for the specified target
1293/// triple.
1294TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001295 // OS detection; this isn't really anywhere near complete.
1296 // Additions and corrections are welcome.
1297 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnereac7aee2008-08-23 18:23:14 +00001298 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001299 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001300 bool isSolaris = T.find("-solaris") != std::string::npos;
1301 bool isLinux = T.find("-linux") != std::string::npos;
1302 bool isWindows = T.find("-windows") != std::string::npos ||
1303 T.find("-win32") != std::string::npos ||
1304 T.find("-mingw") != std::string::npos;
Eli Friedman61538a72008-05-20 14:21:01 +00001305
Eli Friedmaned855cb2008-08-21 00:13:15 +00001306 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1307 if (isDarwin)
1308 return new DarwinPPCTargetInfo(T);
1309 return new PPC32TargetInfo(T);
1310 }
Eli Friedman61538a72008-05-20 14:21:01 +00001311
Eli Friedmaned855cb2008-08-21 00:13:15 +00001312 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1313 if (isDarwin)
1314 return new DarwinPPC64TargetInfo(T);
1315 return new PPC64TargetInfo(T);
1316 }
Chris Lattner393ff042008-04-21 18:56:49 +00001317
Chris Lattner5b37dc02009-04-23 04:22:04 +00001318 if (T.find("armv") == 0 || T.find("arm-") == 0 || T.find("xscale") == 0) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001319 if (isDarwin)
1320 return new DarwinARMTargetInfo(T);
Daniel Dunbar1e0107a2009-03-23 16:09:04 +00001321 if (isFreeBSD)
1322 return new FreeBSDARMTargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001323 return new ARMTargetInfo(T);
1324 }
Eli Friedman61538a72008-05-20 14:21:01 +00001325
Eli Friedmaned855cb2008-08-21 00:13:15 +00001326 if (T.find("sparc-") == 0) {
1327 if (isSolaris)
1328 return new SolarisSparcV8TargetInfo(T);
1329 return new SparcV8TargetInfo(T);
1330 }
1331
Chris Lattner54fefbe2009-02-20 17:04:14 +00001332 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001333 if (isDarwin)
1334 return new DarwinX86_64TargetInfo(T);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +00001335 if (isLinux)
1336 return new LinuxX86_64TargetInfo(T);
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001337 if (isFreeBSD)
1338 return new FreeBSDX86_64TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001339 return new X86_64TargetInfo(T);
1340 }
Eli Friedman61538a72008-05-20 14:21:01 +00001341
Chris Lattner2621fd12008-05-08 05:58:21 +00001342 if (T.find("pic16-") == 0)
1343 return new PIC16TargetInfo(T);
1344
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00001345 if (T.find("msp430-") == 0)
1346 return new MSP430TargetInfo(T);
1347
Eli Friedmaned855cb2008-08-21 00:13:15 +00001348 if (IsX86(T)) {
1349 if (isDarwin)
1350 return new DarwinI386TargetInfo(T);
Eli Friedman0d4047b2008-08-21 00:24:02 +00001351 if (isLinux)
1352 return new LinuxX86_32TargetInfo(T);
Chris Lattnereac7aee2008-08-23 18:23:14 +00001353 if (isDragonFly)
1354 return new DragonFlyX86_32TargetInfo(T);
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001355 if (isFreeBSD)
1356 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman29a30502008-08-21 01:40:19 +00001357 if (isWindows)
1358 return new WindowsX86_32TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001359 return new X86_32TargetInfo(T);
1360 }
Eli Friedman61538a72008-05-20 14:21:01 +00001361
Chris Lattner42e67372008-03-05 01:18:20 +00001362 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +00001363}