blob: 055d16b76b8a9acf5d186b5e9d172686948bd9ee [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//
Ted Kremenek38591a22007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// 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.
42static void DefineStd(std::vector<char> &Buf, const char *MacroName,
43 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
45
46 // 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);
50
51 // Define __unix.
52 llvm::SmallString<20> TmpStr;
53 TmpStr = "__";
54 TmpStr += MacroName;
55 Define(Buf, TmpStr.c_str());
56
57 // 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;
119
120 Darwin += strlen("-darwin");
121 if (Darwin[0] < '0' || Darwin[0] > '9')
122 return true;
123
124 Maj = Darwin[0]-'0';
125 ++Darwin;
126
127 // 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 }
132
133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
Daniel Dunbar93f64532009-04-10 19:52:24 +0000134 if (Darwin[0] != '.')
135 return true;
136
137 ++Darwin;
138 if (Darwin[0] < '0' || Darwin[0] > '9')
139 return true;
140
141 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 }
149
150 // Handle revision darwin8.9.1
151 if (Darwin[0] != '.')
152 return true;
153
154 ++Darwin;
155 if (Darwin[0] < '0' || Darwin[0] > '9')
156 return true;
157
158 Revision = Darwin[0]-'0';
159 ++Darwin;
160
161 if (Revision == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
162 Revision = Revision*10 + (Darwin[0] - '0');
163 ++Darwin;
164 }
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000165
166 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");
173
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)))");
176
177 // 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 }
193
194 // 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
201static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
202 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 }
Chris Lattnerd7bc88b2008-12-04 23:20:07 +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';
216 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
217 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;
225
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;
229
230 // 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
Fariborz Jahanian27f58962009-02-24 23:34:44 +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 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000260
Chris Lattner79682402009-03-20 15:52:06 +0000261 virtual void getTargetDefines(const LangOptions &Opts,
262 std::vector<char> &Defines) const;
Chris Lattnerbef1d722009-03-02 22:27:17 +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 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000278 virtual void getGCCRegNames(const char * const *&Names,
279 unsigned &NumNames) const;
280 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
281 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +0000282 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedmanfd5a4122008-08-20 23:11:40 +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
290 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
291 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};
Chris Lattnerbef1d722009-03-02 22:27:17 +0000304
305
306/// 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 }
322
323 // Target properties.
324 Define(Defs, "_BIG_ENDIAN");
325 Define(Defs, "__BIG_ENDIAN__");
326
327 // Subtarget options.
328 Define(Defs, "__NATURAL_ALIGNMENT__");
329 Define(Defs, "__REGISTER_PREFIX__", "");
330
331 // 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
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000357void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
358 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.
366 { { "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" },
398};
399
400void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
401 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
442 /// options.
443 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
462 /// options.
463 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:
Chris Lattner715fe4c2009-03-02 22:40:39 +0000505 X86TargetInfo(const std::string& triple)
Chris Lattnerf6790a82009-03-03 19:56:18 +0000506 : TargetInfo(triple),
507 // FIXME: hard coding to SSE2 for now. This should change to NoMMXSSE so
508 // that the driver controls this.
509 SSELevel(SSE2) {
Eli Friedman872996c2008-08-20 02:34:37 +0000510 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000511 }
512 virtual void getTargetBuiltins(const Builtin::Info *&Records,
513 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000514 Records = BuiltinInfo;
515 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000516 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000517 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000518 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000519 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000520 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000521 unsigned &NumNames) const {
522 Names = GCCRegNames;
523 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000524 }
525 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
526 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000527 Aliases = GCCRegAliases;
528 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000529 }
Anders Carlsson36834a72009-02-28 17:11:49 +0000530 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +0000531 TargetInfo::ConstraintInfo &info) const;
532 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000533 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000534 return "~{dirflag},~{fpsr},~{flags}";
535 }
Chris Lattner79682402009-03-20 15:52:06 +0000536 virtual void getTargetDefines(const LangOptions &Opts,
537 std::vector<char> &Defines) const;
Chris Lattner7d6220c2009-03-02 22:20:04 +0000538
Chris Lattnerf6790a82009-03-03 19:56:18 +0000539 virtual int HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
540 std::string &ErrorReason);
Chris Lattner4b009652007-07-25 00:24:17 +0000541};
Chris Lattner7d6220c2009-03-02 22:20:04 +0000542
543/// HandleTargetOptions - Handle target-specific options like -msse2 and
544/// friends. An array of arguments is passed in: if they are all valid, this
545/// should handle them and return -1. If there is an error, the index of the
546/// invalid argument should be returned along with an optional error string.
Chris Lattnerf6790a82009-03-03 19:56:18 +0000547int X86TargetInfo::HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
548 std::string &ErrorReason) {
549 for (unsigned i = 0; i != NumStrs; ++i) {
550 const std::string &Feature = StrArray[i];
551 if (Feature.size() < 2) return i;
552 // Ignore explicitly disabled features.
553 if (Feature[0] == '-') continue;
554
555 // Feature strings are of the form "+feature".
556 if (Feature[0] != '+') return i;
557
558 // The set of supported subtarget features is defined in
559 // lib/Target/X86/X86.td. Here we recognize and map onto our internal
560 // state.
561 if (Feature == "+mmx")
562 SSELevel = std::max(SSELevel, MMX);
563 else if (Feature == "+sse")
564 SSELevel = std::max(SSELevel, SSE1);
565 else if (Feature == "+sse2")
566 SSELevel = std::max(SSELevel, SSE2);
567 else if (Feature == "+sse3")
568 SSELevel = std::max(SSELevel, SSE3);
569 else if (Feature == "+ssse3")
570 SSELevel = std::max(SSELevel, SSSE3);
571 else if (Feature == "+sse41")
572 SSELevel = std::max(SSELevel, SSE41);
573 else if (Feature == "+sse42")
574 SSELevel = std::max(SSELevel, SSE42);
575 else if (Feature == "+64bit" || Feature == "+slow-bt-mem")
576 // Ignore these features.
577 continue;
578 else
579 return i;
580 }
581 return -1;
Chris Lattner7d6220c2009-03-02 22:20:04 +0000582}
Chris Lattnerbef1d722009-03-02 22:27:17 +0000583
584/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
585/// that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000586void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
587 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000588 // Target identification.
589 if (PointerWidth == 64) {
590 Define(Defs, "_LP64");
591 Define(Defs, "__LP64__");
592 Define(Defs, "__amd64__");
593 Define(Defs, "__amd64");
594 Define(Defs, "__x86_64");
595 Define(Defs, "__x86_64__");
596 Define(Defs, "__SSE3__");
597 } else {
Chris Lattnerc345a802009-03-20 16:06:38 +0000598 DefineStd(Defs, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +0000599 }
600
601 // Target properties.
602 Define(Defs, "__LITTLE_ENDIAN__");
603
604 // Subtarget options.
605 Define(Defs, "__nocona");
606 Define(Defs, "__nocona__");
607 Define(Defs, "__tune_nocona__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000608 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +0000609
610 // Each case falls through to the previous one here.
611 switch (SSELevel) {
612 case SSE42:
613 Define(Defs, "__SSE4_2__");
614 case SSE41:
615 Define(Defs, "__SSE4_1__");
616 case SSSE3:
617 Define(Defs, "__SSSE3__");
618 case SSE3:
619 Define(Defs, "__SSE3__");
620 case SSE2:
621 Define(Defs, "__SSE2__");
622 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
623 case SSE1:
624 Define(Defs, "__SSE__");
625 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
626 case MMX:
627 Define(Defs, "__MMX__");
628 case NoMMXSSE:
629 break;
630 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000631}
632
Eli Friedman872996c2008-08-20 02:34:37 +0000633
634bool
Anders Carlsson36834a72009-02-28 17:11:49 +0000635X86TargetInfo::validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +0000636 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000637 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +0000638 default: return false;
639 case 'a': // eax.
640 case 'b': // ebx.
641 case 'c': // ecx.
642 case 'd': // edx.
643 case 'S': // esi.
644 case 'D': // edi.
645 case 'A': // edx:eax.
646 case 't': // top of floating point stack.
647 case 'u': // second from top of floating point stack.
648 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000649 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000650 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000651 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssonff235da2009-01-24 18:03:09 +0000652 case 'e': // 32-bit signed integer constant for use with zero-extending
653 // x86_64 instructions.
654 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
655 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000656 case 'N': // unsigned 8-bit integer constant for use with in and out
657 // instructions.
658 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
659 return true;
660 }
661}
662
663std::string
664X86TargetInfo::convertConstraint(const char Constraint) const {
665 switch (Constraint) {
666 case 'a': return std::string("{ax}");
667 case 'b': return std::string("{bx}");
668 case 'c': return std::string("{cx}");
669 case 'd': return std::string("{dx}");
670 case 'S': return std::string("{si}");
671 case 'D': return std::string("{di}");
672 case 't': // top of floating point stack.
673 return std::string("{st}");
674 case 'u': // second from top of floating point stack.
675 return std::string("{st(1)}"); // second from top of floating point stack.
676 default:
677 return std::string(1, Constraint);
678 }
679}
Eli Friedman872996c2008-08-20 02:34:37 +0000680} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000681
682namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000683// X86-32 generic target
684class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000685public:
Eli Friedman872996c2008-08-20 02:34:37 +0000686 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
687 DoubleAlign = LongLongAlign = 32;
688 LongDoubleWidth = 96;
689 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000690 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
691 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
692 "a0:0:64-f80:32:32";
Eli Friedman04ede302009-03-29 20:31:09 +0000693 SizeType = UnsignedInt;
694 PtrDiffType = SignedInt;
695 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000696 RegParmMax = 3;
Eli Friedman872996c2008-08-20 02:34:37 +0000697 }
698 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000699 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000700 }
Eli Friedman872996c2008-08-20 02:34:37 +0000701};
702} // end anonymous namespace
703
704namespace {
705// x86-32 Darwin (OS X) target
706class DarwinI386TargetInfo : public X86_32TargetInfo {
707public:
708 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
709 LongDoubleWidth = 128;
710 LongDoubleAlign = 128;
Eli Friedman04ede302009-03-29 20:31:09 +0000711 SizeType = UnsignedLong;
712 IntPtrType = SignedLong;
Eli Friedman2b161652008-08-21 00:13:15 +0000713 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
714 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
715 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000716 }
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000717
718 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
719 return IsConstant ? "\01LC" : "\01lC";
720 }
721
Daniel Dunbar6a916482009-04-03 00:57:44 +0000722 virtual const char *getUnicodeStringSymbolPrefix() const {
723 return "__utf16_string_";
724 }
725
726 virtual const char *getUnicodeStringSection() const {
727 return "__TEXT,__ustring";
728 }
729
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000730 virtual const char *getCFStringSymbolPrefix() const {
731 return "\01LC";
732 }
733
Chris Lattner79682402009-03-20 15:52:06 +0000734 virtual void getTargetDefines(const LangOptions &Opts,
735 std::vector<char> &Defines) const {
736 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000737 getDarwinDefines(Defines, Opts);
738 getDarwinOSXDefines(Defines, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000739 }
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000740
Chris Lattnerddae7102008-12-04 22:54:33 +0000741 /// getDefaultLangOptions - Allow the target to specify default settings for
742 /// various language options. These may be overridden by command line
743 /// options.
744 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000745 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000746 }
Eli Friedman872996c2008-08-20 02:34:37 +0000747};
748} // end anonymous namespace
749
750namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000751// x86-32 FreeBSD target
752class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
753public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000754 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman04ede302009-03-29 20:31:09 +0000755 X86_32TargetInfo(triple) { }
Chris Lattner79682402009-03-20 15:52:06 +0000756 virtual void getTargetDefines(const LangOptions &Opts,
757 std::vector<char> &Defines) const {
758 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000759 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000760 }
761};
762} // end anonymous namespace
763
764namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000765// x86-32 DragonFly target
766class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
767public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000768 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman04ede302009-03-29 20:31:09 +0000769 X86_32TargetInfo(triple) { }
Chris Lattner79682402009-03-20 15:52:06 +0000770 virtual void getTargetDefines(const LangOptions &Opts,
771 std::vector<char> &Defines) const {
772 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000773 getDragonFlyDefines(Opts, Defines);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000774 }
775};
776} // end anonymous namespace
777
778namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000779// x86-32 Linux target
780class LinuxX86_32TargetInfo : public X86_32TargetInfo {
781public:
782 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000783 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000784 }
Chris Lattner79682402009-03-20 15:52:06 +0000785 virtual void getTargetDefines(const LangOptions &Opts,
786 std::vector<char> &Defines) const {
787 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000788 getLinuxDefines(Opts, Defines);
Chris Lattner919a57b2009-04-19 17:29:50 +0000789
790 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
791 // functions in glibc header files that use FP Stack inline asm which the
792 // backend can't deal with (PR879).
793 Define(Defines, "__NO_MATH_INLINES");
Eli Friedman5fb0a022008-08-21 00:24:02 +0000794 }
795};
796} // end anonymous namespace
797
798namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000799// x86-32 Windows target
800class WindowsX86_32TargetInfo : public X86_32TargetInfo {
801public:
802 WindowsX86_32TargetInfo(const std::string& triple)
803 : X86_32TargetInfo(triple) {
804 // FIXME: Fix wchar_t.
805 // FIXME: We should probably enable -fms-extensions by default for
806 // this target.
807 }
Chris Lattner79682402009-03-20 15:52:06 +0000808 virtual void getTargetDefines(const LangOptions &Opts,
809 std::vector<char> &Defines) const {
810 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedman23cb7912008-08-21 01:40:19 +0000811 // This list is based off of the the list of things MingW defines
Eli Friedman23cb7912008-08-21 01:40:19 +0000812 Define(Defines, "_WIN32");
Chris Lattnerc345a802009-03-20 16:06:38 +0000813 DefineStd(Defines, "WIN32", Opts);
814 DefineStd(Defines, "WINNT", Opts);
Eli Friedman23cb7912008-08-21 01:40:19 +0000815 Define(Defines, "_X86_");
816 Define(Defines, "__MSVCRT__");
817 }
818};
819} // end anonymous namespace
820
821namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000822// x86-64 generic target
823class X86_64TargetInfo : public X86TargetInfo {
824public:
Chris Lattner79682402009-03-20 15:52:06 +0000825 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000826 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner4dfc45a2009-01-28 06:58:19 +0000827 DoubleAlign = LongLongAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000828 LongDoubleWidth = 128;
829 LongDoubleAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000830 IntMaxType = SignedLong;
831 UIntMaxType = UnsignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000832 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000833
Eli Friedman2b161652008-08-21 00:13:15 +0000834 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
835 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
836 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000837 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000838 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000839 return "typedef struct __va_list_tag {"
840 " unsigned gp_offset;"
841 " unsigned fp_offset;"
842 " void* overflow_arg_area;"
843 " void* reg_save_area;"
844 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000845 }
Eli Friedman872996c2008-08-20 02:34:37 +0000846};
847} // end anonymous namespace
848
849namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000850// x86-64 FreeBSD target
851class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
852public:
Chris Lattner79682402009-03-20 15:52:06 +0000853 FreeBSDX86_64TargetInfo(const std::string &triple)
854 : X86_64TargetInfo(triple) {}
855 virtual void getTargetDefines(const LangOptions &Opts,
856 std::vector<char> &Defines) const {
857 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000858 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000859 }
860};
861} // end anonymous namespace
862
863namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000864// x86-64 Linux target
865class LinuxX86_64TargetInfo : public X86_64TargetInfo {
866public:
867 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000868 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000869 }
Chris Lattner79682402009-03-20 15:52:06 +0000870 virtual void getTargetDefines(const LangOptions &Opts,
871 std::vector<char> &Defines) const {
872 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner919a57b2009-04-19 17:29:50 +0000873 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
874 // functions in glibc header files that use FP Stack inline asm which the
875 // backend can't deal with (PR879).
876 Define(Defines, "__NO_MATH_INLINES");
877
Chris Lattnerab81f162009-03-20 15:55:34 +0000878 getLinuxDefines(Opts, Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000879 }
880};
881} // end anonymous namespace
882
883namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000884// x86-64 Darwin (OS X) target
885class DarwinX86_64TargetInfo : public X86_64TargetInfo {
886public:
887 DarwinX86_64TargetInfo(const std::string& triple) :
888 X86_64TargetInfo(triple) {}
889
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000890 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
891 return IsConstant ? "\01LC" : "\01lC";
892 }
893
Daniel Dunbar6a916482009-04-03 00:57:44 +0000894 virtual const char *getUnicodeStringSymbolPrefix() const {
895 return "__utf16_string_";
896 }
897
898 virtual const char *getUnicodeStringSection() const {
899 return "__TEXT,__ustring";
900 }
901
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000902 virtual const char *getCFStringSymbolPrefix() const {
903 return "\01L_unnamed_cfstring_";
904 }
905
Chris Lattner79682402009-03-20 15:52:06 +0000906 virtual void getTargetDefines(const LangOptions &Opts,
907 std::vector<char> &Defines) const {
908 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000909 getDarwinDefines(Defines, Opts);
910 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000911 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000912
Chris Lattnerddae7102008-12-04 22:54:33 +0000913 /// getDefaultLangOptions - Allow the target to specify default settings for
914 /// various language options. These may be overridden by command line
915 /// options.
916 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000917 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000918 }
Chris Lattner4b009652007-07-25 00:24:17 +0000919};
920} // end anonymous namespace.
921
Chris Lattner9fd73612008-04-21 18:56:49 +0000922namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000923class ARMTargetInfo : public TargetInfo {
Mike Stumpf90a29f2009-04-08 02:07:04 +0000924 enum {
925 Armv4t,
926 Armv5,
927 Armv6,
928 XScale
929 } ArmArch;
Chris Lattner9fd73612008-04-21 18:56:49 +0000930public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000931 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
932 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000933 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
934 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Mike Stumpf90a29f2009-04-08 02:07:04 +0000935 if (triple.find("arm-") || triple.find("armv6-"))
936 ArmArch = Armv6;
937 else if (triple.find("armv5-"))
938 ArmArch = Armv5;
939 else if (triple.find("armv4t-"))
940 ArmArch = Armv4t;
941 else if (triple.find("xscale-"))
942 ArmArch = XScale;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000943 }
Chris Lattner79682402009-03-20 15:52:06 +0000944 virtual void getTargetDefines(const LangOptions &Opts,
945 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000946 // Target identification.
947 Define(Defs, "__arm");
948 Define(Defs, "__arm__");
949
950 // Target properties.
951 Define(Defs, "__LITTLE_ENDIAN__");
952
Mike Stumpf90a29f2009-04-08 02:07:04 +0000953 // Subtarget options.
954 if (ArmArch == Armv6) {
955 Define(Defs, "__ARM_ARCH_6K__");
956 Define(Defs, "__THUMB_INTERWORK__");
957 } else if (ArmArch == Armv5) {
958 Define(Defs, "__ARM_ARCH_5TEJ__");
959 Define(Defs, "__THUMB_INTERWORK__");
960 Define(Defs, "__SOFTFP__");
961 } else if (ArmArch == Armv4t) {
962 Define(Defs, "__ARM_ARCH_4T__");
963 Define(Defs, "__SOFTFP__");
964 } else if (ArmArch == XScale) {
965 Define(Defs, "__ARM_ARCH_5TE__");
966 Define(Defs, "__XSCALE__");
967 Define(Defs, "__SOFTFP__");
968 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000969 Define(Defs, "__ARMEL__");
Chris Lattner9fd73612008-04-21 18:56:49 +0000970 }
971 virtual void getTargetBuiltins(const Builtin::Info *&Records,
972 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000973 // FIXME: Implement.
974 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000975 NumRecords = 0;
976 }
977 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000978 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000979 }
980 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000981 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000982 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000983 virtual void getGCCRegNames(const char * const *&Names,
984 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000985 // FIXME: Implement.
986 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000987 NumNames = 0;
988 }
989 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
990 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000991 // FIXME: Implement.
992 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000993 NumAliases = 0;
994 }
Anders Carlsson36834a72009-02-28 17:11:49 +0000995 virtual bool validateAsmConstraint(const char *&Name,
Nate Begeman222823a2008-04-22 05:03:19 +0000996 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000997 // FIXME: Check if this is complete
Anders Carlsson36834a72009-02-28 17:11:49 +0000998 switch (*Name) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000999 default:
Nate Begeman222823a2008-04-22 05:03:19 +00001000 case 'l': // r0-r7
1001 case 'h': // r8-r15
1002 case 'w': // VFP Floating point register single precision
1003 case 'P': // VFP Floating point register double precision
1004 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
1005 return true;
1006 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001007 return false;
1008 }
1009 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001010 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00001011 return "";
1012 }
1013};
1014} // end anonymous namespace.
1015
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001016
1017namespace {
1018class DarwinARMTargetInfo : public ARMTargetInfo {
1019public:
1020 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1021
Chris Lattner79682402009-03-20 15:52:06 +00001022 virtual void getTargetDefines(const LangOptions &Opts,
1023 std::vector<char> &Defines) const {
1024 ARMTargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar93f64532009-04-10 19:52:24 +00001025 getDarwinDefines(Defines, Opts);
1026 getDarwinIPhoneOSDefines(Defines, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001027 }
1028};
1029} // end anonymous namespace.
1030
Chris Lattner4b009652007-07-25 00:24:17 +00001031namespace {
Daniel Dunbar88fd9942009-03-23 16:09:04 +00001032// arm FreeBSD target
1033class FreeBSDARMTargetInfo : public ARMTargetInfo {
1034public:
1035 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1036 virtual void getTargetDefines(const LangOptions &Opts,
1037 std::vector<char> &Defines) const {
1038 ARMTargetInfo::getTargetDefines(Opts, Defines);
1039 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
1040 }
1041};
1042} // end anonymous namespace
1043
1044namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001045class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001046 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1047 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001048public:
Eli Friedmanff158dd2008-08-20 07:28:14 +00001049 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1050 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +00001051 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1052 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +00001053 }
Chris Lattner79682402009-03-20 15:52:06 +00001054 virtual void getTargetDefines(const LangOptions &Opts,
1055 std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001056 // FIXME: This is missing a lot of important defines; some of the
1057 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001058 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +00001059 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001060 Define(Defines, "__sparcv8");
1061 }
1062 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1063 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001064 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001065 }
1066 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001067 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001068 }
1069 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001070 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001071 }
1072 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001073 unsigned &NumNames) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001074 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001075 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00001076 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001077 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001078 // FIXME: Implement!
1079 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001080 }
1081 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001082 // FIXME: Implement!
1083 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001084 }
1085};
1086
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001087const char * const SparcV8TargetInfo::GCCRegNames[] = {
1088 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1089 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1090 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1091 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1092};
1093
1094void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
1095 unsigned &NumNames) const {
1096 Names = GCCRegNames;
1097 NumNames = llvm::array_lengthof(GCCRegNames);
1098}
1099
1100const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
1101 { { "g0" }, "r0" },
1102 { { "g1" }, "r1" },
1103 { { "g2" }, "r2" },
1104 { { "g3" }, "r3" },
1105 { { "g4" }, "r4" },
1106 { { "g5" }, "r5" },
1107 { { "g6" }, "r6" },
1108 { { "g7" }, "r7" },
1109 { { "o0" }, "r8" },
1110 { { "o1" }, "r9" },
1111 { { "o2" }, "r10" },
1112 { { "o3" }, "r11" },
1113 { { "o4" }, "r12" },
1114 { { "o5" }, "r13" },
1115 { { "o6", "sp" }, "r14" },
1116 { { "o7" }, "r15" },
1117 { { "l0" }, "r16" },
1118 { { "l1" }, "r17" },
1119 { { "l2" }, "r18" },
1120 { { "l3" }, "r19" },
1121 { { "l4" }, "r20" },
1122 { { "l5" }, "r21" },
1123 { { "l6" }, "r22" },
1124 { { "l7" }, "r23" },
1125 { { "i0" }, "r24" },
1126 { { "i1" }, "r25" },
1127 { { "i2" }, "r26" },
1128 { { "i3" }, "r27" },
1129 { { "i4" }, "r28" },
1130 { { "i5" }, "r29" },
1131 { { "i6", "fp" }, "r30" },
1132 { { "i7" }, "r31" },
1133};
1134
1135void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1136 unsigned &NumAliases) const {
1137 Aliases = GCCRegAliases;
1138 NumAliases = llvm::array_lengthof(GCCRegAliases);
1139}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001140} // end anonymous namespace.
1141
Eli Friedmanff158dd2008-08-20 07:28:14 +00001142namespace {
1143class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1144public:
1145 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +00001146 SparcV8TargetInfo(triple) {
1147 SizeType = UnsignedInt;
1148 PtrDiffType = SignedInt;
1149 }
Eli Friedmanff158dd2008-08-20 07:28:14 +00001150
Chris Lattner79682402009-03-20 15:52:06 +00001151 virtual void getTargetDefines(const LangOptions &Opts,
1152 std::vector<char> &Defines) const {
1153 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanff158dd2008-08-20 07:28:14 +00001154 getSolarisDefines(Defines);
1155 }
1156};
1157} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001158
Chris Lattner85970f32008-05-08 05:58:21 +00001159namespace {
1160 class PIC16TargetInfo : public TargetInfo{
1161 public:
1162 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptafa451432008-10-31 09:52:39 +00001163 IntWidth = 16;
1164 LongWidth = LongLongWidth = 32;
1165 PointerWidth = 16;
1166 IntAlign = 8;
1167 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001168 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001169 SizeType = UnsignedInt;
1170 IntMaxType = SignedLong;
1171 UIntMaxType = UnsignedLong;
Chris Lattnerd9ef7242009-02-13 22:28:55 +00001172 IntPtrType = SignedShort;
Eli Friedman7cca0982008-11-02 02:43:55 +00001173 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +00001174 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +00001175 }
Chris Lattner727b3c42008-05-09 06:08:39 +00001176 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1177 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner79682402009-03-20 15:52:06 +00001178 virtual void getTargetDefines(const LangOptions &Opts,
1179 std::vector<char> &Defines) const {
Chris Lattner85970f32008-05-08 05:58:21 +00001180 Define(Defines, "__pic16");
1181 }
1182 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1183 unsigned &NumRecords) const {}
1184 virtual const char *getVAListDeclaration() const { return "";}
1185 virtual const char *getClobbers() const {return "";}
1186 virtual const char *getTargetPrefix() const {return "";}
1187 virtual void getGCCRegNames(const char * const *&Names,
1188 unsigned &NumNames) const {}
Anders Carlsson36834a72009-02-28 17:11:49 +00001189 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner85970f32008-05-08 05:58:21 +00001190 TargetInfo::ConstraintInfo &info) const {
1191 return true;
1192 }
1193 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1194 unsigned &NumAliases) const {}
1195 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1196 };
1197}
1198
Chris Lattner4b009652007-07-25 00:24:17 +00001199//===----------------------------------------------------------------------===//
1200// Driver code
1201//===----------------------------------------------------------------------===//
1202
Ted Kremenekb97d7672007-12-04 17:07:35 +00001203static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +00001204 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1205 TT[4] == '-' && TT[1] - '3' < 6);
1206}
1207
Chris Lattnerfc457002008-03-05 01:18:20 +00001208/// CreateTargetInfo - Return the target info object for the specified target
1209/// triple.
1210TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +00001211 // OS detection; this isn't really anywhere near complete.
1212 // Additions and corrections are welcome.
1213 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +00001214 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +00001215 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +00001216 bool isSolaris = T.find("-solaris") != std::string::npos;
1217 bool isLinux = T.find("-linux") != std::string::npos;
1218 bool isWindows = T.find("-windows") != std::string::npos ||
1219 T.find("-win32") != std::string::npos ||
1220 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001221
Eli Friedman2b161652008-08-21 00:13:15 +00001222 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1223 if (isDarwin)
1224 return new DarwinPPCTargetInfo(T);
1225 return new PPC32TargetInfo(T);
1226 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001227
Eli Friedman2b161652008-08-21 00:13:15 +00001228 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1229 if (isDarwin)
1230 return new DarwinPPC64TargetInfo(T);
1231 return new PPC64TargetInfo(T);
1232 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001233
Mike Stumpf90a29f2009-04-08 02:07:04 +00001234 if (T.find("armv6-") == 0 || T.find("arm-") == 0
1235 || T.find("armv4t") == 0 || T.find("armv5-") == 0
1236 || T.find("xscale") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001237 if (isDarwin)
1238 return new DarwinARMTargetInfo(T);
Daniel Dunbar88fd9942009-03-23 16:09:04 +00001239 if (isFreeBSD)
1240 return new FreeBSDARMTargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001241 return new ARMTargetInfo(T);
1242 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001243
Eli Friedman2b161652008-08-21 00:13:15 +00001244 if (T.find("sparc-") == 0) {
1245 if (isSolaris)
1246 return new SolarisSparcV8TargetInfo(T);
1247 return new SparcV8TargetInfo(T);
1248 }
1249
Chris Lattner273dce42009-02-20 17:04:14 +00001250 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001251 if (isDarwin)
1252 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001253 if (isLinux)
1254 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001255 if (isFreeBSD)
1256 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001257 return new X86_64TargetInfo(T);
1258 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001259
Chris Lattner85970f32008-05-08 05:58:21 +00001260 if (T.find("pic16-") == 0)
1261 return new PIC16TargetInfo(T);
1262
Eli Friedman2b161652008-08-21 00:13:15 +00001263 if (IsX86(T)) {
1264 if (isDarwin)
1265 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001266 if (isLinux)
1267 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001268 if (isDragonFly)
1269 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001270 if (isFreeBSD)
1271 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001272 if (isWindows)
1273 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001274 return new X86_32TargetInfo(T);
1275 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001276
Chris Lattnerfc457002008-03-05 01:18:20 +00001277 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001278}
Ted Kremenekd507bab2008-03-04 17:47:18 +00001279