blob: 8ffeb61132273542e61381bd45e728e933869640 [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
112/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
113/// not defined, return 0's. Return true if we have -darwin in the string or
114/// false otherwise.
115static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
116 Maj = Min = 0;
117 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') {
129 Maj = 10+Darwin[0]-'0';
130 ++Darwin;
131 }
132
133 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
134 if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
135 Darwin[2] == '\0')
136 Min = Darwin[1]-'0';
137
138 return true;
139}
140
Chris Lattner33854aa2009-04-07 04:48:21 +0000141static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts,
142 const char *Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +0000143 Define(Defs, "__APPLE__");
144 Define(Defs, "__MACH__");
Chris Lattner8405e092009-02-05 07:19:24 +0000145 Define(Defs, "OBJC_NEW_PROPERTIES");
146
Chris Lattner8181e622009-04-07 16:50:40 +0000147 // __weak is always defined, for use in blocks and with objc pointers.
148 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
149
150 // Darwin defines __strong even in C mode (just to nothing).
151 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Chris Lattner33854aa2009-04-07 04:48:21 +0000152 Define(Defs, "__strong", "");
Chris Lattner8181e622009-04-07 16:50:40 +0000153 else
Chris Lattner33854aa2009-04-07 04:48:21 +0000154 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Chris Lattner33854aa2009-04-07 04:48:21 +0000155
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000156 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000157 unsigned Maj, Min;
158 if (getDarwinNumber(Triple, Maj, Min)) {
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000159 char DarwinStr[] = "1000";
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000160 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
161 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
162 DarwinStr[2] = '0' + Maj-4;
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000163 }
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000164
165 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
166 DarwinStr[3] = Min+'0';
Chris Lattnerd376f6d2008-09-30 20:30:12 +0000167 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000168 }
Eli Friedman872996c2008-08-20 02:34:37 +0000169}
Chris Lattner4b009652007-07-25 00:24:17 +0000170
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000171/// GetDarwinLanguageOptions - Set the default language options for darwin.
172static void GetDarwinLanguageOptions(LangOptions &Opts,
173 const char *Triple) {
174 Opts.NeXTRuntime = true;
175
176 unsigned Maj, Min;
177 if (!getDarwinNumber(Triple, Maj, Min))
178 return;
179
180 // Blocks default to on for 10.6 (darwin10) and beyond.
Fariborz Jahaniand09b9f72009-02-12 17:54:33 +0000181 // As does nonfragile-abi for 64bit mode
Fariborz Jahanian27f58962009-02-24 23:34:44 +0000182 if (Maj > 9)
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000183 Opts.Blocks = 1;
Fariborz Jahanian27f58962009-02-24 23:34:44 +0000184
Fariborz Jahanian72efecb2009-02-24 23:38:42 +0000185 if (Maj >= 9 && Opts.ObjC1 && !strncmp(Triple, "x86_64", 6))
186 Opts.ObjCNonFragileABI = 1;
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000187}
188
189
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000190//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000191// Specific target implementations.
192//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000193
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000194namespace {
195// PPC abstract base class
196class PPCTargetInfo : public TargetInfo {
197 static const Builtin::Info BuiltinInfo[];
198 static const char * const GCCRegNames[];
199 static const TargetInfo::GCCRegAlias GCCRegAliases[];
200
201public:
202 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
203 CharIsSigned = false;
204 }
205 virtual void getTargetBuiltins(const Builtin::Info *&Records,
206 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000207 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000208 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000209 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000210
Chris Lattner79682402009-03-20 15:52:06 +0000211 virtual void getTargetDefines(const LangOptions &Opts,
212 std::vector<char> &Defines) const;
Chris Lattnerbef1d722009-03-02 22:27:17 +0000213
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000214 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-10-27 01:11:29 +0000215 return "typedef char* __builtin_va_list;";
216 // This is the right definition for ABI/V4: System V.4/eabi.
217 /*return "typedef struct __va_list_tag {"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000218 " unsigned char gpr;"
219 " unsigned char fpr;"
220 " unsigned short reserved;"
221 " void* overflow_arg_area;"
222 " void* reg_save_area;"
Chris Lattnera07708f2008-10-27 01:11:29 +0000223 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000224 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000225 virtual const char *getTargetPrefix() const {
226 return "ppc";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000227 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000228 virtual void getGCCRegNames(const char * const *&Names,
229 unsigned &NumNames) const;
230 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
231 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +0000232 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000233 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000234 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000235 default: return false;
236 case 'O': // Zero
237 return true;
238 case 'b': // Base register
239 case 'f': // Floating point register
240 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
241 return true;
242 }
243 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000244 virtual const char *getClobbers() const {
245 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000246 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000247};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000248
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000249const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-02-16 21:58:21 +0000250#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
251#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000252#include "clang/AST/PPCBuiltins.def"
253};
Chris Lattnerbef1d722009-03-02 22:27:17 +0000254
255
256/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
257/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000258void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
259 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000260 // Target identification.
261 Define(Defs, "__ppc__");
262 Define(Defs, "_ARCH_PPC");
263 Define(Defs, "__POWERPC__");
264 if (PointerWidth == 64) {
265 Define(Defs, "_ARCH_PPC64");
266 Define(Defs, "_LP64");
267 Define(Defs, "__LP64__");
268 Define(Defs, "__ppc64__");
269 } else {
270 Define(Defs, "__ppc__");
271 }
272
273 // Target properties.
274 Define(Defs, "_BIG_ENDIAN");
275 Define(Defs, "__BIG_ENDIAN__");
276
277 // Subtarget options.
278 Define(Defs, "__NATURAL_ALIGNMENT__");
279 Define(Defs, "__REGISTER_PREFIX__", "");
280
281 // FIXME: Should be controlled by command line option.
282 Define(Defs, "__LONG_DOUBLE_128__");
283}
284
Chris Lattner9fd73612008-04-21 18:56:49 +0000285
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000286const char * const PPCTargetInfo::GCCRegNames[] = {
287 "0", "1", "2", "3", "4", "5", "6", "7",
288 "8", "9", "10", "11", "12", "13", "14", "15",
289 "16", "17", "18", "19", "20", "21", "22", "23",
290 "24", "25", "26", "27", "28", "29", "30", "31",
291 "0", "1", "2", "3", "4", "5", "6", "7",
292 "8", "9", "10", "11", "12", "13", "14", "15",
293 "16", "17", "18", "19", "20", "21", "22", "23",
294 "24", "25", "26", "27", "28", "29", "30", "31",
295 "mq", "lr", "ctr", "ap",
296 "0", "1", "2", "3", "4", "5", "6", "7",
297 "xer",
298 "0", "1", "2", "3", "4", "5", "6", "7",
299 "8", "9", "10", "11", "12", "13", "14", "15",
300 "16", "17", "18", "19", "20", "21", "22", "23",
301 "24", "25", "26", "27", "28", "29", "30", "31",
302 "vrsave", "vscr",
303 "spe_acc", "spefscr",
304 "sfp"
305};
Chris Lattner4b009652007-07-25 00:24:17 +0000306
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000307void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
308 unsigned &NumNames) const {
309 Names = GCCRegNames;
310 NumNames = llvm::array_lengthof(GCCRegNames);
311}
Chris Lattner4b009652007-07-25 00:24:17 +0000312
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000313const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
314 // While some of these aliases do map to different registers
315 // they still share the same register name.
316 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
317 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
318 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
319 { { "cr3", "fr3", "r3", "v3"}, "3" },
320 { { "cr4", "fr4", "r4", "v4"}, "4" },
321 { { "cr5", "fr5", "r5", "v5"}, "5" },
322 { { "cr6", "fr6", "r6", "v6"}, "6" },
323 { { "cr7", "fr7", "r7", "v7"}, "7" },
324 { { "fr8", "r8", "v8"}, "8" },
325 { { "fr9", "r9", "v9"}, "9" },
326 { { "fr10", "r10", "v10"}, "10" },
327 { { "fr11", "r11", "v11"}, "11" },
328 { { "fr12", "r12", "v12"}, "12" },
329 { { "fr13", "r13", "v13"}, "13" },
330 { { "fr14", "r14", "v14"}, "14" },
331 { { "fr15", "r15", "v15"}, "15" },
332 { { "fr16", "r16", "v16"}, "16" },
333 { { "fr17", "r17", "v17"}, "17" },
334 { { "fr18", "r18", "v18"}, "18" },
335 { { "fr19", "r19", "v19"}, "19" },
336 { { "fr20", "r20", "v20"}, "20" },
337 { { "fr21", "r21", "v21"}, "21" },
338 { { "fr22", "r22", "v22"}, "22" },
339 { { "fr23", "r23", "v23"}, "23" },
340 { { "fr24", "r24", "v24"}, "24" },
341 { { "fr25", "r25", "v25"}, "25" },
342 { { "fr26", "r26", "v26"}, "26" },
343 { { "fr27", "r27", "v27"}, "27" },
344 { { "fr28", "r28", "v28"}, "28" },
345 { { "fr29", "r29", "v29"}, "29" },
346 { { "fr30", "r30", "v30"}, "30" },
347 { { "fr31", "r31", "v31"}, "31" },
348};
349
350void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
351 unsigned &NumAliases) const {
352 Aliases = GCCRegAliases;
353 NumAliases = llvm::array_lengthof(GCCRegAliases);
354}
355} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000356
357namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000358class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000359public:
Eli Friedman2b161652008-08-21 00:13:15 +0000360 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
361 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
362 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
363 }
Chris Lattner4b009652007-07-25 00:24:17 +0000364};
365} // end anonymous namespace.
366
367namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000368class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000369public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000370 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000371 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2b161652008-08-21 00:13:15 +0000372 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
373 "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
Chris Lattnere5fde952008-05-09 06:17:04 +0000374 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000375};
376} // end anonymous namespace.
377
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000378
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000379namespace {
380class DarwinPPCTargetInfo : public PPC32TargetInfo {
381public:
382 DarwinPPCTargetInfo(const std::string& triple) : PPC32TargetInfo(triple) {}
Chris Lattner79682402009-03-20 15:52:06 +0000383 virtual void getTargetDefines(const LangOptions &Opts,
384 std::vector<char> &Defines) const {
385 PPC32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner33854aa2009-04-07 04:48:21 +0000386 getDarwinDefines(Defines, Opts, getTargetTriple());
Chris Lattner4b009652007-07-25 00:24:17 +0000387 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000388
Chris Lattnerddae7102008-12-04 22:54:33 +0000389 /// getDefaultLangOptions - Allow the target to specify default settings for
390 /// various language options. These may be overridden by command line
391 /// options.
392 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000393 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000394 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000395};
396} // end anonymous namespace.
397
398namespace {
399class DarwinPPC64TargetInfo : public PPC64TargetInfo {
400public:
401 DarwinPPC64TargetInfo(const std::string& triple) : PPC64TargetInfo(triple) {}
Chris Lattner79682402009-03-20 15:52:06 +0000402 virtual void getTargetDefines(const LangOptions &Opts,
403 std::vector<char> &Defines) const {
404 PPC64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner33854aa2009-04-07 04:48:21 +0000405 getDarwinDefines(Defines, Opts, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000406 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000407
Chris Lattnerddae7102008-12-04 22:54:33 +0000408 /// getDefaultLangOptions - Allow the target to specify default settings for
409 /// various language options. These may be overridden by command line
410 /// options.
411 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000412 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000413 }
Chris Lattner4b009652007-07-25 00:24:17 +0000414};
415} // end anonymous namespace.
416
417namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000418// Namespace for x86 abstract base class
419const Builtin::Info BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-02-16 21:58:21 +0000420#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
421#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Eli Friedman872996c2008-08-20 02:34:37 +0000422#include "clang/AST/X86Builtins.def"
423};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000424
Eli Friedman872996c2008-08-20 02:34:37 +0000425const char *GCCRegNames[] = {
426 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
427 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
428 "argp", "flags", "fspr", "dirflag", "frame",
429 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
430 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
431 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
432 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
433};
434
435const TargetInfo::GCCRegAlias GCCRegAliases[] = {
436 { { "al", "ah", "eax", "rax" }, "ax" },
437 { { "bl", "bh", "ebx", "rbx" }, "bx" },
438 { { "cl", "ch", "ecx", "rcx" }, "cx" },
439 { { "dl", "dh", "edx", "rdx" }, "dx" },
440 { { "esi", "rsi" }, "si" },
441 { { "edi", "rdi" }, "di" },
442 { { "esp", "rsp" }, "sp" },
443 { { "ebp", "rbp" }, "bp" },
444};
445
446// X86 target abstract base class; x86-32 and x86-64 are very close, so
447// most of the implementation can be shared.
448class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +0000449 enum X86SSEEnum {
450 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
451 } SSELevel;
Eli Friedman872996c2008-08-20 02:34:37 +0000452public:
Chris Lattner715fe4c2009-03-02 22:40:39 +0000453 X86TargetInfo(const std::string& triple)
Chris Lattnerf6790a82009-03-03 19:56:18 +0000454 : TargetInfo(triple),
455 // FIXME: hard coding to SSE2 for now. This should change to NoMMXSSE so
456 // that the driver controls this.
457 SSELevel(SSE2) {
Eli Friedman872996c2008-08-20 02:34:37 +0000458 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000459 }
460 virtual void getTargetBuiltins(const Builtin::Info *&Records,
461 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000462 Records = BuiltinInfo;
463 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000464 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000465 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000466 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000467 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000468 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000469 unsigned &NumNames) const {
470 Names = GCCRegNames;
471 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000472 }
473 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
474 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000475 Aliases = GCCRegAliases;
476 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000477 }
Anders Carlsson36834a72009-02-28 17:11:49 +0000478 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +0000479 TargetInfo::ConstraintInfo &info) const;
480 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000481 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000482 return "~{dirflag},~{fpsr},~{flags}";
483 }
Chris Lattner79682402009-03-20 15:52:06 +0000484 virtual void getTargetDefines(const LangOptions &Opts,
485 std::vector<char> &Defines) const;
Chris Lattner7d6220c2009-03-02 22:20:04 +0000486
Chris Lattnerf6790a82009-03-03 19:56:18 +0000487 virtual int HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
488 std::string &ErrorReason);
Chris Lattner4b009652007-07-25 00:24:17 +0000489};
Chris Lattner7d6220c2009-03-02 22:20:04 +0000490
491/// HandleTargetOptions - Handle target-specific options like -msse2 and
492/// friends. An array of arguments is passed in: if they are all valid, this
493/// should handle them and return -1. If there is an error, the index of the
494/// invalid argument should be returned along with an optional error string.
Chris Lattnerf6790a82009-03-03 19:56:18 +0000495int X86TargetInfo::HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
496 std::string &ErrorReason) {
497 for (unsigned i = 0; i != NumStrs; ++i) {
498 const std::string &Feature = StrArray[i];
499 if (Feature.size() < 2) return i;
500 // Ignore explicitly disabled features.
501 if (Feature[0] == '-') continue;
502
503 // Feature strings are of the form "+feature".
504 if (Feature[0] != '+') return i;
505
506 // The set of supported subtarget features is defined in
507 // lib/Target/X86/X86.td. Here we recognize and map onto our internal
508 // state.
509 if (Feature == "+mmx")
510 SSELevel = std::max(SSELevel, MMX);
511 else if (Feature == "+sse")
512 SSELevel = std::max(SSELevel, SSE1);
513 else if (Feature == "+sse2")
514 SSELevel = std::max(SSELevel, SSE2);
515 else if (Feature == "+sse3")
516 SSELevel = std::max(SSELevel, SSE3);
517 else if (Feature == "+ssse3")
518 SSELevel = std::max(SSELevel, SSSE3);
519 else if (Feature == "+sse41")
520 SSELevel = std::max(SSELevel, SSE41);
521 else if (Feature == "+sse42")
522 SSELevel = std::max(SSELevel, SSE42);
523 else if (Feature == "+64bit" || Feature == "+slow-bt-mem")
524 // Ignore these features.
525 continue;
526 else
527 return i;
528 }
529 return -1;
Chris Lattner7d6220c2009-03-02 22:20:04 +0000530}
Chris Lattnerbef1d722009-03-02 22:27:17 +0000531
532/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
533/// that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000534void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
535 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000536 // Target identification.
537 if (PointerWidth == 64) {
538 Define(Defs, "_LP64");
539 Define(Defs, "__LP64__");
540 Define(Defs, "__amd64__");
541 Define(Defs, "__amd64");
542 Define(Defs, "__x86_64");
543 Define(Defs, "__x86_64__");
544 Define(Defs, "__SSE3__");
545 } else {
Chris Lattnerc345a802009-03-20 16:06:38 +0000546 DefineStd(Defs, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +0000547 }
548
549 // Target properties.
550 Define(Defs, "__LITTLE_ENDIAN__");
551
552 // Subtarget options.
553 Define(Defs, "__nocona");
554 Define(Defs, "__nocona__");
555 Define(Defs, "__tune_nocona__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000556 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +0000557
558 // Each case falls through to the previous one here.
559 switch (SSELevel) {
560 case SSE42:
561 Define(Defs, "__SSE4_2__");
562 case SSE41:
563 Define(Defs, "__SSE4_1__");
564 case SSSE3:
565 Define(Defs, "__SSSE3__");
566 case SSE3:
567 Define(Defs, "__SSE3__");
568 case SSE2:
569 Define(Defs, "__SSE2__");
570 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
571 case SSE1:
572 Define(Defs, "__SSE__");
573 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
574 case MMX:
575 Define(Defs, "__MMX__");
576 case NoMMXSSE:
577 break;
578 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000579}
580
Eli Friedman872996c2008-08-20 02:34:37 +0000581
582bool
Anders Carlsson36834a72009-02-28 17:11:49 +0000583X86TargetInfo::validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +0000584 TargetInfo::ConstraintInfo &info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000585 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +0000586 default: return false;
587 case 'a': // eax.
588 case 'b': // ebx.
589 case 'c': // ecx.
590 case 'd': // edx.
591 case 'S': // esi.
592 case 'D': // edi.
593 case 'A': // edx:eax.
594 case 't': // top of floating point stack.
595 case 'u': // second from top of floating point stack.
596 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +0000597 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000598 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000599 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anders Carlssonff235da2009-01-24 18:03:09 +0000600 case 'e': // 32-bit signed integer constant for use with zero-extending
601 // x86_64 instructions.
602 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
603 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000604 case 'N': // unsigned 8-bit integer constant for use with in and out
605 // instructions.
606 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
607 return true;
608 }
609}
610
611std::string
612X86TargetInfo::convertConstraint(const char Constraint) const {
613 switch (Constraint) {
614 case 'a': return std::string("{ax}");
615 case 'b': return std::string("{bx}");
616 case 'c': return std::string("{cx}");
617 case 'd': return std::string("{dx}");
618 case 'S': return std::string("{si}");
619 case 'D': return std::string("{di}");
620 case 't': // top of floating point stack.
621 return std::string("{st}");
622 case 'u': // second from top of floating point stack.
623 return std::string("{st(1)}"); // second from top of floating point stack.
624 default:
625 return std::string(1, Constraint);
626 }
627}
Eli Friedman872996c2008-08-20 02:34:37 +0000628} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000629
630namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000631// X86-32 generic target
632class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000633public:
Eli Friedman872996c2008-08-20 02:34:37 +0000634 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
635 DoubleAlign = LongLongAlign = 32;
636 LongDoubleWidth = 96;
637 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +0000638 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
639 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
640 "a0:0:64-f80:32:32";
Eli Friedman04ede302009-03-29 20:31:09 +0000641 SizeType = UnsignedInt;
642 PtrDiffType = SignedInt;
643 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000644 RegParmMax = 3;
Eli Friedman872996c2008-08-20 02:34:37 +0000645 }
646 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000647 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000648 }
Eli Friedman872996c2008-08-20 02:34:37 +0000649};
650} // end anonymous namespace
651
652namespace {
653// x86-32 Darwin (OS X) target
654class DarwinI386TargetInfo : public X86_32TargetInfo {
655public:
656 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
657 LongDoubleWidth = 128;
658 LongDoubleAlign = 128;
Eli Friedman04ede302009-03-29 20:31:09 +0000659 SizeType = UnsignedLong;
660 IntPtrType = SignedLong;
Eli Friedman2b161652008-08-21 00:13:15 +0000661 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
662 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
663 "a0:0:64-f80:128:128";
Eli Friedman872996c2008-08-20 02:34:37 +0000664 }
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000665
666 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
667 return IsConstant ? "\01LC" : "\01lC";
668 }
669
Daniel Dunbar6a916482009-04-03 00:57:44 +0000670 virtual const char *getUnicodeStringSymbolPrefix() const {
671 return "__utf16_string_";
672 }
673
674 virtual const char *getUnicodeStringSection() const {
675 return "__TEXT,__ustring";
676 }
677
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000678 virtual const char *getCFStringSymbolPrefix() const {
679 return "\01LC";
680 }
681
Chris Lattner79682402009-03-20 15:52:06 +0000682 virtual void getTargetDefines(const LangOptions &Opts,
683 std::vector<char> &Defines) const {
684 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner33854aa2009-04-07 04:48:21 +0000685 getDarwinDefines(Defines, Opts, getTargetTriple());
Eli Friedman872996c2008-08-20 02:34:37 +0000686 }
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000687
Chris Lattnerddae7102008-12-04 22:54:33 +0000688 /// getDefaultLangOptions - Allow the target to specify default settings for
689 /// various language options. These may be overridden by command line
690 /// options.
691 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000692 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000693 }
Eli Friedman872996c2008-08-20 02:34:37 +0000694};
695} // end anonymous namespace
696
697namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000698// x86-32 FreeBSD target
699class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
700public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000701 FreeBSDX86_32TargetInfo(const std::string& triple) :
Eli Friedman04ede302009-03-29 20:31:09 +0000702 X86_32TargetInfo(triple) { }
Chris Lattner79682402009-03-20 15:52:06 +0000703 virtual void getTargetDefines(const LangOptions &Opts,
704 std::vector<char> &Defines) const {
705 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000706 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000707 }
708};
709} // end anonymous namespace
710
711namespace {
Chris Lattnerd4faca42008-08-23 18:23:14 +0000712// x86-32 DragonFly target
713class DragonFlyX86_32TargetInfo : public X86_32TargetInfo {
714public:
Eli Friedman7cca0982008-11-02 02:43:55 +0000715 DragonFlyX86_32TargetInfo(const std::string& triple) :
Eli Friedman04ede302009-03-29 20:31:09 +0000716 X86_32TargetInfo(triple) { }
Chris Lattner79682402009-03-20 15:52:06 +0000717 virtual void getTargetDefines(const LangOptions &Opts,
718 std::vector<char> &Defines) const {
719 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000720 getDragonFlyDefines(Opts, Defines);
Chris Lattnerd4faca42008-08-23 18:23:14 +0000721 }
722};
723} // end anonymous namespace
724
725namespace {
Eli Friedman5fb0a022008-08-21 00:24:02 +0000726// x86-32 Linux target
727class LinuxX86_32TargetInfo : public X86_32TargetInfo {
728public:
729 LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000730 UserLabelPrefix = "";
Eli Friedman5fb0a022008-08-21 00:24:02 +0000731 }
Chris Lattner79682402009-03-20 15:52:06 +0000732 virtual void getTargetDefines(const LangOptions &Opts,
733 std::vector<char> &Defines) const {
734 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000735 getLinuxDefines(Opts, Defines);
Eli Friedman5fb0a022008-08-21 00:24:02 +0000736 }
737};
738} // end anonymous namespace
739
740namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +0000741// x86-32 Windows target
742class WindowsX86_32TargetInfo : public X86_32TargetInfo {
743public:
744 WindowsX86_32TargetInfo(const std::string& triple)
745 : X86_32TargetInfo(triple) {
746 // FIXME: Fix wchar_t.
747 // FIXME: We should probably enable -fms-extensions by default for
748 // this target.
749 }
Chris Lattner79682402009-03-20 15:52:06 +0000750 virtual void getTargetDefines(const LangOptions &Opts,
751 std::vector<char> &Defines) const {
752 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedman23cb7912008-08-21 01:40:19 +0000753 // This list is based off of the the list of things MingW defines
Eli Friedman23cb7912008-08-21 01:40:19 +0000754 Define(Defines, "_WIN32");
Chris Lattnerc345a802009-03-20 16:06:38 +0000755 DefineStd(Defines, "WIN32", Opts);
756 DefineStd(Defines, "WINNT", Opts);
Eli Friedman23cb7912008-08-21 01:40:19 +0000757 Define(Defines, "_X86_");
758 Define(Defines, "__MSVCRT__");
759 }
760};
761} // end anonymous namespace
762
763namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000764// x86-64 generic target
765class X86_64TargetInfo : public X86TargetInfo {
766public:
Chris Lattner79682402009-03-20 15:52:06 +0000767 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000768 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Chris Lattner4dfc45a2009-01-28 06:58:19 +0000769 DoubleAlign = LongLongAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000770 LongDoubleWidth = 128;
771 LongDoubleAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000772 IntMaxType = SignedLong;
773 UIntMaxType = UnsignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000774 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +0000775
Eli Friedman2b161652008-08-21 00:13:15 +0000776 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
777 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
778 "a0:0:64-f80:128:128";
Chris Lattner4b009652007-07-25 00:24:17 +0000779 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000780 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000781 return "typedef struct __va_list_tag {"
782 " unsigned gp_offset;"
783 " unsigned fp_offset;"
784 " void* overflow_arg_area;"
785 " void* reg_save_area;"
786 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000787 }
Eli Friedman872996c2008-08-20 02:34:37 +0000788};
789} // end anonymous namespace
790
791namespace {
Chris Lattner98cb2a22008-10-16 17:04:31 +0000792// x86-64 FreeBSD target
793class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
794public:
Chris Lattner79682402009-03-20 15:52:06 +0000795 FreeBSDX86_64TargetInfo(const std::string &triple)
796 : X86_64TargetInfo(triple) {}
797 virtual void getTargetDefines(const LangOptions &Opts,
798 std::vector<char> &Defines) const {
799 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000800 getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
Chris Lattner98cb2a22008-10-16 17:04:31 +0000801 }
802};
803} // end anonymous namespace
804
805namespace {
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000806// x86-64 Linux target
807class LinuxX86_64TargetInfo : public X86_64TargetInfo {
808public:
809 LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
Chris Lattner5edfe012008-10-05 19:44:25 +0000810 UserLabelPrefix = "";
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000811 }
Chris Lattner79682402009-03-20 15:52:06 +0000812 virtual void getTargetDefines(const LangOptions &Opts,
813 std::vector<char> &Defines) const {
814 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattnerab81f162009-03-20 15:55:34 +0000815 getLinuxDefines(Opts, Defines);
Daniel Dunbare5a80f22008-09-23 17:37:57 +0000816 }
817};
818} // end anonymous namespace
819
820namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000821// x86-64 Darwin (OS X) target
822class DarwinX86_64TargetInfo : public X86_64TargetInfo {
823public:
824 DarwinX86_64TargetInfo(const std::string& triple) :
825 X86_64TargetInfo(triple) {}
826
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000827 virtual const char *getStringSymbolPrefix(bool IsConstant) const {
828 return IsConstant ? "\01LC" : "\01lC";
829 }
830
Daniel Dunbar6a916482009-04-03 00:57:44 +0000831 virtual const char *getUnicodeStringSymbolPrefix() const {
832 return "__utf16_string_";
833 }
834
835 virtual const char *getUnicodeStringSection() const {
836 return "__TEXT,__ustring";
837 }
838
Daniel Dunbarc3a48932009-03-31 23:42:16 +0000839 virtual const char *getCFStringSymbolPrefix() const {
840 return "\01L_unnamed_cfstring_";
841 }
842
Chris Lattner79682402009-03-20 15:52:06 +0000843 virtual void getTargetDefines(const LangOptions &Opts,
844 std::vector<char> &Defines) const {
845 X86_64TargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner33854aa2009-04-07 04:48:21 +0000846 getDarwinDefines(Defines, Opts, getTargetTriple());
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000847 }
Daniel Dunbar34542952008-08-23 08:43:39 +0000848
Chris Lattnerddae7102008-12-04 22:54:33 +0000849 /// getDefaultLangOptions - Allow the target to specify default settings for
850 /// various language options. These may be overridden by command line
851 /// options.
852 virtual void getDefaultLangOptions(LangOptions &Opts) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000853 GetDarwinLanguageOptions(Opts, getTargetTriple());
Chris Lattnerddae7102008-12-04 22:54:33 +0000854 }
Chris Lattner4b009652007-07-25 00:24:17 +0000855};
856} // end anonymous namespace.
857
Chris Lattner9fd73612008-04-21 18:56:49 +0000858namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000859class ARMTargetInfo : public TargetInfo {
Mike Stumpf90a29f2009-04-08 02:07:04 +0000860 enum {
861 Armv4t,
862 Armv5,
863 Armv6,
864 XScale
865 } ArmArch;
Chris Lattner9fd73612008-04-21 18:56:49 +0000866public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000867 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
868 // FIXME: Are the defaults correct for ARM?
Eli Friedman2b161652008-08-21 00:13:15 +0000869 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
870 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
Mike Stumpf90a29f2009-04-08 02:07:04 +0000871 if (triple.find("arm-") || triple.find("armv6-"))
872 ArmArch = Armv6;
873 else if (triple.find("armv5-"))
874 ArmArch = Armv5;
875 else if (triple.find("armv4t-"))
876 ArmArch = Armv4t;
877 else if (triple.find("xscale-"))
878 ArmArch = XScale;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000879 }
Chris Lattner79682402009-03-20 15:52:06 +0000880 virtual void getTargetDefines(const LangOptions &Opts,
881 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000882 // Target identification.
883 Define(Defs, "__arm");
884 Define(Defs, "__arm__");
885
886 // Target properties.
887 Define(Defs, "__LITTLE_ENDIAN__");
888
Mike Stumpf90a29f2009-04-08 02:07:04 +0000889 // Subtarget options.
890 if (ArmArch == Armv6) {
891 Define(Defs, "__ARM_ARCH_6K__");
892 Define(Defs, "__THUMB_INTERWORK__");
893 } else if (ArmArch == Armv5) {
894 Define(Defs, "__ARM_ARCH_5TEJ__");
895 Define(Defs, "__THUMB_INTERWORK__");
896 Define(Defs, "__SOFTFP__");
897 } else if (ArmArch == Armv4t) {
898 Define(Defs, "__ARM_ARCH_4T__");
899 Define(Defs, "__SOFTFP__");
900 } else if (ArmArch == XScale) {
901 Define(Defs, "__ARM_ARCH_5TE__");
902 Define(Defs, "__XSCALE__");
903 Define(Defs, "__SOFTFP__");
904 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000905 Define(Defs, "__ARMEL__");
906 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
Chris Lattner9fd73612008-04-21 18:56:49 +0000907 }
908 virtual void getTargetBuiltins(const Builtin::Info *&Records,
909 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000910 // FIXME: Implement.
911 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000912 NumRecords = 0;
913 }
914 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000915 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000916 }
917 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000918 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000919 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000920 virtual void getGCCRegNames(const char * const *&Names,
921 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000922 // FIXME: Implement.
923 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000924 NumNames = 0;
925 }
926 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
927 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000928 // FIXME: Implement.
929 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000930 NumAliases = 0;
931 }
Anders Carlsson36834a72009-02-28 17:11:49 +0000932 virtual bool validateAsmConstraint(const char *&Name,
Nate Begeman222823a2008-04-22 05:03:19 +0000933 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000934 // FIXME: Check if this is complete
Anders Carlsson36834a72009-02-28 17:11:49 +0000935 switch (*Name) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000936 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000937 case 'l': // r0-r7
938 case 'h': // r8-r15
939 case 'w': // VFP Floating point register single precision
940 case 'P': // VFP Floating point register double precision
941 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
942 return true;
943 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000944 return false;
945 }
946 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000947 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000948 return "";
949 }
950};
951} // end anonymous namespace.
952
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000953
954namespace {
955class DarwinARMTargetInfo : public ARMTargetInfo {
956public:
957 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
958
Chris Lattner79682402009-03-20 15:52:06 +0000959 virtual void getTargetDefines(const LangOptions &Opts,
960 std::vector<char> &Defines) const {
961 ARMTargetInfo::getTargetDefines(Opts, Defines);
Chris Lattner33854aa2009-04-07 04:48:21 +0000962 getDarwinDefines(Defines, Opts, getTargetTriple());
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000963 }
964};
965} // end anonymous namespace.
966
Chris Lattner4b009652007-07-25 00:24:17 +0000967namespace {
Daniel Dunbar88fd9942009-03-23 16:09:04 +0000968// arm FreeBSD target
969class FreeBSDARMTargetInfo : public ARMTargetInfo {
970public:
971 FreeBSDARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
972 virtual void getTargetDefines(const LangOptions &Opts,
973 std::vector<char> &Defines) const {
974 ARMTargetInfo::getTargetDefines(Opts, Defines);
975 getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
976 }
977};
978} // end anonymous namespace
979
980namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000981class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +0000982 static const TargetInfo::GCCRegAlias GCCRegAliases[];
983 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000984public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000985 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
986 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +0000987 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
988 "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
Eli Friedmanff158dd2008-08-20 07:28:14 +0000989 }
Chris Lattner79682402009-03-20 15:52:06 +0000990 virtual void getTargetDefines(const LangOptions &Opts,
991 std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000992 // FIXME: This is missing a lot of important defines; some of the
993 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000994 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000995 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000996 Define(Defines, "__sparcv8");
997 }
998 virtual void getTargetBuiltins(const Builtin::Info *&Records,
999 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001000 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001001 }
1002 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001003 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001004 }
1005 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001006 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001007 }
1008 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001009 unsigned &NumNames) const;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001010 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001011 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00001012 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001013 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001014 // FIXME: Implement!
1015 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001016 }
1017 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001018 // FIXME: Implement!
1019 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001020 }
1021};
1022
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001023const char * const SparcV8TargetInfo::GCCRegNames[] = {
1024 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1025 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1026 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1027 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1028};
1029
1030void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
1031 unsigned &NumNames) const {
1032 Names = GCCRegNames;
1033 NumNames = llvm::array_lengthof(GCCRegNames);
1034}
1035
1036const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
1037 { { "g0" }, "r0" },
1038 { { "g1" }, "r1" },
1039 { { "g2" }, "r2" },
1040 { { "g3" }, "r3" },
1041 { { "g4" }, "r4" },
1042 { { "g5" }, "r5" },
1043 { { "g6" }, "r6" },
1044 { { "g7" }, "r7" },
1045 { { "o0" }, "r8" },
1046 { { "o1" }, "r9" },
1047 { { "o2" }, "r10" },
1048 { { "o3" }, "r11" },
1049 { { "o4" }, "r12" },
1050 { { "o5" }, "r13" },
1051 { { "o6", "sp" }, "r14" },
1052 { { "o7" }, "r15" },
1053 { { "l0" }, "r16" },
1054 { { "l1" }, "r17" },
1055 { { "l2" }, "r18" },
1056 { { "l3" }, "r19" },
1057 { { "l4" }, "r20" },
1058 { { "l5" }, "r21" },
1059 { { "l6" }, "r22" },
1060 { { "l7" }, "r23" },
1061 { { "i0" }, "r24" },
1062 { { "i1" }, "r25" },
1063 { { "i2" }, "r26" },
1064 { { "i3" }, "r27" },
1065 { { "i4" }, "r28" },
1066 { { "i5" }, "r29" },
1067 { { "i6", "fp" }, "r30" },
1068 { { "i7" }, "r31" },
1069};
1070
1071void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1072 unsigned &NumAliases) const {
1073 Aliases = GCCRegAliases;
1074 NumAliases = llvm::array_lengthof(GCCRegAliases);
1075}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001076} // end anonymous namespace.
1077
Eli Friedmanff158dd2008-08-20 07:28:14 +00001078namespace {
1079class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
1080public:
1081 SolarisSparcV8TargetInfo(const std::string& triple) :
Eli Friedman7cca0982008-11-02 02:43:55 +00001082 SparcV8TargetInfo(triple) {
1083 SizeType = UnsignedInt;
1084 PtrDiffType = SignedInt;
1085 }
Eli Friedmanff158dd2008-08-20 07:28:14 +00001086
Chris Lattner79682402009-03-20 15:52:06 +00001087 virtual void getTargetDefines(const LangOptions &Opts,
1088 std::vector<char> &Defines) const {
1089 SparcV8TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanff158dd2008-08-20 07:28:14 +00001090 getSolarisDefines(Defines);
1091 }
1092};
1093} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001094
Chris Lattner85970f32008-05-08 05:58:21 +00001095namespace {
1096 class PIC16TargetInfo : public TargetInfo{
1097 public:
1098 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Sanjiv Guptafa451432008-10-31 09:52:39 +00001099 IntWidth = 16;
1100 LongWidth = LongLongWidth = 32;
1101 PointerWidth = 16;
1102 IntAlign = 8;
1103 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001104 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001105 SizeType = UnsignedInt;
1106 IntMaxType = SignedLong;
1107 UIntMaxType = UnsignedLong;
Chris Lattnerd9ef7242009-02-13 22:28:55 +00001108 IntPtrType = SignedShort;
Eli Friedman7cca0982008-11-02 02:43:55 +00001109 PtrDiffType = SignedInt;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +00001110 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +00001111 }
Chris Lattner727b3c42008-05-09 06:08:39 +00001112 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1113 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner79682402009-03-20 15:52:06 +00001114 virtual void getTargetDefines(const LangOptions &Opts,
1115 std::vector<char> &Defines) const {
Chris Lattner85970f32008-05-08 05:58:21 +00001116 Define(Defines, "__pic16");
1117 }
1118 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1119 unsigned &NumRecords) const {}
1120 virtual const char *getVAListDeclaration() const { return "";}
1121 virtual const char *getClobbers() const {return "";}
1122 virtual const char *getTargetPrefix() const {return "";}
1123 virtual void getGCCRegNames(const char * const *&Names,
1124 unsigned &NumNames) const {}
Anders Carlsson36834a72009-02-28 17:11:49 +00001125 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner85970f32008-05-08 05:58:21 +00001126 TargetInfo::ConstraintInfo &info) const {
1127 return true;
1128 }
1129 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1130 unsigned &NumAliases) const {}
1131 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1132 };
1133}
1134
Chris Lattner4b009652007-07-25 00:24:17 +00001135//===----------------------------------------------------------------------===//
1136// Driver code
1137//===----------------------------------------------------------------------===//
1138
Ted Kremenekb97d7672007-12-04 17:07:35 +00001139static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +00001140 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
1141 TT[4] == '-' && TT[1] - '3' < 6);
1142}
1143
Chris Lattnerfc457002008-03-05 01:18:20 +00001144/// CreateTargetInfo - Return the target info object for the specified target
1145/// triple.
1146TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Eli Friedman2b161652008-08-21 00:13:15 +00001147 // OS detection; this isn't really anywhere near complete.
1148 // Additions and corrections are welcome.
1149 bool isDarwin = T.find("-darwin") != std::string::npos;
Chris Lattnerd4faca42008-08-23 18:23:14 +00001150 bool isDragonFly = T.find("-dragonfly") != std::string::npos;
Chris Lattner98cb2a22008-10-16 17:04:31 +00001151 bool isFreeBSD = T.find("-freebsd") != std::string::npos;
Eli Friedman2b161652008-08-21 00:13:15 +00001152 bool isSolaris = T.find("-solaris") != std::string::npos;
1153 bool isLinux = T.find("-linux") != std::string::npos;
1154 bool isWindows = T.find("-windows") != std::string::npos ||
1155 T.find("-win32") != std::string::npos ||
1156 T.find("-mingw") != std::string::npos;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001157
Eli Friedman2b161652008-08-21 00:13:15 +00001158 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
1159 if (isDarwin)
1160 return new DarwinPPCTargetInfo(T);
1161 return new PPC32TargetInfo(T);
1162 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001163
Eli Friedman2b161652008-08-21 00:13:15 +00001164 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
1165 if (isDarwin)
1166 return new DarwinPPC64TargetInfo(T);
1167 return new PPC64TargetInfo(T);
1168 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001169
Mike Stumpf90a29f2009-04-08 02:07:04 +00001170 if (T.find("armv6-") == 0 || T.find("arm-") == 0
1171 || T.find("armv4t") == 0 || T.find("armv5-") == 0
1172 || T.find("xscale") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001173 if (isDarwin)
1174 return new DarwinARMTargetInfo(T);
Daniel Dunbar88fd9942009-03-23 16:09:04 +00001175 if (isFreeBSD)
1176 return new FreeBSDARMTargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001177 return new ARMTargetInfo(T);
1178 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001179
Eli Friedman2b161652008-08-21 00:13:15 +00001180 if (T.find("sparc-") == 0) {
1181 if (isSolaris)
1182 return new SolarisSparcV8TargetInfo(T);
1183 return new SparcV8TargetInfo(T);
1184 }
1185
Chris Lattner273dce42009-02-20 17:04:14 +00001186 if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
Eli Friedman2b161652008-08-21 00:13:15 +00001187 if (isDarwin)
1188 return new DarwinX86_64TargetInfo(T);
Daniel Dunbare5a80f22008-09-23 17:37:57 +00001189 if (isLinux)
1190 return new LinuxX86_64TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001191 if (isFreeBSD)
1192 return new FreeBSDX86_64TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001193 return new X86_64TargetInfo(T);
1194 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001195
Chris Lattner85970f32008-05-08 05:58:21 +00001196 if (T.find("pic16-") == 0)
1197 return new PIC16TargetInfo(T);
1198
Eli Friedman2b161652008-08-21 00:13:15 +00001199 if (IsX86(T)) {
1200 if (isDarwin)
1201 return new DarwinI386TargetInfo(T);
Eli Friedman5fb0a022008-08-21 00:24:02 +00001202 if (isLinux)
1203 return new LinuxX86_32TargetInfo(T);
Chris Lattnerd4faca42008-08-23 18:23:14 +00001204 if (isDragonFly)
1205 return new DragonFlyX86_32TargetInfo(T);
Chris Lattner98cb2a22008-10-16 17:04:31 +00001206 if (isFreeBSD)
1207 return new FreeBSDX86_32TargetInfo(T);
Eli Friedman23cb7912008-08-21 01:40:19 +00001208 if (isWindows)
1209 return new WindowsX86_32TargetInfo(T);
Eli Friedman2b161652008-08-21 00:13:15 +00001210 return new X86_32TargetInfo(T);
1211 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001212
Chris Lattnerfc457002008-03-05 01:18:20 +00001213 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +00001214}
Ted Kremenekd507bab2008-03-04 17:47:18 +00001215