blob: d9ae003689ad131484195d143ecfdcad295e0fea [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikove7772382009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek38591a22007-12-12 18:05:32 +000011// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Douglas Gregor2e8a7aa2009-02-16 21:58:21 +000015// FIXME: Layering violation
Chris Lattner4b009652007-07-25 00:24:17 +000016#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000017#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000018#include "clang/Basic/TargetInfo.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000019#include "clang/Basic/LangOptions.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000020#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000021#include "llvm/ADT/APFloat.h"
Chris Lattnerc345a802009-03-20 16:06:38 +000022#include "llvm/ADT/SmallString.h"
Chris Lattner4b009652007-07-25 00:24:17 +000023using namespace clang;
24
Chris Lattner4b009652007-07-25 00:24:17 +000025//===----------------------------------------------------------------------===//
26// Common code shared among targets.
27//===----------------------------------------------------------------------===//
28
Chris Lattner0db667a2007-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 Lattnerc345a802009-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 Korobeynikove7772382009-05-03 13:42:53 +000042static void DefineStd(std::vector<char> &Buf, const char *MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000045
Chris Lattnerc345a802009-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 Korobeynikove7772382009-05-03 13:42:53 +000050
Chris Lattnerc345a802009-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 Korobeynikove7772382009-05-03 13:42:53 +000056
Chris Lattnerc345a802009-03-20 16:06:38 +000057 // Define __unix__.
58 TmpStr += "__";
59 Define(Buf, TmpStr.c_str());
60}
61
Chris Lattnerbd00eb82008-10-05 21:50:58 +000062//===----------------------------------------------------------------------===//
63// Defines specific to certain operating systems.
64//===----------------------------------------------------------------------===//
65
Eli Friedmanff158dd2008-08-20 07:28:14 +000066static void getSolarisDefines(std::vector<char> &Defs) {
67 Define(Defs, "__SUN__");
68 Define(Defs, "__SOLARIS__");
69}
Chris Lattner4b009652007-07-25 00:24:17 +000070
Chris Lattnerab81f162009-03-20 15:55:34 +000071static void getFreeBSDDefines(const LangOptions &Opts, bool is64Bit,
72 const char *Triple, std::vector<char> &Defs) {
Chris Lattner98cb2a22008-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 Lattnerc345a802009-03-20 16:06:38 +000085 DefineStd(Defs, "unix", Opts);
Anton Korobeynikovfb820852009-02-14 16:42:50 +000086 Define(Defs, "__ELF__", "1");
Chris Lattner98cb2a22008-10-16 17:04:31 +000087 if (is64Bit) {
88 Define(Defs, "__LP64__");
89 }
90}
91
Chris Lattnerab81f162009-03-20 15:55:34 +000092static void getDragonFlyDefines(const LangOptions &Opts,
93 std::vector<char> &Defs) {
Chris Lattnerbd00eb82008-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 Lattnerc345a802009-03-20 16:06:38 +0000100 DefineStd(Defs, "unix", Opts);
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000101}
102
Chris Lattnerab81f162009-03-20 15:55:34 +0000103static void getLinuxDefines(const LangOptions &Opts, std::vector<char> &Defs) {
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000104 // Linux defines; list based off of gcc output
Chris Lattnerc345a802009-03-20 16:06:38 +0000105 DefineStd(Defs, "unix", Opts);
106 DefineStd(Defs, "linux", Opts);
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000107 Define(Defs, "__gnu_linux__");
Argiris Kirtzidis99de9532009-02-14 15:02:45 +0000108 Define(Defs, "__ELF__", "1");
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000109}
110
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000111/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
Daniel Dunbar93f64532009-04-10 19:52:24 +0000112/// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
Chris Lattnerd7bc88b2008-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 Dunbar93f64532009-04-10 19:52:24 +0000115static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min, unsigned &Revision) {
116 Maj = Min = Revision = 0;
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000117 const char *Darwin = strstr(Triple, "-darwin");
118 if (Darwin == 0) return false;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000119
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000120 Darwin += strlen("-darwin");
121 if (Darwin[0] < '0' || Darwin[0] > '9')
122 return true;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000123
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000124 Maj = Darwin[0]-'0';
125 ++Darwin;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000126
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000127 // Handle "darwin11".
128 if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
Daniel Dunbar93f64532009-04-10 19:52:24 +0000129 Maj = Maj*10 + (Darwin[0] - '0');
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000130 ++Darwin;
131 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000132
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
Daniel Dunbar93f64532009-04-10 19:52:24 +0000134 if (Darwin[0] != '.')
135 return true;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000136
Daniel Dunbar93f64532009-04-10 19:52:24 +0000137 ++Darwin;
138 if (Darwin[0] < '0' || Darwin[0] > '9')
139 return true;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000140
Daniel Dunbar93f64532009-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 Korobeynikove7772382009-05-03 13:42:53 +0000149
Daniel Dunbar93f64532009-04-10 19:52:24 +0000150 // Handle revision darwin8.9.1
151 if (Darwin[0] != '.')
152 return true;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000153
Daniel Dunbar93f64532009-04-10 19:52:24 +0000154 ++Darwin;
155 if (Darwin[0] < '0' || Darwin[0] > '9')
156 return true;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000157
Daniel Dunbar93f64532009-04-10 19:52:24 +0000158 Revision = Darwin[0]-'0';
159 ++Darwin;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000160
Daniel Dunbar93f64532009-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 Korobeynikove7772382009-05-03 13:42:53 +0000165
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000166 return true;
167}
168
Daniel Dunbar93f64532009-04-10 19:52:24 +0000169static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
Eli Friedman872996c2008-08-20 02:34:37 +0000170 Define(Defs, "__APPLE__");
171 Define(Defs, "__MACH__");
Chris Lattner8405e092009-02-05 07:19:24 +0000172 Define(Defs, "OBJC_NEW_PROPERTIES");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000173
Chris Lattner8181e622009-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 Korobeynikove7772382009-05-03 13:42:53 +0000176
Chris Lattner8181e622009-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 Lattner33854aa2009-04-07 04:48:21 +0000179 Define(Defs, "__strong", "");
Chris Lattner8181e622009-04-07 16:50:40 +0000180 else
Chris Lattner33854aa2009-04-07 04:48:21 +0000181 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000182}
183
184static void getDarwinOSXDefines(std::vector<char> &Defs, const char *Triple) {
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000185 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000186 unsigned Maj, Min, Rev;
187 if (getDarwinNumber(Triple, Maj, Min, Rev)) {
188 char MacOSXStr[] = "1000";
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000189 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
190 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000191 MacOSXStr[2] = '0' + Maj-4;
192 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000193
Daniel Dunbar93f64532009-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 Korobeynikove7772382009-05-03 13:42:53 +0000201static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
Daniel Dunbar93f64532009-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 Lattnerc5dc8eb2008-09-30 01:00:25 +0000212 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000213
Daniel Dunbar93f64532009-04-10 19:52:24 +0000214 // Handle minor version: 2.2 -> darwin9.2.2 -> 20200
215 iPhoneOSStr[2] = std::min(Rev, 9U)+'0';
Anton Korobeynikove7772382009-05-03 13:42:53 +0000216 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
Daniel Dunbar93f64532009-04-10 19:52:24 +0000217 iPhoneOSStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000218 }
Eli Friedman872996c2008-08-20 02:34:37 +0000219}
Chris Lattner4b009652007-07-25 00:24:17 +0000220
Chris Lattnerd7bc88b2008-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 Korobeynikove7772382009-05-03 13:42:53 +0000225
Daniel Dunbar93f64532009-04-10 19:52:24 +0000226 unsigned Maj, Min, Rev;
227 if (!getDarwinNumber(Triple, Maj, Min, Rev))
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000228 return;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000229
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000230 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahaniand09b9f72009-02-12 17:54:33 +0000231 // As does nonfragile-abi for 64bit mode
Anton Korobeynikove7772382009-05-03 13:42:53 +0000232 if (Maj > 9)
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000233 Opts.Blocks = 1;
Fariborz Jahanian27f58962009-02-24 23:34:44 +0000234
Fariborz Jahanian72efecb2009-02-24 23:38:42 +0000235 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
236 Opts.ObjCNonFragileABI = 1;
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000237}
238
239
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000240//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000241// Specific target implementations.
242//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000243
Eli Friedmanfd5a4122008-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 Lattner4b009652007-07-25 00:24:17 +0000257 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000258 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000259 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000260
Chris Lattner79682402009-03-20 15:52:06 +0000261 virtual void getTargetDefines(const LangOptions &Opts,
262 std::vector<char> &Defines) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000263
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000264 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-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 Friedmanfd5a4122008-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 Lattnera07708f2008-10-27 01:11:29 +0000273 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000274 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000275 virtual const char *getTargetPrefix() const {
276 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000277 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000278 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000279 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000280 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000281 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +0000282 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000283 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000284 switch (*Name) {
Anders Carlsson4ce42302007-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 Lattnerc49cc1a2009-04-26 07:16:29 +0000290 Info.setAllowsRegister();
Anders Carlsson4ce42302007-11-27 04:11:28 +0000291 return true;
292 }
293 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000294 virtual const char *getClobbers() const {
295 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000296 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000297};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000298
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000299const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-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 Friedmanfd5a4122008-08-20 23:11:40 +0000302#include "clang/AST/PPCBuiltins.def"
303};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000304
305
Chris Lattnerbef1d722009-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 Lattner79682402009-03-20 15:52:06 +0000308void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
309 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-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 Korobeynikove7772382009-05-03 13:42:53 +0000322
Chris Lattnerbef1d722009-03-02 22:27:17 +0000323 // Target properties.
324 Define(Defs, "_BIG_ENDIAN");
325 Define(Defs, "__BIG_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000326
Chris Lattnerbef1d722009-03-02 22:27:17 +0000327 // Subtarget options.
328 Define(Defs, "__NATURAL_ALIGNMENT__");
329 Define(Defs, "__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000330
Chris Lattnerbef1d722009-03-02 22:27:17 +0000331 // FIXME: Should be controlled by command line option.
332 Define(Defs, "__LONG_DOUBLE_128__");
333}
334
Chris Lattner9fd73612008-04-21 18:56:49 +0000335
Eli Friedmanfd5a4122008-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 Lattner4b009652007-07-25 00:24:17 +0000356
Anton Korobeynikove7772382009-05-03 13:42:53 +0000357void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000358 unsigned &NumNames) const {
359 Names = GCCRegNames;
360 NumNames = llvm::array_lengthof(GCCRegNames);
361}
Chris Lattner4b009652007-07-25 00:24:17 +0000362
Eli Friedmanfd5a4122008-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 Korobeynikove7772382009-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 Friedmanfd5a4122008-08-20 23:11:40 +0000398};
399
Anton Korobeynikove7772382009-05-03 13:42:53 +0000400void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000401 unsigned &NumAliases) const {
402 Aliases = GCCRegAliases;
403 NumAliases = llvm::array_lengthof(GCCRegAliases);
404}
405} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000406
407namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000408class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000409public:
Eli Friedman2b161652008-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 Lattner4b009652007-07-25 00:24:17 +0000414};
415} // end anonymous namespace.
416
417namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000418class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000419public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000420 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000421 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-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 Lattnere5fde952008-05-09 06:17:04 +0000424 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000425};
426} // end anonymous namespace.
427
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000428
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000429namespace {
430class DarwinPPCTargetInfo : public PPC32TargetInfo {
431public:
432 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
Chris Lattner79682402009-03-20 15:52:06 +0000433 virtual void getTargetDefines(const LangOptions &Opts,
434 std::vector<char> &Defines) const {
435 PPC32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000436 getDarwinDefines(Defines, Opts);
437 getDarwinOSXDefines(Defines, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000438 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000439
Chris Lattnerddae7102008-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 Korobeynikove7772382009-05-03 13:42:53 +0000442 /// options.
Chris Lattnerddae7102008-12-04 22:54:33 +0000443 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000444 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000445 }
Eli Friedmanfd5a4122008-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 Lattner79682402009-03-20 15:52:06 +0000453 virtual void getTargetDefines(const LangOptions &Opts,
454 std::vector<char> &Defines) const {
455 PPC64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000456 getDarwinDefines(Defines, Opts);
457 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000458 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000459
Chris Lattnerddae7102008-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 Korobeynikove7772382009-05-03 13:42:53 +0000462 /// options.
Chris Lattnerddae7102008-12-04 22:54:33 +0000463 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000464 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000465 }
Chris Lattner4b009652007-07-25 00:24:17 +0000466};
467} // end anonymous namespace.
468
469namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000470// Namespace for x86 abstract base class
471const Builtin::Info BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-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 Friedman872996c2008-08-20 02:34:37 +0000474#include "clang/AST/X86Builtins.def"
475};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000476
Eli Friedman872996c2008-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 Lattner715fe4c2009-03-02 22:40:39 +0000501 enum X86SSEEnum {
502 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
503 } SSELevel;
Eli Friedman872996c2008-08-20 02:34:37 +0000504public:
Anton Korobeynikove7772382009-05-03 13:42:53 +0000505 X86TargetInfo(const std::string& triple)
Daniel Dunbar07181d72009-05-06 03:16:41 +0000506 : TargetInfo(triple), SSELevel(NoMMXSSE) {
Eli Friedman872996c2008-08-20 02:34:37 +0000507 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000508 }
509 virtual void getTargetBuiltins(const Builtin::Info *&Records,
510 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000511 Records = BuiltinInfo;
512 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000513 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000514 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000515 return "x86";
Anton Korobeynikove7772382009-05-03 13:42:53 +0000516 }
517 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000518 unsigned &NumNames) const {
519 Names = GCCRegNames;
520 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000521 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000522 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000523 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000524 Aliases = GCCRegAliases;
525 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000526 }
Anders Carlsson36834a72009-02-28 17:11:49 +0000527 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +0000528 TargetInfo::ConstraintInfo &info) const;
529 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000530 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000531 return "~{dirflag},~{fpsr},~{flags}";
532 }
Chris Lattner79682402009-03-20 15:52:06 +0000533 virtual void getTargetDefines(const LangOptions &Opts,
534 std::vector<char> &Defines) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000535
Daniel Dunbar07181d72009-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);
Chris Lattner4b009652007-07-25 00:24:17 +0000539};
Chris Lattner7d6220c2009-03-02 22:20:04 +0000540
Daniel Dunbar07181d72009-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 Korobeynikove7772382009-05-03 13:42:53 +0000553
Daniel Dunbar07181d72009-05-06 03:16:41 +0000554 // LLVM does not currently recognize this.
555 // Features["sse4a"] = false;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000556
Daniel Dunbar07181d72009-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;
Daniel Dunbar106c79a2009-05-06 04:58:14 +0000568 else if (CPU == "yonah")
569 Features["sse3"] = Features["sse2"] = Features["sse"] =
570 Features["mmx"] = true;
Daniel Dunbar07181d72009-05-06 03:16:41 +0000571 else if (CPU == "pentium4")
572 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
573}
574
575/// HandleTargetOptions - Perform initialization based on the user
576/// configured set of features.
577void X86TargetInfo::HandleTargetFeatures(const llvm::StringMap<bool>&Features) {
578 if (Features.lookup("sse42"))
579 SSELevel = SSE42;
580 else if (Features.lookup("sse41"))
581 SSELevel = SSE41;
582 else if (Features.lookup("ssse3"))
583 SSELevel = SSSE3;
584 else if (Features.lookup("sse3"))
585 SSELevel = SSE3;
586 else if (Features.lookup("sse2"))
587 SSELevel = SSE2;
588 else if (Features.lookup("sse"))
589 SSELevel = SSE1;
590 else if (Features.lookup("mmx"))
591 SSELevel = MMX;
Chris Lattner7d6220c2009-03-02 22:20:04 +0000592}
Chris Lattnerbef1d722009-03-02 22:27:17 +0000593
594/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
595/// that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000596void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
597 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000598 // Target identification.
599 if (PointerWidth == 64) {
600 Define(Defs, "_LP64");
601 Define(Defs, "__LP64__");
602 Define(Defs, "__amd64__");
603 Define(Defs, "__amd64");
604 Define(Defs, "__x86_64");
605 Define(Defs, "__x86_64__");
606 Define(Defs, "__SSE3__");
607 } else {
Chris Lattnerc345a802009-03-20 16:06:38 +0000608 DefineStd(Defs, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +0000609 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000610
Chris Lattnerbef1d722009-03-02 22:27:17 +0000611 // Target properties.
612 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000613
Chris Lattnerbef1d722009-03-02 22:27:17 +0000614 // Subtarget options.
615 Define(Defs, "__nocona");
616 Define(Defs, "__nocona__");
617 Define(Defs, "__tune_nocona__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000618 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +0000619
Chris Lattner25ac1c12009-04-19 17:32:33 +0000620 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
621 // functions in glibc header files that use FP Stack inline asm which the
622 // backend can't deal with (PR879).
623 Define(Defs, "__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000624
Chris Lattner715fe4c2009-03-02 22:40:39 +0000625 // Each case falls through to the previous one here.
626 switch (SSELevel) {
627 case SSE42:
628 Define(Defs, "__SSE4_2__");
629 case SSE41:
630 Define(Defs, "__SSE4_1__");
631 case SSSE3:
632 Define(Defs, "__SSSE3__");
633 case SSE3:
634 Define(Defs, "__SSE3__");
635 case SSE2:
636 Define(Defs, "__SSE2__");
637 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
638 case SSE1:
639 Define(Defs, "__SSE__");
640 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
641 case MMX:
642 Define(Defs, "__MMX__");
643 case NoMMXSSE:
644 break;
645 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000646}
Anton Korobeynikove7772382009-05-03 13:42:53 +0000647
648
Eli Friedman872996c2008-08-20 02:34:37 +0000649bool
Anders Carlsson36834a72009-02-28 17:11:49 +0000650X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000651 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000652 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +0000653 default: return false;
654 case 'a': // eax.
655 case 'b': // ebx.
656 case 'c': // ecx.
657 case 'd': // edx.
658 case 'S': // esi.
659 case 'D': // edi.
660 case 'A': // edx:eax.
661 case 't': // top of floating point stack.
662 case 'u': // second from top of floating point stack.
663 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000664 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000665 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000666 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikove7772382009-05-03 13:42:53 +0000667 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +0000668 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +0000669 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +0000670 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000671 case 'N': // unsigned 8-bit integer constant for use with in and out
672 // instructions.
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000673 Info.setAllowsRegister();
Eli Friedman872996c2008-08-20 02:34:37 +0000674 return true;
675 }
676}
677
678std::string
679X86TargetInfo::convertConstraint(const char Constraint) const {
680 switch (Constraint) {
681 case 'a': return std::string("{ax}");
682 case 'b': return std::string("{bx}");
683 case 'c': return std::string("{cx}");
684 case 'd': return std::string("{dx}");
685 case 'S': return std::string("{si}");
686 case 'D': return std::string("{di}");
687 case 't': // top of floating point stack.
688 return std::string("{st}");
689 case 'u': // second from top of floating point stack.
690 return std::string("{st(1)}"); // second from top of floating point stack.
691 default:
692 return std::string(1, Constraint);
693 }
694}
Eli Friedman872996c2008-08-20 02:34:37 +0000695} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000696
697namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000698// X86-32 generic target
699class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000700public:
Eli Friedman872996c2008-08-20 02:34:37 +0000701 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
702 DoubleAlign = LongLongAlign = 32;
703 LongDoubleWidth = 96;
704 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000705 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
706 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
707 "a0:0:64-f80:32:32";
Eli Friedman04ede302009-03-29 20:31:09 +0000708 SizeType = UnsignedInt;
709 PtrDiffType = SignedInt;
710 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000711 RegParmMax = 3;
Eli Friedman872996c2008-08-20 02:34:37 +0000712 }
713 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000714 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000715 }
Eli Friedman872996c2008-08-20 02:34:37 +0000716};
717} // end anonymous namespace
718
719namespace {
720// x86-32 Darwin (OS X) target
721class DarwinI386TargetInfo : public X86_32TargetInfo {
722public:
723 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
724 LongDoubleWidth = 128;
725 LongDoubleAlign = 128;
Eli Friedman04ede302009-03-29 20:31:09 +0000726 SizeType = UnsignedLong;
727 IntPtrType = SignedLong;
Eli Friedman2b161652008-08-21 00:13:15 +0000728 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
729 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
730 "a0:0:64-f80:128:128";
Eli Friedman8f575172009-04-19 21:38:35 +0000731 TLSSupported = false;
Eli Friedman872996c2008-08-20 02:34:37 +0000732 }
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000733
Anton Korobeynikove7772382009-05-03 13:42:53 +0000734 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000735 return IsConstant ? "\01LC" : "\01lC";
736 }
737
Anton Korobeynikove7772382009-05-03 13:42:53 +0000738 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbar6a916482009-04-03 00:57:44 +0000739 return "__utf16_string_";
740 }
741
Anton Korobeynikove7772382009-05-03 13:42:53 +0000742 virtual const char *getUnicodeStringSection() const {
Daniel Dunbar6a916482009-04-03 00:57:44 +0000743 return "__TEXT,__ustring";
744 }
745
Anton Korobeynikove7772382009-05-03 13:42:53 +0000746 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000747 return "\01LC";
748 }
749
Chris Lattner79682402009-03-20 15:52:06 +0000750 virtual void getTargetDefines(const LangOptions &Opts,
751 std::vector<char> &Defines) const {
752 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000753 getDarwinDefines(Defines, Opts);
754 getDarwinOSXDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000755 }
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000756
Chris Lattnerddae7102008-12-04 22:54:33 +0000757 /// getDefaultLangOptions - Allow the target to specify default settings for
758 /// various language options. These may be overridden by command line
Anton Korobeynikove7772382009-05-03 13:42:53 +0000759 /// options.
Chris Lattnerddae7102008-12-04 22:54:33 +0000760 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000761 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000762 }
Eli Friedman872996c2008-08-20 02:34:37 +0000763};
764} // end anonymous namespace
765
766namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000767// x86-32 FreeBSD target
768class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
769public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000770 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman04ede302009-03-29 20:31:09 +0000771 X86_32TargetInfo(triple) { }
Chris Lattner79682402009-03-20 15:52:06 +0000772 virtual void getTargetDefines(const LangOptions &Opts,
773 std::vector<char> &Defines) const {
774 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000775 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000776 }
777};
778} // end anonymous namespace
779
780namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000781// x86-32 DragonFly target
782class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
783public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000784 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman04ede302009-03-29 20:31:09 +0000785 X86_32TargetInfo(triple) { }
Chris Lattner79682402009-03-20 15:52:06 +0000786 virtual void getTargetDefines(const LangOptions &Opts,
787 std::vector<char> &Defines) const {
788 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000789 getDragonFlyDefines(Opts, Defines);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000790 }
791};
792} // end anonymous namespace
793
794namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000795// x86-32 Linux target
796class LinuxX86_32TargetInfo : public X86_32TargetInfo {
797public:
798 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000799 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000800 }
Chris Lattner79682402009-03-20 15:52:06 +0000801 virtual void getTargetDefines(const LangOptions &Opts,
802 std::vector<char> &Defines) const {
803 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000804 getLinuxDefines(Opts, Defines);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000805 }
806};
807} // end anonymous namespace
808
809namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000810// x86-32 Windows target
811class WindowsX86_32TargetInfo : public X86_32TargetInfo {
812public:
813 WindowsX86_32TargetInfo(const std::string& triple)
814 : X86_32TargetInfo(triple) {
Eli Friedman8f575172009-04-19 21:38:35 +0000815 TLSSupported = false;
Eli Friedman23cb7912008-08-21 01:40:19 +0000816 // FIXME: Fix wchar_t.
817 // FIXME: We should probably enable -fms-extensions by default for
818 // this target.
819 }
Chris Lattner79682402009-03-20 15:52:06 +0000820 virtual void getTargetDefines(const LangOptions &Opts,
821 std::vector<char> &Defines) const {
822 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedman23cb7912008-08-21 01:40:19 +0000823 // This list is based off of the the list of things MingW defines
Eli Friedman23cb7912008-08-21 01:40:19 +0000824 Define(Defines, "_WIN32");
Chris Lattnerc345a802009-03-20 16:06:38 +0000825 DefineStd(Defines, "WIN32", Opts);
826 DefineStd(Defines, "WINNT", Opts);
Eli Friedman23cb7912008-08-21 01:40:19 +0000827 Define(Defines, "_X86_");
828 Define(Defines, "__MSVCRT__");
829 }
830};
831} // end anonymous namespace
832
833namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000834// x86-64 generic target
835class X86_64TargetInfo : public X86TargetInfo {
836public:
Chris Lattner79682402009-03-20 15:52:06 +0000837 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000838 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner4dfc45a2009-01-28 06:58:19 +0000839 DoubleAlign = LongLongAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000840 LongDoubleWidth = 128;
841 LongDoubleAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000842 IntMaxType = SignedLong;
843 UIntMaxType = UnsignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000844 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000845
Eli Friedman2b161652008-08-21 00:13:15 +0000846 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
847 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
848 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000849 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000850 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000851 return "typedef struct __va_list_tag {"
852 " unsigned gp_offset;"
853 " unsigned fp_offset;"
854 " void* overflow_arg_area;"
855 " void* reg_save_area;"
856 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000857 }
Eli Friedman872996c2008-08-20 02:34:37 +0000858};
859} // end anonymous namespace
860
861namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000862// x86-64 FreeBSD target
863class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
864public:
Chris Lattner79682402009-03-20 15:52:06 +0000865 FreeBSDX86_64TargetInfo(const std::string &triple)
866 : X86_64TargetInfo(triple) {}
867 virtual void getTargetDefines(const LangOptions &Opts,
868 std::vector<char> &Defines) const {
869 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000870 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000871 }
872};
873} // end anonymous namespace
874
875namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000876// x86-64 Linux target
877class LinuxX86_64TargetInfo : public X86_64TargetInfo {
878public:
879 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000880 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000881 }
Chris Lattner79682402009-03-20 15:52:06 +0000882 virtual void getTargetDefines(const LangOptions &Opts,
883 std::vector<char> &Defines) const {
884 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000885 getLinuxDefines(Opts, Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000886 }
887};
888} // end anonymous namespace
889
890namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000891// x86-64 Darwin (OS X) target
892class DarwinX86_64TargetInfo : public X86_64TargetInfo {
893public:
Eli Friedman8f575172009-04-19 21:38:35 +0000894 DarwinX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
895 TLSSupported = false;
896 }
Eli Friedman872996c2008-08-20 02:34:37 +0000897
Anton Korobeynikove7772382009-05-03 13:42:53 +0000898 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000899 return IsConstant ? "\01LC" : "\01lC";
900 }
901
Anton Korobeynikove7772382009-05-03 13:42:53 +0000902 virtual const char *getUnicodeStringSymbolPrefix() const {
Daniel Dunbar6a916482009-04-03 00:57:44 +0000903 return "__utf16_string_";
904 }
905
Anton Korobeynikove7772382009-05-03 13:42:53 +0000906 virtual const char *getUnicodeStringSection() const {
Daniel Dunbar6a916482009-04-03 00:57:44 +0000907 return "__TEXT,__ustring";
908 }
909
Anton Korobeynikove7772382009-05-03 13:42:53 +0000910 virtual const char *getCFStringSymbolPrefix() const {
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000911 return "\01L_unnamed_cfstring_";
912 }
913
Chris Lattner79682402009-03-20 15:52:06 +0000914 virtual void getTargetDefines(const LangOptions &Opts,
915 std::vector<char> &Defines) const {
916 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000917 getDarwinDefines(Defines, Opts);
918 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000919 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000920
Chris Lattnerddae7102008-12-04 22:54:33 +0000921 /// getDefaultLangOptions - Allow the target to specify default settings for
922 /// various language options. These may be overridden by command line
Anton Korobeynikove7772382009-05-03 13:42:53 +0000923 /// options.
Chris Lattnerddae7102008-12-04 22:54:33 +0000924 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000925 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000926 }
Chris Lattner4b009652007-07-25 00:24:17 +0000927};
928} // end anonymous namespace.
929
Chris Lattner9fd73612008-04-21 18:56:49 +0000930namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000931class ARMTargetInfo : public TargetInfo {
Mike Stumpf90a29f2009-04-08 02:07:04 +0000932 enum {
933 Armv4t,
934 Armv5,
935 Armv6,
936 XScale
937 } ArmArch;
Chris Lattner9fd73612008-04-21 18:56:49 +0000938public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000939 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
940 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000941 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
942 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Chris Lattner433d9722009-04-23 04:22:04 +0000943 if (triple.find("arm-") == 0 || triple.find("armv6-") == 0)
Mike Stumpf90a29f2009-04-08 02:07:04 +0000944 ArmArch = Armv6;
Chris Lattner433d9722009-04-23 04:22:04 +0000945 else if (triple.find("armv5-") == 0)
Mike Stumpf90a29f2009-04-08 02:07:04 +0000946 ArmArch = Armv5;
Chris Lattner433d9722009-04-23 04:22:04 +0000947 else if (triple.find("armv4t-") == 0)
Mike Stumpf90a29f2009-04-08 02:07:04 +0000948 ArmArch = Armv4t;
Chris Lattner433d9722009-04-23 04:22:04 +0000949 else if (triple.find("xscale-") == 0)
Mike Stumpf90a29f2009-04-08 02:07:04 +0000950 ArmArch = XScale;
Chris Lattner433d9722009-04-23 04:22:04 +0000951 else if (triple.find("armv") == 0) {
952 // FIXME: fuzzy match for other random weird arm triples. This is useful
953 // for the static analyzer and other clients, but probably should be
954 // re-evaluated when codegen is brought up.
955 ArmArch = Armv6;
956 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000957 }
Chris Lattner79682402009-03-20 15:52:06 +0000958 virtual void getTargetDefines(const LangOptions &Opts,
959 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000960 // Target identification.
961 Define(Defs, "__arm");
962 Define(Defs, "__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000963
Chris Lattnerbef1d722009-03-02 22:27:17 +0000964 // Target properties.
965 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000966
Mike Stumpf90a29f2009-04-08 02:07:04 +0000967 // Subtarget options.
968 if (ArmArch == Armv6) {
969 Define(Defs, "__ARM_ARCH_6K__");
970 Define(Defs, "__THUMB_INTERWORK__");
971 } else if (ArmArch == Armv5) {
972 Define(Defs, "__ARM_ARCH_5TEJ__");
973 Define(Defs, "__THUMB_INTERWORK__");
974 Define(Defs, "__SOFTFP__");
975 } else if (ArmArch == Armv4t) {
976 Define(Defs, "__ARM_ARCH_4T__");
977 Define(Defs, "__SOFTFP__");
978 } else if (ArmArch == XScale) {
979 Define(Defs, "__ARM_ARCH_5TE__");
980 Define(Defs, "__XSCALE__");
981 Define(Defs, "__SOFTFP__");
982 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000983 Define(Defs, "__ARMEL__");
Chris Lattner9fd73612008-04-21 18:56:49 +0000984 }
985 virtual void getTargetBuiltins(const Builtin::Info *&Records,
986 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000987 // FIXME: Implement.
988 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000989 NumRecords = 0;
990 }
991 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000992 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000993 }
994 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000995 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000996 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000997 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9fd73612008-04-21 18:56:49 +0000998 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000999 // FIXME: Implement.
1000 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +00001001 NumNames = 0;
1002 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001003 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9fd73612008-04-21 18:56:49 +00001004 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001005 // FIXME: Implement.
1006 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +00001007 NumAliases = 0;
1008 }
Anders Carlsson36834a72009-02-28 17:11:49 +00001009 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00001010 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001011 // FIXME: Check if this is complete
Anders Carlsson36834a72009-02-28 17:11:49 +00001012 switch (*Name) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001013 default:
Nate Begeman222823a2008-04-22 05:03:19 +00001014 case 'l': // r0-r7
1015 case 'h': // r8-r15
1016 case 'w': // VFP Floating point register single precision
1017 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00001018 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00001019 return true;
1020 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001021 return false;
1022 }
1023 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001024 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00001025 return "";
1026 }
1027};
1028} // end anonymous namespace.
1029
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001030
1031namespace {
1032class DarwinARMTargetInfo : public ARMTargetInfo {
1033public:
Eli Friedman8f575172009-04-19 21:38:35 +00001034 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {
1035 TLSSupported = false;
1036 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001037
Chris Lattner79682402009-03-20 15:52:06 +00001038 virtual void getTargetDefines(const LangOptions &Opts,
1039 std::vector<char> &Defines) const {
1040 ARMTargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +00001041 getDarwinDefines(Defines, Opts);
1042 getDarwinIPhoneOSDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001043 }
1044};
1045} // end anonymous namespace.
1046
Chris Lattner4b009652007-07-25 00:24:17 +00001047namespace {
Daniel Dunbar88fd9942009-03-23 16:09:04 +00001048// arm FreeBSD target
1049class FreeBSDARMTargetInfo : public ARMTargetInfo {
1050public:
1051 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1052 virtual void getTargetDefines(const LangOptions &Opts,
1053 std::vector<char> &Defines) const {
1054 ARMTargetInfo::getTargetDefines(Opts, Defines);
1055 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
1056 }
1057};
1058} // end anonymous namespace
1059
1060namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001061class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001062 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1063 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001064public:
Eli Friedmanff158dd2008-08-20 07:28:14 +00001065 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1066 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +00001067 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1068 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +00001069 }
Chris Lattner79682402009-03-20 15:52:06 +00001070 virtual void getTargetDefines(const LangOptions &Opts,
1071 std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001072 // FIXME: This is missing a lot of important defines; some of the
1073 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001074 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +00001075 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001076 Define(Defines, "__sparcv8");
1077 }
1078 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1079 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001080 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001081 }
1082 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001083 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001084 }
1085 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001086 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001087 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001088 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001089 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +00001090 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001091 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00001092 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001093 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001094 // FIXME: Implement!
1095 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001096 }
1097 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001098 // FIXME: Implement!
1099 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001100 }
1101};
1102
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001103const char * const SparcV8TargetInfo::GCCRegNames[] = {
1104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1105 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1106 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1107 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1108};
1109
Anton Korobeynikove7772382009-05-03 13:42:53 +00001110void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001111 unsigned &NumNames) const {
1112 Names = GCCRegNames;
1113 NumNames = llvm::array_lengthof(GCCRegNames);
1114}
1115
1116const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00001117 { { "g0" }, "r0" },
1118 { { "g1" }, "r1" },
1119 { { "g2" }, "r2" },
1120 { { "g3" }, "r3" },
1121 { { "g4" }, "r4" },
1122 { { "g5" }, "r5" },
1123 { { "g6" }, "r6" },
1124 { { "g7" }, "r7" },
1125 { { "o0" }, "r8" },
1126 { { "o1" }, "r9" },
1127 { { "o2" }, "r10" },
1128 { { "o3" }, "r11" },
1129 { { "o4" }, "r12" },
1130 { { "o5" }, "r13" },
1131 { { "o6", "sp" }, "r14" },
1132 { { "o7" }, "r15" },
1133 { { "l0" }, "r16" },
1134 { { "l1" }, "r17" },
1135 { { "l2" }, "r18" },
1136 { { "l3" }, "r19" },
1137 { { "l4" }, "r20" },
1138 { { "l5" }, "r21" },
1139 { { "l6" }, "r22" },
1140 { { "l7" }, "r23" },
1141 { { "i0" }, "r24" },
1142 { { "i1" }, "r25" },
1143 { { "i2" }, "r26" },
1144 { { "i3" }, "r27" },
1145 { { "i4" }, "r28" },
1146 { { "i5" }, "r29" },
1147 { { "i6", "fp" }, "r30" },
1148 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001149};
1150
Anton Korobeynikove7772382009-05-03 13:42:53 +00001151void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001152 unsigned &NumAliases) const {
1153 Aliases = GCCRegAliases;
1154 NumAliases = llvm::array_lengthof(GCCRegAliases);
1155}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001156} // end anonymous namespace.
1157
Eli Friedmanff158dd2008-08-20 07:28:14 +00001158namespace {
1159class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1160public:
1161 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +00001162 SparcV8TargetInfo(triple) {
1163 SizeType = UnsignedInt;
1164 PtrDiffType = SignedInt;
1165 }
Eli Friedmanff158dd2008-08-20 07:28:14 +00001166
Chris Lattner79682402009-03-20 15:52:06 +00001167 virtual void getTargetDefines(const LangOptions &Opts,
1168 std::vector<char> &Defines) const {
1169 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanff158dd2008-08-20 07:28:14 +00001170 getSolarisDefines(Defines);
1171 }
1172};
1173} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001174
Chris Lattner85970f32008-05-08 05:58:21 +00001175namespace {
1176 class PIC16TargetInfo : public TargetInfo{
1177 public:
1178 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman8f575172009-04-19 21:38:35 +00001179 TLSSupported = false;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001180 IntWidth = 16;
1181 LongWidth = LongLongWidth = 32;
1182 PointerWidth = 16;
1183 IntAlign = 8;
1184 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001185 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001186 SizeType = UnsignedInt;
1187 IntMaxType = SignedLong;
1188 UIntMaxType = UnsignedLong;
Chris Lattnerd9ef7242009-02-13 22:28:55 +00001189 IntPtrType = SignedShort;
Eli Friedman7cca0982008-11-02 02:43:55 +00001190 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +00001191 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +00001192 }
Chris Lattner727b3c42008-05-09 06:08:39 +00001193 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1194 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner79682402009-03-20 15:52:06 +00001195 virtual void getTargetDefines(const LangOptions &Opts,
1196 std::vector<char> &Defines) const {
Chris Lattner85970f32008-05-08 05:58:21 +00001197 Define(Defines, "__pic16");
1198 }
1199 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1200 unsigned &NumRecords) const {}
1201 virtual const char *getVAListDeclaration() const { return "";}
1202 virtual const char *getClobbers() const {return "";}
Sanjiv Gupta88b4e512009-04-21 06:01:16 +00001203 virtual const char *getTargetPrefix() const {return "pic16";}
Anton Korobeynikove7772382009-05-03 13:42:53 +00001204 virtual void getGCCRegNames(const char * const *&Names,
1205 unsigned &NumNames) const {}
1206 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner85970f32008-05-08 05:58:21 +00001207 TargetInfo::ConstraintInfo &info) const {
1208 return true;
1209 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001210 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner85970f32008-05-08 05:58:21 +00001211 unsigned &NumAliases) const {}
1212 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1213 };
1214}
1215
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00001216namespace {
1217 class MSP430TargetInfo : public TargetInfo {
1218 static const char * const GCCRegNames[];
1219 public:
1220 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1221 TLSSupported = false;
1222 IntWidth = 16;
1223 LongWidth = LongLongWidth = 32;
1224 PointerWidth = 16;
1225 IntAlign = 8;
1226 LongAlign = LongLongAlign = 8;
1227 PointerAlign = 8;
1228 SizeType = UnsignedInt;
1229 IntMaxType = SignedLong;
1230 UIntMaxType = UnsignedLong;
1231 IntPtrType = SignedShort;
1232 PtrDiffType = SignedInt;
1233 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
1234 }
1235 virtual void getTargetDefines(const LangOptions &Opts,
1236 std::vector<char> &Defines) const {
1237 Define(Defines, "MSP430");
1238 Define(Defines, "__MSP430__");
1239 // FIXME: defines for different 'flavours' of MCU
1240 }
1241 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1242 unsigned &NumRecords) const {
1243 // FIXME: Implement.
1244 Records = 0;
1245 NumRecords = 0;
1246 }
1247 virtual const char *getTargetPrefix() const {
1248 return "msp430";
1249 }
1250 virtual void getGCCRegNames(const char * const *&Names,
1251 unsigned &NumNames) const;
1252 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1253 unsigned &NumAliases) const {
1254 // No aliases.
1255 Aliases = 0;
1256 NumAliases = 0;
1257 }
1258 virtual bool validateAsmConstraint(const char *&Name,
1259 TargetInfo::ConstraintInfo &info) const {
1260 // FIXME: implement
1261 return true;
1262 }
1263 virtual const char *getClobbers() const {
1264 // FIXME: Is this really right?
1265 return "";
1266 }
1267 virtual const char *getVAListDeclaration() const {
1268 // FIXME: implement
1269 return "";
1270 }
1271 };
1272
1273 const char * const MSP430TargetInfo::GCCRegNames[] = {
1274 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1275 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1276 };
1277
1278 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
1279 unsigned &NumNames) const {
1280 Names = GCCRegNames;
1281 NumNames = llvm::array_lengthof(GCCRegNames);
1282 }
1283}
1284
1285
Chris Lattner4b009652007-07-25 00:24:17 +00001286//===----------------------------------------------------------------------===//
1287// Driver code
1288//===----------------------------------------------------------------------===//
1289
Ted Kremenekb97d7672007-12-04 17:07:35 +00001290static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +00001291 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1292 TT[4] == '-' && TT[1] - '3' < 6);
1293}
1294
Chris Lattnerfc457002008-03-05 01:18:20 +00001295/// CreateTargetInfo - Return the target info object for the specified target
1296/// triple.
1297TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +00001298 // OS detection; this isn't really anywhere near complete.
1299 // Additions and corrections are welcome.
1300 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +00001301 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +00001302 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +00001303 bool isSolaris = T.find("-solaris") != std::string::npos;
1304 bool isLinux = T.find("-linux") != std::string::npos;
1305 bool isWindows = T.find("-windows") != std::string::npos ||
1306 T.find("-win32") != std::string::npos ||
1307 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001308
Eli Friedman2b161652008-08-21 00:13:15 +00001309 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1310 if (isDarwin)
1311 return new DarwinPPCTargetInfo(T);
1312 return new PPC32TargetInfo(T);
1313 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001314
Eli Friedman2b161652008-08-21 00:13:15 +00001315 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1316 if (isDarwin)
1317 return new DarwinPPC64TargetInfo(T);
1318 return new PPC64TargetInfo(T);
1319 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001320
Chris Lattner433d9722009-04-23 04:22:04 +00001321 if (T.find("armv") == 0 || T.find("arm-") == 0 || T.find("xscale") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001322 if (isDarwin)
1323 return new DarwinARMTargetInfo(T);
Daniel Dunbar88fd9942009-03-23 16:09:04 +00001324 if (isFreeBSD)
1325 return new FreeBSDARMTargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001326 return new ARMTargetInfo(T);
1327 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001328
Eli Friedman2b161652008-08-21 00:13:15 +00001329 if (T.find("sparc-") == 0) {
1330 if (isSolaris)
1331 return new SolarisSparcV8TargetInfo(T);
1332 return new SparcV8TargetInfo(T);
1333 }
1334
Chris Lattner273dce42009-02-20 17:04:14 +00001335 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001336 if (isDarwin)
1337 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001338 if (isLinux)
1339 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001340 if (isFreeBSD)
1341 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001342 return new X86_64TargetInfo(T);
1343 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001344
Chris Lattner85970f32008-05-08 05:58:21 +00001345 if (T.find("pic16-") == 0)
1346 return new PIC16TargetInfo(T);
1347
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00001348 if (T.find("msp430-") == 0)
1349 return new MSP430TargetInfo(T);
1350
Eli Friedman2b161652008-08-21 00:13:15 +00001351 if (IsX86(T)) {
1352 if (isDarwin)
1353 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001354 if (isLinux)
1355 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001356 if (isDragonFly)
1357 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001358 if (isFreeBSD)
1359 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001360 if (isWindows)
1361 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001362 return new X86_32TargetInfo(T);
1363 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001364
Chris Lattnerfc457002008-03-05 01:18:20 +00001365 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001366}