blob: fa23ba916214e0c1e4ba008fa81996255213e8c8 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenekbbced582007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Douglas Gregorb1152d82009-02-16 21:58:21 +000015// FIXME: Layering violation
Reid Spencer5f016e22007-07-11 17:01:13 +000016#include "clang/AST/Builtins.h"
Anders Carlsson564f1de2007-12-09 23:17:02 +000017#include "clang/AST/TargetBuiltins.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000018#include "clang/Basic/TargetInfo.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000019#include "clang/Basic/LangOptions.h"
Anders Carlsson3346ae62007-11-24 23:38:12 +000020#include "llvm/ADT/STLExtras.h"
Eli Friedman25531262008-05-20 14:27:34 +000021#include "llvm/ADT/APFloat.h"
Chris Lattnerca45cff2009-03-20 16:06:38 +000022#include "llvm/ADT/SmallString.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000023using namespace clang;
24
Reid Spencer5f016e22007-07-11 17:01:13 +000025//===----------------------------------------------------------------------===//
26// Common code shared among targets.
27//===----------------------------------------------------------------------===//
28
Chris Lattnerd15fa822007-10-06 06:57:34 +000029static void Define(std::vector<char> &Buf, const char *Macro,
30 const char *Val = "1") {
31 const char *Def = "#define ";
32 Buf.insert(Buf.end(), Def, Def+strlen(Def));
33 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
34 Buf.push_back(' ');
35 Buf.insert(Buf.end(), Val, Val+strlen(Val));
36 Buf.push_back('\n');
37}
38
Chris Lattnerca45cff2009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
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 Lattnerd29b6302008-10-05 21:50:58 +000062//===----------------------------------------------------------------------===//
63// Defines specific to certain operating systems.
64//===----------------------------------------------------------------------===//
65
Eli Friedman01b86682008-08-20 07:28:14 +000066static void getSolarisDefines(std::vector<char> &Defs) {
67 Define(Defs, "__SUN__");
68 Define(Defs, "__SOLARIS__");
69}
Reid Spencer5f016e22007-07-11 17:01:13 +000070
Chris Lattner318ca712009-03-20 15:55:34 +000071static void getFreeBSDDefines(const LangOptions &Opts, bool is64Bit,
72 const char *Triple, std::vector<char> &Defs) {
Chris Lattnerfd0269d2008-10-16 17:04:31 +000073 // FreeBSD defines; list based off of gcc output
74
75 const char *FreeBSD = strstr(Triple, "-freebsd");
76 FreeBSD += strlen("-freebsd");
77 char release[] = "X";
78 release[0] = FreeBSD[0];
79 char version[] = "X00001";
80 version[0] = FreeBSD[0];
81
82 Define(Defs, "__FreeBSD__", release);
83 Define(Defs, "__FreeBSD_cc_version", version);
84 Define(Defs, "__KPRINTF_ATTRIBUTE__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000085 DefineStd(Defs, "unix", Opts);
Anton Korobeynikov2793bda2009-02-14 16:42:50 +000086 Define(Defs, "__ELF__", "1");
Chris Lattnerfd0269d2008-10-16 17:04:31 +000087 if (is64Bit) {
88 Define(Defs, "__LP64__");
89 }
90}
91
Chris Lattner318ca712009-03-20 15:55:34 +000092static void getDragonFlyDefines(const LangOptions &Opts,
93 std::vector<char> &Defs) {
Chris Lattnerd29b6302008-10-05 21:50:58 +000094 // DragonFly defines; list based off of gcc output
95 Define(Defs, "__DragonFly__");
96 Define(Defs, "__DragonFly_cc_version", "100001");
97 Define(Defs, "__ELF__");
98 Define(Defs, "__KPRINTF_ATTRIBUTE__");
99 Define(Defs, "__tune_i386__");
Chris Lattnerca45cff2009-03-20 16:06:38 +0000100 DefineStd(Defs, "unix", Opts);
Chris Lattnerd29b6302008-10-05 21:50:58 +0000101}
102
Chris Lattner318ca712009-03-20 15:55:34 +0000103static void getLinuxDefines(const LangOptions &Opts, std::vector<char> &Defs) {
Chris Lattnerd29b6302008-10-05 21:50:58 +0000104 // Linux defines; list based off of gcc output
Chris Lattnerca45cff2009-03-20 16:06:38 +0000105 DefineStd(Defs, "unix", Opts);
106 DefineStd(Defs, "linux", Opts);
Chris Lattnerd29b6302008-10-05 21:50:58 +0000107 Define(Defs, "__gnu_linux__");
Argyrios Kyrtzidis487cdee2009-02-14 15:02:45 +0000108 Define(Defs, "__ELF__", "1");
Chris Lattnerd29b6302008-10-05 21:50:58 +0000109}
110
Chris Lattnerae0ee032008-12-04 23:20:07 +0000111/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000112/// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is
Chris Lattnerae0ee032008-12-04 23:20:07 +0000113/// not defined, return 0's. Return true if we have -darwin in the string or
114/// false otherwise.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000115static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min, unsigned &Revision) {
116 Maj = Min = Revision = 0;
Chris Lattnerae0ee032008-12-04 23:20:07 +0000117 const char *Darwin = strstr(Triple, "-darwin");
118 if (Darwin == 0) return false;
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 Dunbar8d33cd72009-04-10 19:52:24 +0000129 Maj = Maj*10 + (Darwin[0] - '0');
Chris Lattnerae0ee032008-12-04 23:20:07 +0000130 ++Darwin;
131 }
132
133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
Daniel Dunbar8d33cd72009-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 Lattnerae0ee032008-12-04 23:20:07 +0000165
166 return true;
167}
168
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000169static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
Eli Friedman618234a2008-08-20 02:34:37 +0000170 Define(Defs, "__APPLE__");
171 Define(Defs, "__MACH__");
Chris Lattnerd427ad42009-02-05 07:19:24 +0000172 Define(Defs, "OBJC_NEW_PROPERTIES");
173
Chris Lattner10d24272009-04-07 16:50:40 +0000174 // __weak is always defined, for use in blocks and with objc pointers.
175 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
176
177 // Darwin defines __strong even in C mode (just to nothing).
178 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Chris Lattner3a5cbd32009-04-07 04:48:21 +0000179 Define(Defs, "__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +0000180 else
Chris Lattner3a5cbd32009-04-07 04:48:21 +0000181 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000182}
183
184static void getDarwinOSXDefines(std::vector<char> &Defs, const char *Triple) {
Chris Lattner8b30c412008-09-30 01:00:25 +0000185 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000186 unsigned Maj, Min, Rev;
187 if (getDarwinNumber(Triple, Maj, Min, Rev)) {
188 char MacOSXStr[] = "1000";
Chris Lattnerae0ee032008-12-04 23:20:07 +0000189 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
190 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000191 MacOSXStr[2] = '0' + Maj-4;
192 }
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 Lattner8b30c412008-09-30 01:00:25 +0000212 }
Chris Lattnerae0ee032008-12-04 23:20:07 +0000213
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000214 // Handle minor version: 2.2 -> darwin9.2.2 -> 20200
215 iPhoneOSStr[2] = std::min(Rev, 9U)+'0';
216 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
217 iPhoneOSStr);
Chris Lattner8b30c412008-09-30 01:00:25 +0000218 }
Eli Friedman618234a2008-08-20 02:34:37 +0000219}
Reid Spencer5f016e22007-07-11 17:01:13 +0000220
Chris Lattnerae0ee032008-12-04 23:20:07 +0000221/// GetDarwinLanguageOptions - Set the default language options for darwin.
222static void GetDarwinLanguageOptions(LangOptions &Opts,
223 const char *Triple) {
224 Opts.NeXTRuntime = true;
225
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000226 unsigned Maj, Min, Rev;
227 if (!getDarwinNumber(Triple, Maj, Min, Rev))
Chris Lattnerae0ee032008-12-04 23:20:07 +0000228 return;
229
230 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahaniana30b17b2009-02-12 17:54:33 +0000231 // As does nonfragile-abi for 64bit mode
Fariborz Jahanian66a5c2c2009-02-24 23:34:44 +0000232 if (Maj > 9)
Chris Lattnerae0ee032008-12-04 23:20:07 +0000233 Opts.Blocks = 1;
Fariborz Jahanian66a5c2c2009-02-24 23:34:44 +0000234
Fariborz Jahanian84d01332009-02-24 23:38:42 +0000235 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
236 Opts.ObjCNonFragileABI = 1;
Chris Lattnerae0ee032008-12-04 23:20:07 +0000237}
238
239
Chris Lattnerd29b6302008-10-05 21:50:58 +0000240//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000241// Specific target implementations.
242//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000243
Eli Friedmane4277982008-08-20 23:11:40 +0000244namespace {
245// PPC abstract base class
246class PPCTargetInfo : public TargetInfo {
247 static const Builtin::Info BuiltinInfo[];
248 static const char * const GCCRegNames[];
249 static const TargetInfo::GCCRegAlias GCCRegAliases[];
250
251public:
252 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
253 CharIsSigned = false;
254 }
255 virtual void getTargetBuiltins(const Builtin::Info *&Records,
256 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000257 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000258 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000259 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000260
Chris Lattner33328642009-03-20 15:52:06 +0000261 virtual void getTargetDefines(const LangOptions &Opts,
262 std::vector<char> &Defines) const;
Chris Lattnerc0f59212009-03-02 22:27:17 +0000263
Eli Friedmane4277982008-08-20 23:11:40 +0000264 virtual const char *getVAListDeclaration() const {
Chris Lattnerd5998502008-10-27 01:11:29 +0000265 return "typedef char* __builtin_va_list;";
266 // This is the right definition for ABI/V4: System V.4/eabi.
267 /*return "typedef struct __va_list_tag {"
Eli Friedmane4277982008-08-20 23:11:40 +0000268 " unsigned char gpr;"
269 " unsigned char fpr;"
270 " unsigned short reserved;"
271 " void* overflow_arg_area;"
272 " void* reg_save_area;"
Chris Lattnerd5998502008-10-27 01:11:29 +0000273 "} __builtin_va_list[1];";*/
Anders Carlsson3346ae62007-11-24 23:38:12 +0000274 }
Eli Friedmane4277982008-08-20 23:11:40 +0000275 virtual const char *getTargetPrefix() const {
276 return "ppc";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000277 }
Eli Friedmane4277982008-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 Carlsson066d2ea2009-02-28 17:11:49 +0000282 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedmane4277982008-08-20 23:11:40 +0000283 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000284 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000285 default: return false;
286 case 'O': // Zero
287 return true;
288 case 'b': // Base register
289 case 'f': // Floating point register
290 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
291 return true;
292 }
293 }
Eli Friedmane4277982008-08-20 23:11:40 +0000294 virtual const char *getClobbers() const {
295 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000296 }
Eli Friedmane4277982008-08-20 23:11:40 +0000297};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000298
Eli Friedmane4277982008-08-20 23:11:40 +0000299const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregorb1152d82009-02-16 21:58:21 +0000300#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
301#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedmane4277982008-08-20 23:11:40 +0000302#include "clang/AST/PPCBuiltins.def"
303};
Chris Lattnerc0f59212009-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 Lattner33328642009-03-20 15:52:06 +0000308void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
309 std::vector<char> &Defs) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000310 // Target identification.
311 Define(Defs, "__ppc__");
312 Define(Defs, "_ARCH_PPC");
313 Define(Defs, "__POWERPC__");
314 if (PointerWidth == 64) {
315 Define(Defs, "_ARCH_PPC64");
316 Define(Defs, "_LP64");
317 Define(Defs, "__LP64__");
318 Define(Defs, "__ppc64__");
319 } else {
320 Define(Defs, "__ppc__");
321 }
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 Lattner393ff042008-04-21 18:56:49 +0000335
Eli Friedmane4277982008-08-20 23:11:40 +0000336const char * const PPCTargetInfo::GCCRegNames[] = {
337 "0", "1", "2", "3", "4", "5", "6", "7",
338 "8", "9", "10", "11", "12", "13", "14", "15",
339 "16", "17", "18", "19", "20", "21", "22", "23",
340 "24", "25", "26", "27", "28", "29", "30", "31",
341 "0", "1", "2", "3", "4", "5", "6", "7",
342 "8", "9", "10", "11", "12", "13", "14", "15",
343 "16", "17", "18", "19", "20", "21", "22", "23",
344 "24", "25", "26", "27", "28", "29", "30", "31",
345 "mq", "lr", "ctr", "ap",
346 "0", "1", "2", "3", "4", "5", "6", "7",
347 "xer",
348 "0", "1", "2", "3", "4", "5", "6", "7",
349 "8", "9", "10", "11", "12", "13", "14", "15",
350 "16", "17", "18", "19", "20", "21", "22", "23",
351 "24", "25", "26", "27", "28", "29", "30", "31",
352 "vrsave", "vscr",
353 "spe_acc", "spefscr",
354 "sfp"
355};
Reid Spencer5f016e22007-07-11 17:01:13 +0000356
Eli Friedmane4277982008-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}
Reid Spencer5f016e22007-07-11 17:01:13 +0000362
Eli Friedmane4277982008-08-20 23:11:40 +0000363const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
364 // While some of these aliases do map to different registers
365 // they still share the same register name.
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.
Reid Spencer5f016e22007-07-11 17:01:13 +0000406
407namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000408class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000409public:
Eli Friedmaned855cb2008-08-21 00:13:15 +0000410 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
411 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
412 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
413 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000414};
415} // end anonymous namespace.
416
417namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000418class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000419public:
Eli Friedmane4277982008-08-20 23:11:40 +0000420 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000421 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000422 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
423 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnerf291b102008-05-09 06:17:04 +0000424 }
Eli Friedmane4277982008-08-20 23:11:40 +0000425};
426} // end anonymous namespace.
427
Chris Lattnerae0ee032008-12-04 23:20:07 +0000428
Eli Friedmane4277982008-08-20 23:11:40 +0000429namespace {
430class DarwinPPCTargetInfo : public PPC32TargetInfo {
431public:
432 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
Chris Lattner33328642009-03-20 15:52:06 +0000433 virtual void getTargetDefines(const LangOptions &Opts,
434 std::vector<char> &Defines) const {
435 PPC32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000436 getDarwinDefines(Defines, Opts);
437 getDarwinOSXDefines(Defines, getTargetTriple());
Reid Spencer5f016e22007-07-11 17:01:13 +0000438 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000439
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000440 /// getDefaultLangOptions - Allow the target to specify default settings for
441 /// various language options. These may be overridden by command line
442 /// options.
443 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000444 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000445 }
Eli Friedmane4277982008-08-20 23:11:40 +0000446};
447} // end anonymous namespace.
448
449namespace {
450class DarwinPPC64TargetInfo : public PPC64TargetInfo {
451public:
452 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
Chris Lattner33328642009-03-20 15:52:06 +0000453 virtual void getTargetDefines(const LangOptions &Opts,
454 std::vector<char> &Defines) const {
455 PPC64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000456 getDarwinDefines(Defines, Opts);
457 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000458 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000459
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000460 /// getDefaultLangOptions - Allow the target to specify default settings for
461 /// various language options. These may be overridden by command line
462 /// options.
463 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000464 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000465 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000466};
467} // end anonymous namespace.
468
469namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000470// Namespace for x86 abstract base class
471const Builtin::Info BuiltinInfo[] = {
Douglas Gregorb1152d82009-02-16 21:58:21 +0000472#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
473#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedman618234a2008-08-20 02:34:37 +0000474#include "clang/AST/X86Builtins.def"
475};
Eli Friedman61538a72008-05-20 14:21:01 +0000476
Eli Friedman618234a2008-08-20 02:34:37 +0000477const char *GCCRegNames[] = {
478 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
479 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
480 "argp", "flags", "fspr", "dirflag", "frame",
481 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
482 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
483 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
484 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
485};
486
487const TargetInfo::GCCRegAlias GCCRegAliases[] = {
488 { { "al", "ah", "eax", "rax" }, "ax" },
489 { { "bl", "bh", "ebx", "rbx" }, "bx" },
490 { { "cl", "ch", "ecx", "rcx" }, "cx" },
491 { { "dl", "dh", "edx", "rdx" }, "dx" },
492 { { "esi", "rsi" }, "si" },
493 { { "edi", "rdi" }, "di" },
494 { { "esp", "rsp" }, "sp" },
495 { { "ebp", "rbp" }, "bp" },
496};
497
498// X86 target abstract base class; x86-32 and x86-64 are very close, so
499// most of the implementation can be shared.
500class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +0000501 enum X86SSEEnum {
502 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
503 } SSELevel;
Eli Friedman618234a2008-08-20 02:34:37 +0000504public:
Chris Lattner84f0ea82009-03-02 22:40:39 +0000505 X86TargetInfo(const std::string& triple)
Chris Lattner6328cc32009-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 Friedman618234a2008-08-20 02:34:37 +0000510 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +0000511 }
512 virtual void getTargetBuiltins(const Builtin::Info *&Records,
513 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000514 Records = BuiltinInfo;
515 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000516 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000517 virtual const char *getTargetPrefix() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000518 return "x86";
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000519 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000520 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +0000521 unsigned &NumNames) const {
522 Names = GCCRegNames;
523 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +0000524 }
525 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
526 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000527 Aliases = GCCRegAliases;
528 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000529 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000530 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +0000531 TargetInfo::ConstraintInfo &info) const;
532 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000533 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000534 return "~{dirflag},~{fpsr},~{flags}";
535 }
Chris Lattner33328642009-03-20 15:52:06 +0000536 virtual void getTargetDefines(const LangOptions &Opts,
537 std::vector<char> &Defines) const;
Chris Lattner3daed522009-03-02 22:20:04 +0000538
Chris Lattner6328cc32009-03-03 19:56:18 +0000539 virtual int HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
540 std::string &ErrorReason);
Reid Spencer5f016e22007-07-11 17:01:13 +0000541};
Chris Lattner3daed522009-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 Lattner6328cc32009-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 Lattner3daed522009-03-02 22:20:04 +0000582}
Chris Lattnerc0f59212009-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 Lattner33328642009-03-20 15:52:06 +0000586void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
587 std::vector<char> &Defs) const {
Chris Lattnerc0f59212009-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 Lattnerca45cff2009-03-20 16:06:38 +0000598 DefineStd(Defs, "i386", Opts);
Chris Lattnerc0f59212009-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 Lattnerc0f59212009-03-02 22:27:17 +0000608 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +0000609
Chris Lattner54175442009-04-19 17:32:33 +0000610 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
611 // functions in glibc header files that use FP Stack inline asm which the
612 // backend can't deal with (PR879).
613 Define(Defs, "__NO_MATH_INLINES");
614
Chris Lattner84f0ea82009-03-02 22:40:39 +0000615 // Each case falls through to the previous one here.
616 switch (SSELevel) {
617 case SSE42:
618 Define(Defs, "__SSE4_2__");
619 case SSE41:
620 Define(Defs, "__SSE4_1__");
621 case SSSE3:
622 Define(Defs, "__SSSE3__");
623 case SSE3:
624 Define(Defs, "__SSE3__");
625 case SSE2:
626 Define(Defs, "__SSE2__");
627 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
628 case SSE1:
629 Define(Defs, "__SSE__");
630 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
631 case MMX:
632 Define(Defs, "__MMX__");
633 case NoMMXSSE:
634 break;
635 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000636}
637
Eli Friedman618234a2008-08-20 02:34:37 +0000638
639bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000640X86TargetInfo::validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +0000641 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000642 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +0000643 default: return false;
644 case 'a': // eax.
645 case 'b': // ebx.
646 case 'c': // ecx.
647 case 'd': // edx.
648 case 'S': // esi.
649 case 'D': // edi.
650 case 'A': // edx:eax.
651 case 't': // top of floating point stack.
652 case 'u': // second from top of floating point stack.
653 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +0000654 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +0000655 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +0000656 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlsson79bc64c2009-01-24 18:03:09 +0000657 case 'e': // 32-bit signed integer constant for use with zero-extending
658 // x86_64 instructions.
659 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
660 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +0000661 case 'N': // unsigned 8-bit integer constant for use with in and out
662 // instructions.
663 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
664 return true;
665 }
666}
667
668std::string
669X86TargetInfo::convertConstraint(const char Constraint) const {
670 switch (Constraint) {
671 case 'a': return std::string("{ax}");
672 case 'b': return std::string("{bx}");
673 case 'c': return std::string("{cx}");
674 case 'd': return std::string("{dx}");
675 case 'S': return std::string("{si}");
676 case 'D': return std::string("{di}");
677 case 't': // top of floating point stack.
678 return std::string("{st}");
679 case 'u': // second from top of floating point stack.
680 return std::string("{st(1)}"); // second from top of floating point stack.
681 default:
682 return std::string(1, Constraint);
683 }
684}
Eli Friedman618234a2008-08-20 02:34:37 +0000685} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +0000686
687namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000688// X86-32 generic target
689class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000690public:
Eli Friedman618234a2008-08-20 02:34:37 +0000691 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
692 DoubleAlign = LongLongAlign = 32;
693 LongDoubleWidth = 96;
694 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000695 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
696 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
697 "a0:0:64-f80:32:32";
Eli Friedman1afabd92009-03-29 20:31:09 +0000698 SizeType = UnsignedInt;
699 PtrDiffType = SignedInt;
700 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +0000701 RegParmMax = 3;
Eli Friedman618234a2008-08-20 02:34:37 +0000702 }
703 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +0000704 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +0000705 }
Eli Friedman618234a2008-08-20 02:34:37 +0000706};
707} // end anonymous namespace
708
709namespace {
710// x86-32 Darwin (OS X) target
711class DarwinI386TargetInfo : public X86_32TargetInfo {
712public:
713 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
714 LongDoubleWidth = 128;
715 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +0000716 SizeType = UnsignedLong;
717 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000718 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
719 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
720 "a0:0:64-f80:128:128";
Eli Friedman618234a2008-08-20 02:34:37 +0000721 }
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000722
723 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
724 return IsConstant ? "\01LC" : "\01lC";
725 }
726
Daniel Dunbara9668e02009-04-03 00:57:44 +0000727 virtual const char *getUnicodeStringSymbolPrefix() const {
728 return "__utf16_string_";
729 }
730
731 virtual const char *getUnicodeStringSection() const {
732 return "__TEXT,__ustring";
733 }
734
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000735 virtual const char *getCFStringSymbolPrefix() const {
736 return "\01LC";
737 }
738
Chris Lattner33328642009-03-20 15:52:06 +0000739 virtual void getTargetDefines(const LangOptions &Opts,
740 std::vector<char> &Defines) const {
741 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000742 getDarwinDefines(Defines, Opts);
743 getDarwinOSXDefines(Defines, getTargetTriple());
Eli Friedman618234a2008-08-20 02:34:37 +0000744 }
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000745
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000746 /// getDefaultLangOptions - Allow the target to specify default settings for
747 /// various language options. These may be overridden by command line
748 /// options.
749 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000750 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000751 }
Eli Friedman618234a2008-08-20 02:34:37 +0000752};
753} // end anonymous namespace
754
755namespace {
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000756// x86-32 FreeBSD target
757class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
758public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000759 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman1afabd92009-03-29 20:31:09 +0000760 X86_32TargetInfo(triple) { }
Chris Lattner33328642009-03-20 15:52:06 +0000761 virtual void getTargetDefines(const LangOptions &Opts,
762 std::vector<char> &Defines) const {
763 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000764 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000765 }
766};
767} // end anonymous namespace
768
769namespace {
Chris Lattnereac7aee2008-08-23 18:23:14 +0000770// x86-32 DragonFly target
771class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
772public:
Eli Friedmanf509d732008-11-02 02:43:55 +0000773 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman1afabd92009-03-29 20:31:09 +0000774 X86_32TargetInfo(triple) { }
Chris Lattner33328642009-03-20 15:52:06 +0000775 virtual void getTargetDefines(const LangOptions &Opts,
776 std::vector<char> &Defines) const {
777 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000778 getDragonFlyDefines(Opts, Defines);
Chris Lattnereac7aee2008-08-23 18:23:14 +0000779 }
780};
781} // end anonymous namespace
782
783namespace {
Eli Friedman0d4047b2008-08-21 00:24:02 +0000784// x86-32 Linux target
785class LinuxX86_32TargetInfo : public X86_32TargetInfo {
786public:
787 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner9b533162008-10-05 19:44:25 +0000788 UserLabelPrefix = "";
Eli Friedman0d4047b2008-08-21 00:24:02 +0000789 }
Chris Lattner33328642009-03-20 15:52:06 +0000790 virtual void getTargetDefines(const LangOptions &Opts,
791 std::vector<char> &Defines) const {
792 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner318ca712009-03-20 15:55:34 +0000793 getLinuxDefines(Opts, Defines);
Eli Friedman0d4047b2008-08-21 00:24:02 +0000794 }
795};
796} // end anonymous namespace
797
798namespace {
Eli Friedman29a30502008-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 Lattner33328642009-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 Friedman29a30502008-08-21 01:40:19 +0000811 // This list is based off of the the list of things MingW defines
Eli Friedman29a30502008-08-21 01:40:19 +0000812 Define(Defines, "_WIN32");
Chris Lattnerca45cff2009-03-20 16:06:38 +0000813 DefineStd(Defines, "WIN32", Opts);
814 DefineStd(Defines, "WINNT", Opts);
Eli Friedman29a30502008-08-21 01:40:19 +0000815 Define(Defines, "_X86_");
816 Define(Defines, "__MSVCRT__");
817 }
818};
819} // end anonymous namespace
820
821namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000822// x86-64 generic target
823class X86_64TargetInfo : public X86TargetInfo {
824public:
Chris Lattner33328642009-03-20 15:52:06 +0000825 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000826 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner778601f2009-01-28 06:58:19 +0000827 DoubleAlign = LongLongAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +0000828 LongDoubleWidth = 128;
829 LongDoubleAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +0000830 IntMaxType = SignedLong;
831 UIntMaxType = UnsignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +0000832 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +0000833
Eli Friedmaned855cb2008-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";
Reid Spencer5f016e22007-07-11 17:01:13 +0000837 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000838 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-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 Carlsson3346ae62007-11-24 23:38:12 +0000845 }
Eli Friedman618234a2008-08-20 02:34:37 +0000846};
847} // end anonymous namespace
848
849namespace {
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000850// x86-64 FreeBSD target
851class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
852public:
Chris Lattner33328642009-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 Lattner318ca712009-03-20 15:55:34 +0000858 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattnerfd0269d2008-10-16 17:04:31 +0000859 }
860};
861} // end anonymous namespace
862
863namespace {
Daniel Dunbarb55a42b2008-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 Lattner9b533162008-10-05 19:44:25 +0000868 UserLabelPrefix = "";
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000869 }
Chris Lattner33328642009-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 Lattner318ca712009-03-20 15:55:34 +0000873 getLinuxDefines(Opts, Defines);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +0000874 }
875};
876} // end anonymous namespace
877
878namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000879// x86-64 Darwin (OS X) target
880class DarwinX86_64TargetInfo : public X86_64TargetInfo {
881public:
882 DarwinX86_64TargetInfo(const std::string& triple) :
883 X86_64TargetInfo(triple) {}
884
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000885 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
886 return IsConstant ? "\01LC" : "\01lC";
887 }
888
Daniel Dunbara9668e02009-04-03 00:57:44 +0000889 virtual const char *getUnicodeStringSymbolPrefix() const {
890 return "__utf16_string_";
891 }
892
893 virtual const char *getUnicodeStringSection() const {
894 return "__TEXT,__ustring";
895 }
896
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +0000897 virtual const char *getCFStringSymbolPrefix() const {
898 return "\01L_unnamed_cfstring_";
899 }
900
Chris Lattner33328642009-03-20 15:52:06 +0000901 virtual void getTargetDefines(const LangOptions &Opts,
902 std::vector<char> &Defines) const {
903 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000904 getDarwinDefines(Defines, Opts);
905 getDarwinOSXDefines(Defines, getTargetTriple());
Anders Carlsson3346ae62007-11-24 23:38:12 +0000906 }
Daniel Dunbardcb4a1a2008-08-23 08:43:39 +0000907
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000908 /// getDefaultLangOptions - Allow the target to specify default settings for
909 /// various language options. These may be overridden by command line
910 /// options.
911 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerae0ee032008-12-04 23:20:07 +0000912 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattner8fc4dfb2008-12-04 22:54:33 +0000913 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000914};
915} // end anonymous namespace.
916
Chris Lattner393ff042008-04-21 18:56:49 +0000917namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +0000918class ARMTargetInfo : public TargetInfo {
Mike Stump437bb4b2009-04-08 02:07:04 +0000919 enum {
920 Armv4t,
921 Armv5,
922 Armv6,
923 XScale
924 } ArmArch;
Chris Lattner393ff042008-04-21 18:56:49 +0000925public:
Eli Friedmana9f54962008-08-20 07:44:10 +0000926 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
927 // FIXME: Are the defaults correct for ARM?
Eli Friedmaned855cb2008-08-21 00:13:15 +0000928 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
929 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Mike Stump437bb4b2009-04-08 02:07:04 +0000930 if (triple.find("arm-") || triple.find("armv6-"))
931 ArmArch = Armv6;
932 else if (triple.find("armv5-"))
933 ArmArch = Armv5;
934 else if (triple.find("armv4t-"))
935 ArmArch = Armv4t;
936 else if (triple.find("xscale-"))
937 ArmArch = XScale;
Eli Friedman61538a72008-05-20 14:21:01 +0000938 }
Chris Lattner33328642009-03-20 15:52:06 +0000939 virtual void getTargetDefines(const LangOptions &Opts,
940 std::vector<char> &Defs) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000941 // Target identification.
942 Define(Defs, "__arm");
943 Define(Defs, "__arm__");
944
945 // Target properties.
946 Define(Defs, "__LITTLE_ENDIAN__");
947
Mike Stump437bb4b2009-04-08 02:07:04 +0000948 // Subtarget options.
949 if (ArmArch == Armv6) {
950 Define(Defs, "__ARM_ARCH_6K__");
951 Define(Defs, "__THUMB_INTERWORK__");
952 } else if (ArmArch == Armv5) {
953 Define(Defs, "__ARM_ARCH_5TEJ__");
954 Define(Defs, "__THUMB_INTERWORK__");
955 Define(Defs, "__SOFTFP__");
956 } else if (ArmArch == Armv4t) {
957 Define(Defs, "__ARM_ARCH_4T__");
958 Define(Defs, "__SOFTFP__");
959 } else if (ArmArch == XScale) {
960 Define(Defs, "__ARM_ARCH_5TE__");
961 Define(Defs, "__XSCALE__");
962 Define(Defs, "__SOFTFP__");
963 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000964 Define(Defs, "__ARMEL__");
Chris Lattner393ff042008-04-21 18:56:49 +0000965 }
966 virtual void getTargetBuiltins(const Builtin::Info *&Records,
967 unsigned &NumRecords) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000968 // FIXME: Implement.
969 Records = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000970 NumRecords = 0;
971 }
972 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000973 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +0000974 }
975 virtual const char *getTargetPrefix() const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000976 return "arm";
Chris Lattner393ff042008-04-21 18:56:49 +0000977 }
Chris Lattner393ff042008-04-21 18:56:49 +0000978 virtual void getGCCRegNames(const char * const *&Names,
979 unsigned &NumNames) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000980 // FIXME: Implement.
981 Names = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000982 NumNames = 0;
983 }
984 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
985 unsigned &NumAliases) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000986 // FIXME: Implement.
987 Aliases = 0;
Chris Lattner393ff042008-04-21 18:56:49 +0000988 NumAliases = 0;
989 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000990 virtual bool validateAsmConstraint(const char *&Name,
Nate Begemanad487f42008-04-22 05:03:19 +0000991 TargetInfo::ConstraintInfo &info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +0000992 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000993 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +0000994 default:
Nate Begemanad487f42008-04-22 05:03:19 +0000995 case 'l': // r0-r7
996 case 'h': // r8-r15
997 case 'w': // VFP Floating point register single precision
998 case 'P': // VFP Floating point register double precision
999 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
1000 return true;
1001 }
Chris Lattner393ff042008-04-21 18:56:49 +00001002 return false;
1003 }
1004 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001005 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001006 return "";
1007 }
1008};
1009} // end anonymous namespace.
1010
Eli Friedmana9f54962008-08-20 07:44:10 +00001011
1012namespace {
1013class DarwinARMTargetInfo : public ARMTargetInfo {
1014public:
1015 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1016
Chris Lattner33328642009-03-20 15:52:06 +00001017 virtual void getTargetDefines(const LangOptions &Opts,
1018 std::vector<char> &Defines) const {
1019 ARMTargetInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +00001020 getDarwinDefines(Defines, Opts);
1021 getDarwinIPhoneOSDefines(Defines, getTargetTriple());
Eli Friedmana9f54962008-08-20 07:44:10 +00001022 }
1023};
1024} // end anonymous namespace.
1025
Reid Spencer5f016e22007-07-11 17:01:13 +00001026namespace {
Daniel Dunbar1e0107a2009-03-23 16:09:04 +00001027// arm FreeBSD target
1028class FreeBSDARMTargetInfo : public ARMTargetInfo {
1029public:
1030 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
1031 virtual void getTargetDefines(const LangOptions &Opts,
1032 std::vector<char> &Defines) const {
1033 ARMTargetInfo::getTargetDefines(Opts, Defines);
1034 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
1035 }
1036};
1037} // end anonymous namespace
1038
1039namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00001040class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00001041 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1042 static const char * const GCCRegNames[];
Gabor Greif26658672008-02-21 16:29:08 +00001043public:
Eli Friedman01b86682008-08-20 07:28:14 +00001044 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1045 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00001046 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1047 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedman01b86682008-08-20 07:28:14 +00001048 }
Chris Lattner33328642009-03-20 15:52:06 +00001049 virtual void getTargetDefines(const LangOptions &Opts,
1050 std::vector<char> &Defines) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001051 // FIXME: This is missing a lot of important defines; some of the
1052 // missing stuff is likely to break system headers.
Gabor Greif26658672008-02-21 16:29:08 +00001053 Define(Defines, "__sparc");
Eli Friedmanbf0c9bd2008-05-25 05:26:09 +00001054 Define(Defines, "__sparc__");
Gabor Greif26658672008-02-21 16:29:08 +00001055 Define(Defines, "__sparcv8");
1056 }
1057 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1058 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001059 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00001060 }
1061 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001062 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00001063 }
1064 virtual const char *getTargetPrefix() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001065 return "sparc";
Gabor Greif26658672008-02-21 16:29:08 +00001066 }
1067 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00001068 unsigned &NumNames) const;
Gabor Greif26658672008-02-21 16:29:08 +00001069 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00001070 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001071 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00001072 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001073 // FIXME: Implement!
1074 return false;
Gabor Greif26658672008-02-21 16:29:08 +00001075 }
1076 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001077 // FIXME: Implement!
1078 return "";
Gabor Greif26658672008-02-21 16:29:08 +00001079 }
1080};
1081
Chris Lattnere957f532009-01-27 01:58:38 +00001082const char * const SparcV8TargetInfo::GCCRegNames[] = {
1083 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1084 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1085 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1086 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1087};
1088
1089void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
1090 unsigned &NumNames) const {
1091 Names = GCCRegNames;
1092 NumNames = llvm::array_lengthof(GCCRegNames);
1093}
1094
1095const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
1096 { { "g0" }, "r0" },
1097 { { "g1" }, "r1" },
1098 { { "g2" }, "r2" },
1099 { { "g3" }, "r3" },
1100 { { "g4" }, "r4" },
1101 { { "g5" }, "r5" },
1102 { { "g6" }, "r6" },
1103 { { "g7" }, "r7" },
1104 { { "o0" }, "r8" },
1105 { { "o1" }, "r9" },
1106 { { "o2" }, "r10" },
1107 { { "o3" }, "r11" },
1108 { { "o4" }, "r12" },
1109 { { "o5" }, "r13" },
1110 { { "o6", "sp" }, "r14" },
1111 { { "o7" }, "r15" },
1112 { { "l0" }, "r16" },
1113 { { "l1" }, "r17" },
1114 { { "l2" }, "r18" },
1115 { { "l3" }, "r19" },
1116 { { "l4" }, "r20" },
1117 { { "l5" }, "r21" },
1118 { { "l6" }, "r22" },
1119 { { "l7" }, "r23" },
1120 { { "i0" }, "r24" },
1121 { { "i1" }, "r25" },
1122 { { "i2" }, "r26" },
1123 { { "i3" }, "r27" },
1124 { { "i4" }, "r28" },
1125 { { "i5" }, "r29" },
1126 { { "i6", "fp" }, "r30" },
1127 { { "i7" }, "r31" },
1128};
1129
1130void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1131 unsigned &NumAliases) const {
1132 Aliases = GCCRegAliases;
1133 NumAliases = llvm::array_lengthof(GCCRegAliases);
1134}
Gabor Greif26658672008-02-21 16:29:08 +00001135} // end anonymous namespace.
1136
Eli Friedman01b86682008-08-20 07:28:14 +00001137namespace {
1138class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1139public:
1140 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedmanf509d732008-11-02 02:43:55 +00001141 SparcV8TargetInfo(triple) {
1142 SizeType = UnsignedInt;
1143 PtrDiffType = SignedInt;
1144 }
Eli Friedman01b86682008-08-20 07:28:14 +00001145
Chris Lattner33328642009-03-20 15:52:06 +00001146 virtual void getTargetDefines(const LangOptions &Opts,
1147 std::vector<char> &Defines) const {
1148 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedman01b86682008-08-20 07:28:14 +00001149 getSolarisDefines(Defines);
1150 }
1151};
1152} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001153
Chris Lattner2621fd12008-05-08 05:58:21 +00001154namespace {
1155 class PIC16TargetInfo : public TargetInfo{
1156 public:
1157 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +00001158 IntWidth = 16;
1159 LongWidth = LongLongWidth = 32;
1160 PointerWidth = 16;
1161 IntAlign = 8;
1162 LongAlign = LongLongAlign = 8;
Eli Friedman61538a72008-05-20 14:21:01 +00001163 PointerAlign = 8;
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +00001164 SizeType = UnsignedInt;
1165 IntMaxType = SignedLong;
1166 UIntMaxType = UnsignedLong;
Chris Lattner6ad474f2009-02-13 22:28:55 +00001167 IntPtrType = SignedShort;
Eli Friedmanf509d732008-11-02 02:43:55 +00001168 PtrDiffType = SignedInt;
Sanjiv Gupta364af812008-08-18 10:05:22 +00001169 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner2621fd12008-05-08 05:58:21 +00001170 }
Chris Lattner927686f2008-05-09 06:08:39 +00001171 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1172 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner33328642009-03-20 15:52:06 +00001173 virtual void getTargetDefines(const LangOptions &Opts,
1174 std::vector<char> &Defines) const {
Chris Lattner2621fd12008-05-08 05:58:21 +00001175 Define(Defines, "__pic16");
1176 }
1177 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1178 unsigned &NumRecords) const {}
1179 virtual const char *getVAListDeclaration() const { return "";}
1180 virtual const char *getClobbers() const {return "";}
1181 virtual const char *getTargetPrefix() const {return "";}
1182 virtual void getGCCRegNames(const char * const *&Names,
1183 unsigned &NumNames) const {}
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001184 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner2621fd12008-05-08 05:58:21 +00001185 TargetInfo::ConstraintInfo &info) const {
1186 return true;
1187 }
1188 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1189 unsigned &NumAliases) const {}
1190 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1191 };
1192}
1193
Reid Spencer5f016e22007-07-11 17:01:13 +00001194//===----------------------------------------------------------------------===//
1195// Driver code
1196//===----------------------------------------------------------------------===//
1197
Ted Kremenek8448d382007-12-04 17:07:35 +00001198static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +00001199 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1200 TT[4] == '-' && TT[1] - '3' < 6);
1201}
1202
Chris Lattner42e67372008-03-05 01:18:20 +00001203/// CreateTargetInfo - Return the target info object for the specified target
1204/// triple.
1205TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001206 // OS detection; this isn't really anywhere near complete.
1207 // Additions and corrections are welcome.
1208 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnereac7aee2008-08-23 18:23:14 +00001209 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001210 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001211 bool isSolaris = T.find("-solaris") != std::string::npos;
1212 bool isLinux = T.find("-linux") != std::string::npos;
1213 bool isWindows = T.find("-windows") != std::string::npos ||
1214 T.find("-win32") != std::string::npos ||
1215 T.find("-mingw") != std::string::npos;
Eli Friedman61538a72008-05-20 14:21:01 +00001216
Eli Friedmaned855cb2008-08-21 00:13:15 +00001217 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1218 if (isDarwin)
1219 return new DarwinPPCTargetInfo(T);
1220 return new PPC32TargetInfo(T);
1221 }
Eli Friedman61538a72008-05-20 14:21:01 +00001222
Eli Friedmaned855cb2008-08-21 00:13:15 +00001223 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1224 if (isDarwin)
1225 return new DarwinPPC64TargetInfo(T);
1226 return new PPC64TargetInfo(T);
1227 }
Chris Lattner393ff042008-04-21 18:56:49 +00001228
Mike Stump437bb4b2009-04-08 02:07:04 +00001229 if (T.find("armv6-") == 0 || T.find("arm-") == 0
1230 || T.find("armv4t") == 0 || T.find("armv5-") == 0
1231 || T.find("xscale") == 0) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001232 if (isDarwin)
1233 return new DarwinARMTargetInfo(T);
Daniel Dunbar1e0107a2009-03-23 16:09:04 +00001234 if (isFreeBSD)
1235 return new FreeBSDARMTargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001236 return new ARMTargetInfo(T);
1237 }
Eli Friedman61538a72008-05-20 14:21:01 +00001238
Eli Friedmaned855cb2008-08-21 00:13:15 +00001239 if (T.find("sparc-") == 0) {
1240 if (isSolaris)
1241 return new SolarisSparcV8TargetInfo(T);
1242 return new SparcV8TargetInfo(T);
1243 }
1244
Chris Lattner54fefbe2009-02-20 17:04:14 +00001245 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001246 if (isDarwin)
1247 return new DarwinX86_64TargetInfo(T);
Daniel Dunbarb55a42b2008-09-23 17:37:57 +00001248 if (isLinux)
1249 return new LinuxX86_64TargetInfo(T);
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001250 if (isFreeBSD)
1251 return new FreeBSDX86_64TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001252 return new X86_64TargetInfo(T);
1253 }
Eli Friedman61538a72008-05-20 14:21:01 +00001254
Chris Lattner2621fd12008-05-08 05:58:21 +00001255 if (T.find("pic16-") == 0)
1256 return new PIC16TargetInfo(T);
1257
Eli Friedmaned855cb2008-08-21 00:13:15 +00001258 if (IsX86(T)) {
1259 if (isDarwin)
1260 return new DarwinI386TargetInfo(T);
Eli Friedman0d4047b2008-08-21 00:24:02 +00001261 if (isLinux)
1262 return new LinuxX86_32TargetInfo(T);
Chris Lattnereac7aee2008-08-23 18:23:14 +00001263 if (isDragonFly)
1264 return new DragonFlyX86_32TargetInfo(T);
Chris Lattnerfd0269d2008-10-16 17:04:31 +00001265 if (isFreeBSD)
1266 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman29a30502008-08-21 01:40:19 +00001267 if (isWindows)
1268 return new WindowsX86_32TargetInfo(T);
Eli Friedmaned855cb2008-08-21 00:13:15 +00001269 return new X86_32TargetInfo(T);
1270 }
Eli Friedman61538a72008-05-20 14:21:01 +00001271
Chris Lattner42e67372008-03-05 01:18:20 +00001272 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +00001273}
Ted Kremenekfb79f7c2008-03-04 17:47:18 +00001274