blob: 4ee377e27557427a73760683f72b4aa37dfd2813 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-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 Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5abdec72009-06-14 01:05:48 +000015#include "clang/Basic/Builtins.h"
16#include "clang/Basic/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/TargetInfo.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000020#include "llvm/ADT/STLExtras.h"
Chris Lattner1e1c0b92009-03-20 16:06:38 +000021#include "llvm/ADT/SmallString.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000022#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000024#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000025#include "llvm/MC/MCSectionMachO.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000026using namespace clang;
27
Chris Lattner5ba61f02006-10-14 07:39:34 +000028//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000029// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000030//===----------------------------------------------------------------------===//
31
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000032static void Define(std::vector<char> &Buf, const llvm::StringRef &Macro,
33 const llvm::StringRef &Val = "1") {
Chris Lattnerb2d486a2007-10-06 06:57:34 +000034 const char *Def = "#define ";
35 Buf.insert(Buf.end(), Def, Def+strlen(Def));
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000036 Buf.insert(Buf.end(), Macro.begin(), Macro.end());
Chris Lattnerb2d486a2007-10-06 06:57:34 +000037 Buf.push_back(' ');
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000038 Buf.insert(Buf.end(), Val.begin(), Val.end());
Chris Lattnerb2d486a2007-10-06 06:57:34 +000039 Buf.push_back('\n');
40}
41
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042/// DefineStd - Define a macro name and standard variants. For example if
43/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
44/// when in GNU mode.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045static void DefineStd(std::vector<char> &Buf, const char *MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 const LangOptions &Opts) {
47 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
50 // in the user's namespace.
51 if (Opts.GNUMode)
52 Define(Buf, MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix.
55 llvm::SmallString<20> TmpStr;
56 TmpStr = "__";
57 TmpStr += MacroName;
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000058 Define(Buf, TmpStr.str());
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000059
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060 // Define __unix__.
61 TmpStr += "__";
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000062 Define(Buf, TmpStr.str());
Chris Lattner1e1c0b92009-03-20 16:06:38 +000063}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +000074 std::vector<char> &Defines) const=0;
75public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
78 std::vector<char> &Defines) const {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000079 TgtInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar40165182009-08-24 09:10:05 +000080 getOSDefines(Opts, TgtInfo::getTriple(), Defines);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbar497ff132009-04-10 19:52:24 +000087static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
Chris Lattner2fe5b262009-06-23 00:43:21 +000088 Define(Defs, "__APPLE_CC__", "5621");
Eli Friedman3fd920a2008-08-20 02:34:37 +000089 Define(Defs, "__APPLE__");
90 Define(Defs, "__MACH__");
Chris Lattner81813122009-02-05 07:19:24 +000091 Define(Defs, "OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000092
Chris Lattner2a5c0a32009-04-07 16:50:40 +000093 // __weak is always defined, for use in blocks and with objc pointers.
94 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000095
Chris Lattner2a5c0a32009-04-07 16:50:40 +000096 // Darwin defines __strong even in C mode (just to nothing).
97 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Chris Lattnerc2d14012009-04-07 04:48:21 +000098 Define(Defs, "__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +000099 else
Chris Lattnerc2d14012009-04-07 04:48:21 +0000100 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000101
102 if (Opts.Static)
103 Define(Defs, "__STATIC__");
104 else
105 Define(Defs, "__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000106
107 if (Opts.POSIXThreads)
108 Define(Defs, "_REENTRANT", "1");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000109}
110
Daniel Dunbar40165182009-08-24 09:10:05 +0000111static void getDarwinOSXDefines(std::vector<char> &Defs,
112 const llvm::Triple &Triple) {
113 if (Triple.getOS() != llvm::Triple::Darwin)
Chris Lattner859c37a2009-08-12 06:24:27 +0000114 return;
Mike Stump11289f42009-09-09 15:08:12 +0000115
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000116 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000117 unsigned Maj, Min, Rev;
Daniel Dunbar40165182009-08-24 09:10:05 +0000118 Triple.getDarwinNumber(Maj, Min, Rev);
Mike Stump11289f42009-09-09 15:08:12 +0000119
Chris Lattner859c37a2009-08-12 06:24:27 +0000120 char MacOSXStr[] = "1000";
121 if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
122 // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
123 MacOSXStr[2] = '0' + Maj-4;
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 }
Chris Lattner859c37a2009-08-12 06:24:27 +0000125
126 // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
127 // Cap 10.4.11 -> darwin8.11 -> "1049"
128 MacOSXStr[3] = std::min(Min, 9U)+'0';
129 Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", MacOSXStr);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000130}
131
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000132static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
Daniel Dunbar40165182009-08-24 09:10:05 +0000133 const llvm::Triple &Triple) {
134 if (Triple.getOS() != llvm::Triple::Darwin)
Chris Lattner859c37a2009-08-12 06:24:27 +0000135 return;
Mike Stump11289f42009-09-09 15:08:12 +0000136
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
138 unsigned Maj, Min, Rev;
Daniel Dunbar40165182009-08-24 09:10:05 +0000139 Triple.getDarwinNumber(Maj, Min, Rev);
Mike Stump11289f42009-09-09 15:08:12 +0000140
Chris Lattner859c37a2009-08-12 06:24:27 +0000141 // When targetting iPhone OS, interpret the minor version and
142 // revision as the iPhone OS version
143 char iPhoneOSStr[] = "10000";
144 if (Min >= 2 && Min <= 9) { // iPhone OS 2.0-9.0
145 // darwin9.2.0 -> 20000, darwin9.3.0 -> 30000, etc.
146 iPhoneOSStr[0] = '0' + Min;
Chris Lattnerb3793bb2008-09-30 01:00:25 +0000147 }
Chris Lattner859c37a2009-08-12 06:24:27 +0000148
149 // Handle minor version: 2.2 -> darwin9.2.2 -> 20200
150 iPhoneOSStr[2] = std::min(Rev, 9U)+'0';
151 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 iPhoneOSStr);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000153}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000154
Chris Lattner2ca529c2008-12-04 23:20:07 +0000155/// GetDarwinLanguageOptions - Set the default language options for darwin.
156static void GetDarwinLanguageOptions(LangOptions &Opts,
Daniel Dunbar40165182009-08-24 09:10:05 +0000157 const llvm::Triple &Triple) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000158 Opts.NeXTRuntime = true;
Mike Stump11289f42009-09-09 15:08:12 +0000159
Daniel Dunbar40165182009-08-24 09:10:05 +0000160 if (Triple.getOS() != llvm::Triple::Darwin)
Chris Lattner2ca529c2008-12-04 23:20:07 +0000161 return;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000162
Daniel Dunbar40165182009-08-24 09:10:05 +0000163 unsigned MajorVersion = Triple.getDarwinMajorNumber();
Chris Lattner859c37a2009-08-12 06:24:27 +0000164
Bill Wendlingd63bbad2009-06-28 07:36:13 +0000165 // Blocks and stack protectors default to on for 10.6 (darwin10) and beyond.
Chris Lattner859c37a2009-08-12 06:24:27 +0000166 if (MajorVersion > 9) {
Chris Lattner2ca529c2008-12-04 23:20:07 +0000167 Opts.Blocks = 1;
Bill Wendling18351072009-06-28 23:01:01 +0000168 Opts.setStackProtectorMode(LangOptions::SSPOn);
Bill Wendlingd63bbad2009-06-28 07:36:13 +0000169 }
Fariborz Jahanian240f2b72009-02-24 23:34:44 +0000170
Bill Wendlingd63bbad2009-06-28 07:36:13 +0000171 // Non-fragile ABI (in 64-bit mode) default to on for 10.5 (darwin9) and
172 // beyond.
Chris Lattner859c37a2009-08-12 06:24:27 +0000173 if (MajorVersion >= 9 && Opts.ObjC1 &&
Daniel Dunbar40165182009-08-24 09:10:05 +0000174 Triple.getArch() == llvm::Triple::x86_64)
Fariborz Jahanian30b3ac52009-02-24 23:38:42 +0000175 Opts.ObjCNonFragileABI = 1;
Chris Lattner2ca529c2008-12-04 23:20:07 +0000176}
177
Chris Lattner30ba6742009-08-10 19:03:04 +0000178namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000179template<typename Target>
180class DarwinTargetInfo : public OSTargetInfo<Target> {
181protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000182 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +0000183 std::vector<char> &Defines) const {
184 getDarwinDefines(Defines, Opts);
185 getDarwinOSXDefines(Defines, Triple);
186 }
Mike Stump11289f42009-09-09 15:08:12 +0000187
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188 /// getDefaultLangOptions - Allow the target to specify default settings for
189 /// various language options. These may be overridden by command line
190 /// options.
191 virtual void getDefaultLangOptions(LangOptions &Opts) {
192 TargetInfo::getDefaultLangOptions(Opts);
Daniel Dunbar40165182009-08-24 09:10:05 +0000193 GetDarwinLanguageOptions(Opts, TargetInfo::getTriple());
Torok Edwinb2b37c62009-06-30 17:10:35 +0000194 }
195public:
196 DarwinTargetInfo(const std::string& triple) :
197 OSTargetInfo<Target>(triple) {
198 this->TLSSupported = false;
199 }
200
Torok Edwinb2b37c62009-06-30 17:10:35 +0000201 virtual const char *getUnicodeStringSection() const {
202 return "__TEXT,__ustring";
203 }
Mike Stump11289f42009-09-09 15:08:12 +0000204
Chris Lattner30ba6742009-08-10 19:03:04 +0000205 virtual std::string isValidSectionSpecifier(const llvm::StringRef &SR) const {
206 // Let MCSectionMachO validate this.
207 llvm::StringRef Segment, Section;
208 unsigned TAA, StubSize;
209 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
210 TAA, StubSize);
211 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000212};
213
Chris Lattner30ba6742009-08-10 19:03:04 +0000214
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215// DragonFlyBSD Target
216template<typename Target>
217class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
218protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000219 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 std::vector<char> &Defs) const {
221 // DragonFly defines; list based off of gcc output
222 Define(Defs, "__DragonFly__");
223 Define(Defs, "__DragonFly_cc_version", "100001");
224 Define(Defs, "__ELF__");
225 Define(Defs, "__KPRINTF_ATTRIBUTE__");
226 Define(Defs, "__tune_i386__");
227 DefineStd(Defs, "unix", Opts);
228 }
229public:
Mike Stump11289f42009-09-09 15:08:12 +0000230 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000231 : OSTargetInfo<Target>(triple) {}
232};
233
234// FreeBSD Target
235template<typename Target>
236class FreeBSDTargetInfo : public OSTargetInfo<Target> {
237protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000238 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 std::vector<char> &Defs) const {
240 // FreeBSD defines; list based off of gcc output
241
Daniel Dunbar40165182009-08-24 09:10:05 +0000242 // FIXME: Move version number handling to llvm::Triple.
243 const char *FreeBSD = strstr(Triple.getTriple().c_str(),
244 "-freebsd");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245 FreeBSD += strlen("-freebsd");
246 char release[] = "X";
247 release[0] = FreeBSD[0];
248 char version[] = "X00001";
249 version[0] = FreeBSD[0];
250
251 Define(Defs, "__FreeBSD__", release);
252 Define(Defs, "__FreeBSD_cc_version", version);
253 Define(Defs, "__KPRINTF_ATTRIBUTE__");
254 DefineStd(Defs, "unix", Opts);
255 Define(Defs, "__ELF__", "1");
256 }
257public:
Mike Stump11289f42009-09-09 15:08:12 +0000258 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000259 : OSTargetInfo<Target>(triple) {
260 this->UserLabelPrefix = "";
261 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000262};
263
264// Linux target
265template<typename Target>
266class LinuxTargetInfo : public OSTargetInfo<Target> {
267protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000268 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +0000269 std::vector<char> &Defs) const {
270 // Linux defines; list based off of gcc output
271 DefineStd(Defs, "unix", Opts);
272 DefineStd(Defs, "linux", Opts);
273 Define(Defs, "__gnu_linux__");
274 Define(Defs, "__ELF__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000275 if (Opts.POSIXThreads)
276 Define(Defs, "_REENTRANT", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277 }
278public:
Mike Stump11289f42009-09-09 15:08:12 +0000279 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 : OSTargetInfo<Target>(triple) {
281 this->UserLabelPrefix = "";
282 }
283};
284
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000285// NetBSD Target
286template<typename Target>
287class NetBSDTargetInfo : public OSTargetInfo<Target> {
288protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000290 std::vector<char> &Defs) const {
291 // NetBSD defines; list based off of gcc output
292 Define(Defs, "__NetBSD__", "1");
293 Define(Defs, "__unix__", "1");
294 Define(Defs, "__ELF__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000295 if (Opts.POSIXThreads)
296 Define(Defs, "_POSIX_THREADS", "1");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000297 }
298public:
Mike Stump11289f42009-09-09 15:08:12 +0000299 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000300 : OSTargetInfo<Target>(triple) {
301 this->UserLabelPrefix = "";
302 }
303};
304
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305// OpenBSD Target
306template<typename Target>
307class OpenBSDTargetInfo : public OSTargetInfo<Target> {
308protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000309 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 std::vector<char> &Defs) const {
311 // OpenBSD defines; list based off of gcc output
312
313 Define(Defs, "__OpenBSD__", "1");
314 DefineStd(Defs, "unix", Opts);
315 Define(Defs, "__ELF__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000316 if (Opts.POSIXThreads)
317 Define(Defs, "_POSIX_THREADS", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000318 }
319public:
Mike Stump11289f42009-09-09 15:08:12 +0000320 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 : OSTargetInfo<Target>(triple) {}
322};
323
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000324// AuroraUX target
325template<typename Target>
326class AuroraUXTargetInfo : public OSTargetInfo<Target> {
327protected:
328 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
329 std::vector<char> &Defs) const {
330 DefineStd(Defs, "sun", Opts);
331 DefineStd(Defs, "unix", Opts);
332 Define(Defs, "__ELF__");
333 Define(Defs, "__svr4__");
334 Define(Defs, "__SVR4");
335 }
336public:
337 AuroraUXTargetInfo(const std::string& triple)
338 : OSTargetInfo<Target>(triple) {
339 this->UserLabelPrefix = "";
340 this->WCharType = this->SignedLong;
341 // FIXME: WIntType should be SignedLong
342 }
343};
344
Torok Edwinb2b37c62009-06-30 17:10:35 +0000345// Solaris target
346template<typename Target>
347class SolarisTargetInfo : public OSTargetInfo<Target> {
348protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000349 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350 std::vector<char> &Defs) const {
351 DefineStd(Defs, "sun", Opts);
352 DefineStd(Defs, "unix", Opts);
353 Define(Defs, "__ELF__");
354 Define(Defs, "__svr4__");
355 Define(Defs, "__SVR4");
356 }
357public:
Mike Stump11289f42009-09-09 15:08:12 +0000358 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 : OSTargetInfo<Target>(triple) {
360 this->UserLabelPrefix = "";
361 this->WCharType = this->SignedLong;
362 // FIXME: WIntType should be SignedLong
363 }
364};
Mike Stump11289f42009-09-09 15:08:12 +0000365} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000366
Chris Lattner09d98f52008-10-05 21:50:58 +0000367//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000368// Specific target implementations.
369//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000370
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000371namespace {
372// PPC abstract base class
373class PPCTargetInfo : public TargetInfo {
374 static const Builtin::Info BuiltinInfo[];
375 static const char * const GCCRegNames[];
376 static const TargetInfo::GCCRegAlias GCCRegAliases[];
377
378public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000379 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
380
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000381 virtual void getTargetBuiltins(const Builtin::Info *&Records,
382 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000383 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000384 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000385 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000386
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000387 virtual void getTargetDefines(const LangOptions &Opts,
388 std::vector<char> &Defines) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000389
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000390 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000391 return "typedef char* __builtin_va_list;";
392 // This is the right definition for ABI/V4: System V.4/eabi.
393 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000394 " unsigned char gpr;"
395 " unsigned char fpr;"
396 " unsigned short reserved;"
397 " void* overflow_arg_area;"
398 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000399 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000400 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000401 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000402 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000403 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000404 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000405 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000406 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000407 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000408 default: return false;
409 case 'O': // Zero
410 return true;
411 case 'b': // Base register
412 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000413 Info.setAllowsRegister();
Anders Carlssonf511f642007-11-27 04:11:28 +0000414 return true;
415 }
416 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000417 virtual void getDefaultLangOptions(LangOptions &Opts) {
418 TargetInfo::getDefaultLangOptions(Opts);
419 Opts.CharIsSigned = false;
420 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000421 virtual const char *getClobbers() const {
422 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000423 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000424};
Anders Carlssonf511f642007-11-27 04:11:28 +0000425
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000426const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000427#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
428#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000429#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000430};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000431
432
Chris Lattnerecd49032009-03-02 22:27:17 +0000433/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
434/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000435void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
436 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000437 // Target identification.
438 Define(Defs, "__ppc__");
439 Define(Defs, "_ARCH_PPC");
440 Define(Defs, "__POWERPC__");
441 if (PointerWidth == 64) {
442 Define(Defs, "_ARCH_PPC64");
443 Define(Defs, "_LP64");
444 Define(Defs, "__LP64__");
445 Define(Defs, "__ppc64__");
446 } else {
447 Define(Defs, "__ppc__");
448 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000449
Chris Lattnerecd49032009-03-02 22:27:17 +0000450 // Target properties.
451 Define(Defs, "_BIG_ENDIAN");
452 Define(Defs, "__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000453
Chris Lattnerecd49032009-03-02 22:27:17 +0000454 // Subtarget options.
455 Define(Defs, "__NATURAL_ALIGNMENT__");
456 Define(Defs, "__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000457
Chris Lattnerecd49032009-03-02 22:27:17 +0000458 // FIXME: Should be controlled by command line option.
459 Define(Defs, "__LONG_DOUBLE_128__");
460}
461
Chris Lattner17df24e2008-04-21 18:56:49 +0000462
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000463const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000464 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
465 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
466 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
467 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
468 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
469 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
470 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
471 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000472 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000473 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000474 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000475 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
476 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
477 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
478 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000479 "vrsave", "vscr",
480 "spe_acc", "spefscr",
481 "sfp"
482};
Chris Lattner10a5b382007-01-29 05:24:35 +0000483
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000484void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000485 unsigned &NumNames) const {
486 Names = GCCRegNames;
487 NumNames = llvm::array_lengthof(GCCRegNames);
488}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000489
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000490const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
491 // While some of these aliases do map to different registers
492 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000493 { { "0" }, "r0" },
494 { { "1"}, "r1" },
495 { { "2" }, "r2" },
496 { { "3" }, "r3" },
497 { { "4" }, "r4" },
498 { { "5" }, "r5" },
499 { { "6" }, "r6" },
500 { { "7" }, "r7" },
501 { { "8" }, "r8" },
502 { { "9" }, "r9" },
503 { { "10" }, "r10" },
504 { { "11" }, "r11" },
505 { { "12" }, "r12" },
506 { { "13" }, "r13" },
507 { { "14" }, "r14" },
508 { { "15" }, "r15" },
509 { { "16" }, "r16" },
510 { { "17" }, "r17" },
511 { { "18" }, "r18" },
512 { { "19" }, "r19" },
513 { { "20" }, "r20" },
514 { { "21" }, "r21" },
515 { { "22" }, "r22" },
516 { { "23" }, "r23" },
517 { { "24" }, "r24" },
518 { { "25" }, "r25" },
519 { { "26" }, "r26" },
520 { { "27" }, "r27" },
521 { { "28" }, "r28" },
522 { { "29" }, "r29" },
523 { { "30" }, "r30" },
524 { { "31" }, "r31" },
525 { { "fr0" }, "f0" },
526 { { "fr1" }, "f1" },
527 { { "fr2" }, "f2" },
528 { { "fr3" }, "f3" },
529 { { "fr4" }, "f4" },
530 { { "fr5" }, "f5" },
531 { { "fr6" }, "f6" },
532 { { "fr7" }, "f7" },
533 { { "fr8" }, "f8" },
534 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000535 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000536 { { "fr11" }, "f11" },
537 { { "fr12" }, "f12" },
538 { { "fr13" }, "f13" },
539 { { "fr14" }, "f14" },
540 { { "fr15" }, "f15" },
541 { { "fr16" }, "f16" },
542 { { "fr17" }, "f17" },
543 { { "fr18" }, "f18" },
544 { { "fr19" }, "f19" },
545 { { "fr20" }, "f20" },
546 { { "fr21" }, "f21" },
547 { { "fr22" }, "f22" },
548 { { "fr23" }, "f23" },
549 { { "fr24" }, "f24" },
550 { { "fr25" }, "f25" },
551 { { "fr26" }, "f26" },
552 { { "fr27" }, "f27" },
553 { { "fr28" }, "f28" },
554 { { "fr29" }, "f29" },
555 { { "fr30" }, "f30" },
556 { { "fr31" }, "f31" },
557 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000558};
559
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000560void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000561 unsigned &NumAliases) const {
562 Aliases = GCCRegAliases;
563 NumAliases = llvm::array_lengthof(GCCRegAliases);
564}
565} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000566
Chris Lattner5ba61f02006-10-14 07:39:34 +0000567namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000568class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000569public:
Eli Friedman873f65a2008-08-21 00:13:15 +0000570 PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
571 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000572 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Eli Friedman873f65a2008-08-21 00:13:15 +0000573 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000574};
575} // end anonymous namespace.
576
577namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000578class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000579public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000580 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000581 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000582 IntMaxType = SignedLong;
583 UIntMaxType = UnsignedLong;
584 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000585 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000586 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000587 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000588};
589} // end anonymous namespace.
590
Chris Lattner5ba61f02006-10-14 07:39:34 +0000591namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000592// Namespace for x86 abstract base class
593const Builtin::Info BuiltinInfo[] = {
Douglas Gregor9eebd972009-02-16 21:58:21 +0000594#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
595#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000596#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000597};
Eli Friedmanb5366062008-05-20 14:21:01 +0000598
Eli Friedman3fd920a2008-08-20 02:34:37 +0000599const char *GCCRegNames[] = {
600 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
601 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
602 "argp", "flags", "fspr", "dirflag", "frame",
603 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
604 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
605 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
606 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
607};
608
609const TargetInfo::GCCRegAlias GCCRegAliases[] = {
610 { { "al", "ah", "eax", "rax" }, "ax" },
611 { { "bl", "bh", "ebx", "rbx" }, "bx" },
612 { { "cl", "ch", "ecx", "rcx" }, "cx" },
613 { { "dl", "dh", "edx", "rdx" }, "dx" },
614 { { "esi", "rsi" }, "si" },
615 { { "edi", "rdi" }, "di" },
616 { { "esp", "rsp" }, "sp" },
617 { { "ebp", "rbp" }, "bp" },
618};
619
620// X86 target abstract base class; x86-32 and x86-64 are very close, so
621// most of the implementation can be shared.
622class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000623 enum X86SSEEnum {
624 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
625 } SSELevel;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000626public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000627 X86TargetInfo(const std::string& triple)
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000628 : TargetInfo(triple), SSELevel(NoMMXSSE) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000629 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000630 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000631 virtual void getTargetBuiltins(const Builtin::Info *&Records,
632 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000633 Records = BuiltinInfo;
634 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000635 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000636 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000637 unsigned &NumNames) const {
638 Names = GCCRegNames;
639 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000640 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000641 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000642 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000643 Aliases = GCCRegAliases;
644 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000645 }
Anders Carlsson58436352009-02-28 17:11:49 +0000646 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000647 TargetInfo::ConstraintInfo &info) const;
648 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000649 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000650 return "~{dirflag},~{fpsr},~{flags}";
651 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000652 virtual void getTargetDefines(const LangOptions &Opts,
653 std::vector<char> &Defines) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000654 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
655 const std::string &Name,
656 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +0000657 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000658 llvm::StringMap<bool> &Features) const;
Daniel Dunbar979586e2009-11-11 09:38:56 +0000659 virtual void HandleTargetFeatures(const std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +0000660};
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000661
Mike Stump11289f42009-09-09 15:08:12 +0000662void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000663 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000664 // FIXME: This should not be here.
665 Features["3dnow"] = false;
666 Features["3dnowa"] = false;
667 Features["mmx"] = false;
668 Features["sse"] = false;
669 Features["sse2"] = false;
670 Features["sse3"] = false;
671 Features["ssse3"] = false;
672 Features["sse41"] = false;
673 Features["sse42"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000674
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000675 // LLVM does not currently recognize this.
676 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000677
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000678 // FIXME: This *really* should not be here.
679
680 // X86_64 always has SSE2.
681 if (PointerWidth == 64)
682 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
683
Daniel Dunbarf9d90272009-05-06 21:56:32 +0000684 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
685 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
686 ;
687 else if (CPU == "pentium-mmx" || CPU == "pentium2")
688 setFeatureEnabled(Features, "mmx", true);
689 else if (CPU == "pentium3")
690 setFeatureEnabled(Features, "sse", true);
691 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
692 setFeatureEnabled(Features, "sse2", true);
693 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
694 setFeatureEnabled(Features, "sse3", true);
695 else if (CPU == "core2")
696 setFeatureEnabled(Features, "ssse3", true);
697 else if (CPU == "penryn") {
698 setFeatureEnabled(Features, "sse4", true);
699 Features["sse42"] = false;
700 } else if (CPU == "atom")
701 setFeatureEnabled(Features, "sse3", true);
702 else if (CPU == "corei7")
703 setFeatureEnabled(Features, "sse4", true);
704 else if (CPU == "k6" || CPU == "winchip-c6")
705 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +0000706 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +0000707 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
708 setFeatureEnabled(Features, "mmx", true);
709 setFeatureEnabled(Features, "3dnow", true);
710 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
711 setFeatureEnabled(Features, "sse", true);
712 setFeatureEnabled(Features, "3dnowa", true);
713 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
714 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +0000715 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +0000716 setFeatureEnabled(Features, "3dnowa", true);
717 } else if (CPU == "c3-2")
718 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000719}
720
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000721bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +0000722 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000723 bool Enabled) const {
724 // FIXME: This *really* should not be here.
725 if (!Features.count(Name) && Name != "sse4")
726 return false;
727
728 if (Enabled) {
729 if (Name == "mmx")
730 Features["mmx"] = true;
731 else if (Name == "sse")
732 Features["mmx"] = Features["sse"] = true;
733 else if (Name == "sse2")
734 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
735 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +0000736 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000737 Features["sse3"] = true;
738 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +0000739 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000740 Features["ssse3"] = true;
741 else if (Name == "sse4")
Mike Stump11289f42009-09-09 15:08:12 +0000742 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000743 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
744 else if (Name == "3dnow")
745 Features["3dnowa"] = true;
746 else if (Name == "3dnowa")
747 Features["3dnow"] = Features["3dnowa"] = true;
748 } else {
749 if (Name == "mmx")
Mike Stump11289f42009-09-09 15:08:12 +0000750 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000751 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
752 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +0000753 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000754 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
755 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +0000756 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000757 Features["sse41"] = Features["sse42"] = false;
758 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +0000759 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +0000760 Features["sse42"] = false;
761 else if (Name == "ssse3")
762 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
763 else if (Name == "sse4")
764 Features["sse41"] = Features["sse42"] = false;
765 else if (Name == "3dnow")
766 Features["3dnow"] = Features["3dnowa"] = false;
767 else if (Name == "3dnowa")
768 Features["3dnowa"] = false;
769 }
770
771 return true;
772}
773
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +0000774/// HandleTargetOptions - Perform initialization based on the user
775/// configured set of features.
Daniel Dunbar979586e2009-11-11 09:38:56 +0000776void
777X86TargetInfo::HandleTargetFeatures(const std::vector<std::string> &Features) {
778 // Remember the maximum enabled sselevel.
779 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
780 // Ignore disabled features.
781 if (Features[i][0] == '-')
782 continue;
783
784 assert(Features[i][0] == '+' && "Invalid target feature!");
785 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
786 .Case("sse42", SSE42)
787 .Case("sse41", SSE41)
788 .Case("ssse3", SSSE3)
789 .Case("sse2", SSE2)
790 .Case("sse", SSE1)
791 .Case("mmx", MMX)
792 .Default(NoMMXSSE);
793 SSELevel = std::max(SSELevel, Level);
794 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +0000795}
Chris Lattnerecd49032009-03-02 22:27:17 +0000796
797/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
798/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000799void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
800 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000801 // Target identification.
802 if (PointerWidth == 64) {
803 Define(Defs, "_LP64");
804 Define(Defs, "__LP64__");
805 Define(Defs, "__amd64__");
806 Define(Defs, "__amd64");
807 Define(Defs, "__x86_64");
808 Define(Defs, "__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000809 } else {
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000810 DefineStd(Defs, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +0000811 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000812
Chris Lattnerecd49032009-03-02 22:27:17 +0000813 // Target properties.
814 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000815
Chris Lattnerecd49032009-03-02 22:27:17 +0000816 // Subtarget options.
817 Define(Defs, "__nocona");
818 Define(Defs, "__nocona__");
819 Define(Defs, "__tune_nocona__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000820 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +0000821
Chris Lattner6df41af2009-04-19 17:32:33 +0000822 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
823 // functions in glibc header files that use FP Stack inline asm which the
824 // backend can't deal with (PR879).
825 Define(Defs, "__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000826
Chris Lattner96e43572009-03-02 22:40:39 +0000827 // Each case falls through to the previous one here.
828 switch (SSELevel) {
829 case SSE42:
830 Define(Defs, "__SSE4_2__");
831 case SSE41:
832 Define(Defs, "__SSE4_1__");
833 case SSSE3:
834 Define(Defs, "__SSSE3__");
835 case SSE3:
836 Define(Defs, "__SSE3__");
837 case SSE2:
838 Define(Defs, "__SSE2__");
839 Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
840 case SSE1:
841 Define(Defs, "__SSE__");
842 Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
843 case MMX:
844 Define(Defs, "__MMX__");
845 case NoMMXSSE:
846 break;
847 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000848}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000849
850
Eli Friedman3fd920a2008-08-20 02:34:37 +0000851bool
Anders Carlsson58436352009-02-28 17:11:49 +0000852X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000853 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000854 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000855 default: return false;
856 case 'a': // eax.
857 case 'b': // ebx.
858 case 'c': // ecx.
859 case 'd': // edx.
860 case 'S': // esi.
861 case 'D': // edi.
862 case 'A': // edx:eax.
863 case 't': // top of floating point stack.
864 case 'u': // second from top of floating point stack.
865 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +0000866 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +0000867 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000868 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000869 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +0000870 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000871 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +0000872 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +0000873 case 'N': // unsigned 8-bit integer constant for use with in and out
874 // instructions.
Eli Friedmancf432d32009-06-08 20:45:44 +0000875 case 'R': // "legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
Chris Lattnerd9725f72009-04-26 07:16:29 +0000876 Info.setAllowsRegister();
Eli Friedman3fd920a2008-08-20 02:34:37 +0000877 return true;
878 }
879}
880
881std::string
882X86TargetInfo::convertConstraint(const char Constraint) const {
883 switch (Constraint) {
884 case 'a': return std::string("{ax}");
885 case 'b': return std::string("{bx}");
886 case 'c': return std::string("{cx}");
887 case 'd': return std::string("{dx}");
888 case 'S': return std::string("{si}");
889 case 'D': return std::string("{di}");
890 case 't': // top of floating point stack.
891 return std::string("{st}");
892 case 'u': // second from top of floating point stack.
893 return std::string("{st(1)}"); // second from top of floating point stack.
894 default:
895 return std::string(1, Constraint);
896 }
897}
Eli Friedman3fd920a2008-08-20 02:34:37 +0000898} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +0000899
900namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000901// X86-32 generic target
902class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000903public:
Eli Friedman3fd920a2008-08-20 02:34:37 +0000904 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
905 DoubleAlign = LongLongAlign = 32;
906 LongDoubleWidth = 96;
907 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +0000908 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
909 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000910 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +0000911 SizeType = UnsignedInt;
912 PtrDiffType = SignedInt;
913 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +0000914 RegParmMax = 3;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000915 }
916 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +0000917 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +0000918 }
Chris Lattnerd545ad12009-09-23 06:06:36 +0000919
920 int getEHDataRegisterNumber(unsigned RegNo) const {
921 if (RegNo == 0) return 0;
922 if (RegNo == 1) return 2;
923 return -1;
924 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000925};
926} // end anonymous namespace
927
928namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +0000929class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
930public:
931 OpenBSDI386TargetInfo(const std::string& triple) :
932 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
933 SizeType = UnsignedLong;
934 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +0000935 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +0000936 }
937};
938} // end anonymous namespace
939
940namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000941class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000942public:
Torok Edwinb2b37c62009-06-30 17:10:35 +0000943 DarwinI386TargetInfo(const std::string& triple) :
944 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000945 LongDoubleWidth = 128;
946 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +0000947 SizeType = UnsignedLong;
948 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000949 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
950 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000951 "a0:0:64-f80:128:128-n8:16:32";
Torok Edwin4e054162009-06-30 17:00:25 +0000952 }
953
Eli Friedman3fd920a2008-08-20 02:34:37 +0000954};
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000955} // end anonymous namespace
956
957namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000958// x86-32 Windows target
959class WindowsX86_32TargetInfo : public X86_32TargetInfo {
960public:
961 WindowsX86_32TargetInfo(const std::string& triple)
962 : X86_32TargetInfo(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +0000963 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +0000964 WCharType = UnsignedShort;
Eli Friedmanaa27a872009-06-08 06:11:14 +0000965 WCharWidth = WCharAlign = 16;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +0000966 DoubleAlign = LongLongAlign = 64;
967 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
968 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000969 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000970 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000971 virtual void getTargetDefines(const LangOptions &Opts,
972 std::vector<char> &Defines) const {
973 X86_32TargetInfo::getTargetDefines(Opts, Defines);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000974 // This list is based off of the the list of things MingW defines
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000975 Define(Defines, "_WIN32");
Chris Lattner1e1c0b92009-03-20 16:06:38 +0000976 DefineStd(Defines, "WIN32", Opts);
977 DefineStd(Defines, "WINNT", Opts);
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000978 Define(Defines, "_X86_");
Eli Friedmanc968a6a2008-08-21 01:40:19 +0000979 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +0000980};
981} // end anonymous namespace
Eli Friedmanaa27a872009-06-08 06:11:14 +0000982
Daniel Dunbar3e7a7232009-09-23 07:31:35 +0000983namespace {
984
985/// GetWindowsVisualStudioLanguageOptions - Set the default language options for Windows.
986static void GetWindowsVisualStudioLanguageOptions(LangOptions &Opts) {
987 Opts.Microsoft = true;
988}
989
990// x86-32 Windows Visual Studio target
991class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
992public:
993 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
994 : WindowsX86_32TargetInfo(triple) {
995 }
996 virtual void getTargetDefines(const LangOptions &Opts,
997 std::vector<char> &Defines) const {
998 WindowsX86_32TargetInfo::getTargetDefines(Opts, Defines);
999 // The value of the following reflects processor type.
1000 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1001 // We lost the original triple, so we use the default.
1002 Define(Defines, "_M_IX86", "600");
1003 }
Eli Friedmanaa27a872009-06-08 06:11:14 +00001004 virtual void getDefaultLangOptions(LangOptions &Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001005 WindowsX86_32TargetInfo::getDefaultLangOptions(Opts);
1006 GetWindowsVisualStudioLanguageOptions(Opts);
1007 }
1008};
1009} // end anonymous namespace
1010
1011namespace {
1012// x86-32 MinGW target
1013class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1014public:
1015 MinGWX86_32TargetInfo(const std::string& triple)
1016 : WindowsX86_32TargetInfo(triple) {
1017 }
1018 virtual void getTargetDefines(const LangOptions &Opts,
1019 std::vector<char> &Defines) const {
1020 WindowsX86_32TargetInfo::getTargetDefines(Opts, Defines);
1021 Define(Defines, "__MSVCRT__");
1022 Define(Defines, "__MINGW32__");
Cedric Venetbc8d0de2009-09-27 10:09:11 +00001023 Define(Defines, "__declspec", "__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001024 }
1025};
1026} // end anonymous namespace
1027
1028namespace {
1029// x86-32 Cygwin target
1030class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1031public:
1032 CygwinX86_32TargetInfo(const std::string& triple)
1033 : X86_32TargetInfo(triple) {
1034 TLSSupported = false;
1035 WCharType = UnsignedShort;
1036 WCharWidth = WCharAlign = 16;
1037 DoubleAlign = LongLongAlign = 64;
1038 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1039 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001040 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001041 }
1042 virtual void getTargetDefines(const LangOptions &Opts,
1043 std::vector<char> &Defines) const {
1044 X86_32TargetInfo::getTargetDefines(Opts, Defines);
1045 Define(Defines, "__CYGWIN__");
1046 Define(Defines, "__CYGWIN32__");
1047 DefineStd(Defines, "unix", Opts);
Eli Friedmanaa27a872009-06-08 06:11:14 +00001048 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001049};
1050} // end anonymous namespace
1051
1052namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001053// x86-64 generic target
1054class X86_64TargetInfo : public X86TargetInfo {
1055public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001056 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001057 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001058 LongDoubleWidth = 128;
1059 LongDoubleAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001060 IntMaxType = SignedLong;
1061 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001062 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001063 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001064
Eli Friedman873f65a2008-08-21 00:13:15 +00001065 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1066 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001067 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Chris Lattner10a5b382007-01-29 05:24:35 +00001068 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001069 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001070 return "typedef struct __va_list_tag {"
1071 " unsigned gp_offset;"
1072 " unsigned fp_offset;"
1073 " void* overflow_arg_area;"
1074 " void* reg_save_area;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001075 "} __va_list_tag;"
1076 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001077 }
Chris Lattnerd545ad12009-09-23 06:06:36 +00001078
1079 int getEHDataRegisterNumber(unsigned RegNo) const {
1080 if (RegNo == 0) return 0;
1081 if (RegNo == 1) return 1;
1082 return -1;
1083 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001084};
1085} // end anonymous namespace
1086
1087namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001088// x86-64 Windows target
1089class WindowsX86_64TargetInfo : public X86_64TargetInfo {
1090public:
1091 WindowsX86_64TargetInfo(const std::string& triple)
1092 : X86_64TargetInfo(triple) {
1093 TLSSupported = false;
1094 WCharType = UnsignedShort;
1095 WCharWidth = WCharAlign = 16;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001096 LongWidth = LongAlign = 32;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001097 DoubleAlign = LongLongAlign = 64;
1098 }
1099 virtual void getTargetDefines(const LangOptions &Opts,
1100 std::vector<char> &Defines) const {
1101 X86_64TargetInfo::getTargetDefines(Opts, Defines);
1102 Define(Defines, "_WIN64");
1103 DefineStd(Defines, "WIN64", Opts);
1104 }
1105};
1106} // end anonymous namespace
1107
1108namespace {
1109// x86-64 Windows Visual Studio target
1110class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1111public:
1112 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1113 : WindowsX86_64TargetInfo(triple) {
1114 }
1115 virtual void getTargetDefines(const LangOptions &Opts,
1116 std::vector<char> &Defines) const {
1117 WindowsX86_64TargetInfo::getTargetDefines(Opts, Defines);
1118 Define(Defines, "_M_X64");
1119 }
1120 virtual const char *getVAListDeclaration() const {
1121 return "typedef char* va_list;";
1122 }
1123};
1124} // end anonymous namespace
1125
1126namespace {
1127// x86-64 MinGW target
1128class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1129public:
1130 MinGWX86_64TargetInfo(const std::string& triple)
1131 : WindowsX86_64TargetInfo(triple) {
1132 }
1133 virtual void getTargetDefines(const LangOptions &Opts,
1134 std::vector<char> &Defines) const {
1135 WindowsX86_64TargetInfo::getTargetDefines(Opts, Defines);
1136 Define(Defines, "__MSVCRT__");
1137 Define(Defines, "__MINGW64__");
1138 Define(Defines, "__declspec");
1139 }
1140};
1141} // end anonymous namespace
1142
1143namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001144class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1145public:
Mike Stump11289f42009-09-09 15:08:12 +00001146 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001147 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1148 Int64Type = SignedLongLong;
1149 }
1150};
1151} // end anonymous namespace
1152
1153namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001154class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1155public:
Mike Stump11289f42009-09-09 15:08:12 +00001156 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001157 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1158 IntMaxType = SignedLongLong;
1159 UIntMaxType = UnsignedLongLong;
1160 Int64Type = SignedLongLong;
1161 }
1162};
1163} // end anonymous namespace
1164
1165namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001166class ARMTargetInfo : public TargetInfo {
Mike Stump9d54bd72009-04-08 02:07:04 +00001167 enum {
1168 Armv4t,
1169 Armv5,
1170 Armv6,
Mike Stumpb0dd95d2009-08-04 19:48:52 +00001171 Armv7a,
Mike Stump9d54bd72009-04-08 02:07:04 +00001172 XScale
1173 } ArmArch;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001174
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001175 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1176 static const char * const GCCRegNames[];
1177
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001178 std::string ABI;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001179 bool IsThumb;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001180
Chris Lattner17df24e2008-04-21 18:56:49 +00001181public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001182 ARMTargetInfo(const std::string &TripleStr)
1183 : TargetInfo(TripleStr), ABI("aapcs-linux"), IsThumb(false)
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001184 {
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001185 llvm::Triple Triple(TripleStr);
1186
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001187 SizeType = UnsignedInt;
1188 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001189
1190 // FIXME: This shouldn't be done this way, we should use features to
1191 // indicate the arch. See lib/Driver/Tools.cpp.
1192 llvm::StringRef Version(""), Arch = Triple.getArchName();
1193 if (Arch.startswith("arm"))
1194 Version = Arch.substr(3);
1195 else if (Arch.startswith("thumb"))
1196 Version = Arch.substr(5);
1197 if (Version == "v7")
Mike Stumpb0dd95d2009-08-04 19:48:52 +00001198 ArmArch = Armv7a;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001199 else if (Version.empty() || Version == "v6" || Version == "v6t2")
Mike Stump9d54bd72009-04-08 02:07:04 +00001200 ArmArch = Armv6;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001201 else if (Version == "v5")
Mike Stump9d54bd72009-04-08 02:07:04 +00001202 ArmArch = Armv5;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001203 else if (Version == "v4t")
Mike Stump9d54bd72009-04-08 02:07:04 +00001204 ArmArch = Armv4t;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001205 else if (Arch == "xscale" || Arch == "thumbv5e")
Mike Stump9d54bd72009-04-08 02:07:04 +00001206 ArmArch = XScale;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001207 else
Chris Lattner0dc10262009-04-23 04:22:04 +00001208 ArmArch = Armv6;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001209
1210 if (Arch.startswith("thumb"))
1211 IsThumb = true;
Daniel Dunbar03184792009-09-22 21:44:58 +00001212
1213 if (IsThumb) {
1214 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1215 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001216 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001217 } else {
1218 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1219 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001220 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001221 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001222 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001223 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001224 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001225 ABI = Name;
1226
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001227 // The defaults (above) are for AAPCS, check if we need to change them.
1228 //
1229 // FIXME: We need support for -meabi... we could just mangle it into the
1230 // name.
1231 if (Name == "apcs-gnu") {
1232 DoubleAlign = LongLongAlign = 32;
1233 SizeType = UnsignedLong;
1234
Daniel Dunbar03184792009-09-22 21:44:58 +00001235 if (IsThumb) {
1236 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1237 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001238 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001239 } else {
1240 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1241 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001242 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001243 }
1244
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001245 // FIXME: Override "preferred align" for double and long long.
1246 } else if (Name == "aapcs") {
1247 // FIXME: Enumerated types are variable width in straight AAPCS.
1248 } else if (Name == "aapcs-linux") {
1249 ;
1250 } else
1251 return false;
1252
1253 return true;
1254 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001255 virtual void getTargetDefines(const LangOptions &Opts,
1256 std::vector<char> &Defs) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001257 // Target identification.
1258 Define(Defs, "__arm");
1259 Define(Defs, "__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001260
Chris Lattnerecd49032009-03-02 22:27:17 +00001261 // Target properties.
1262 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001263
Mike Stump9d54bd72009-04-08 02:07:04 +00001264 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001265 //
1266 // FIXME: Neither THUMB_INTERWORK nor SOFTFP is not being set correctly
1267 // here.
Mike Stumpb0dd95d2009-08-04 19:48:52 +00001268 if (ArmArch == Armv7a) {
1269 Define(Defs, "__ARM_ARCH_7A__");
1270 Define(Defs, "__THUMB_INTERWORK__");
1271 } else if (ArmArch == Armv6) {
Mike Stump9d54bd72009-04-08 02:07:04 +00001272 Define(Defs, "__ARM_ARCH_6K__");
1273 Define(Defs, "__THUMB_INTERWORK__");
1274 } else if (ArmArch == Armv5) {
1275 Define(Defs, "__ARM_ARCH_5TEJ__");
1276 Define(Defs, "__THUMB_INTERWORK__");
1277 Define(Defs, "__SOFTFP__");
1278 } else if (ArmArch == Armv4t) {
1279 Define(Defs, "__ARM_ARCH_4T__");
1280 Define(Defs, "__SOFTFP__");
1281 } else if (ArmArch == XScale) {
1282 Define(Defs, "__ARM_ARCH_5TE__");
1283 Define(Defs, "__XSCALE__");
1284 Define(Defs, "__SOFTFP__");
1285 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001286
Chris Lattnerecd49032009-03-02 22:27:17 +00001287 Define(Defs, "__ARMEL__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001288
1289 if (IsThumb) {
1290 Define(Defs, "__THUMBEL__");
1291 Define(Defs, "__thumb__");
1292 if (ArmArch == Armv7a)
1293 Define(Defs, "__thumb2__");
1294 }
1295
1296 // Note, this is always on in gcc, even though it doesn't make sense.
Eli Friedman20da71e2009-05-29 19:00:15 +00001297 Define(Defs, "__APCS_32__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001298 // FIXME: This should be conditional on VFP instruction support.
Eli Friedman20da71e2009-05-29 19:00:15 +00001299 Define(Defs, "__VFP_FP__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001300
1301 Define(Defs, "__USING_SJLJ_EXCEPTIONS__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001302 }
1303 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1304 unsigned &NumRecords) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001305 // FIXME: Implement.
1306 Records = 0;
Chris Lattner17df24e2008-04-21 18:56:49 +00001307 NumRecords = 0;
1308 }
1309 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001310 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001311 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001312 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001313 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001314 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001315 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001316 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001317 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001318 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001319 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001320 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001321 case 'l': // r0-r7
1322 case 'h': // r8-r15
1323 case 'w': // VFP Floating point register single precision
1324 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001325 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001326 return true;
1327 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001328 return false;
1329 }
1330 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001331 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001332 return "";
1333 }
1334};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001335
1336const char * const ARMTargetInfo::GCCRegNames[] = {
1337 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1338 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1339};
1340
1341void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
1342 unsigned &NumNames) const {
1343 Names = GCCRegNames;
1344 NumNames = llvm::array_lengthof(GCCRegNames);
1345}
1346
1347const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
1348
1349 { { "a1" }, "r0" },
1350 { { "a2" }, "r1" },
1351 { { "a3" }, "r2" },
1352 { { "a4" }, "r3" },
1353 { { "v1" }, "r4" },
1354 { { "v2" }, "r5" },
1355 { { "v3" }, "r6" },
1356 { { "v4" }, "r7" },
1357 { { "v5" }, "r8" },
1358 { { "v6", "rfp" }, "r9" },
1359 { { "sl" }, "r10" },
1360 { { "fp" }, "r11" },
1361 { { "ip" }, "r12" },
1362 { { "sp" }, "r13" },
1363 { { "lr" }, "r14" },
1364 { { "pc" }, "r15" },
1365};
1366
1367void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1368 unsigned &NumAliases) const {
1369 Aliases = GCCRegAliases;
1370 NumAliases = llvm::array_lengthof(GCCRegAliases);
1371}
Chris Lattner17df24e2008-04-21 18:56:49 +00001372} // end anonymous namespace.
1373
Eli Friedmanf05b7722008-08-20 07:44:10 +00001374
1375namespace {
Mike Stump11289f42009-09-09 15:08:12 +00001376class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00001377 public DarwinTargetInfo<ARMTargetInfo> {
1378protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00001379 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Torok Edwinb2b37c62009-06-30 17:10:35 +00001380 std::vector<char> &Defines) const {
1381 getDarwinDefines(Defines, Opts);
1382 getDarwinIPhoneOSDefines(Defines, Triple);
Eli Friedmand88c8a12009-04-19 21:38:35 +00001383 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001384
Torok Edwinb2b37c62009-06-30 17:10:35 +00001385public:
Mike Stump11289f42009-09-09 15:08:12 +00001386 DarwinARMTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +00001387 : DarwinTargetInfo<ARMTargetInfo>(triple) {}
Eli Friedmanf05b7722008-08-20 07:44:10 +00001388};
1389} // end anonymous namespace.
1390
Chris Lattner5ba61f02006-10-14 07:39:34 +00001391namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001392class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00001393 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1394 static const char * const GCCRegNames[];
Gabor Greif49991682008-02-21 16:29:08 +00001395public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001396 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1397 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00001398 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001399 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001400 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001401 virtual void getTargetDefines(const LangOptions &Opts,
1402 std::vector<char> &Defines) const {
Eli Friedman79426742009-05-22 01:12:57 +00001403 DefineStd(Defines, "sparc", Opts);
Gabor Greif49991682008-02-21 16:29:08 +00001404 Define(Defines, "__sparcv8");
Eli Friedman79426742009-05-22 01:12:57 +00001405 Define(Defines, "__REGISTER_PREFIX__", "");
Gabor Greif49991682008-02-21 16:29:08 +00001406 }
1407 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1408 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001409 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00001410 }
1411 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001412 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00001413 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001414 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00001415 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001416 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00001417 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001418 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00001419 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001420 // FIXME: Implement!
1421 return false;
Gabor Greif49991682008-02-21 16:29:08 +00001422 }
1423 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001424 // FIXME: Implement!
1425 return "";
Gabor Greif49991682008-02-21 16:29:08 +00001426 }
1427};
1428
Chris Lattner9b415d62009-01-27 01:58:38 +00001429const char * const SparcV8TargetInfo::GCCRegNames[] = {
1430 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1431 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1432 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1433 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1434};
1435
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001436void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00001437 unsigned &NumNames) const {
1438 Names = GCCRegNames;
1439 NumNames = llvm::array_lengthof(GCCRegNames);
1440}
1441
1442const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001443 { { "g0" }, "r0" },
1444 { { "g1" }, "r1" },
1445 { { "g2" }, "r2" },
1446 { { "g3" }, "r3" },
1447 { { "g4" }, "r4" },
1448 { { "g5" }, "r5" },
1449 { { "g6" }, "r6" },
1450 { { "g7" }, "r7" },
1451 { { "o0" }, "r8" },
1452 { { "o1" }, "r9" },
1453 { { "o2" }, "r10" },
1454 { { "o3" }, "r11" },
1455 { { "o4" }, "r12" },
1456 { { "o5" }, "r13" },
1457 { { "o6", "sp" }, "r14" },
1458 { { "o7" }, "r15" },
1459 { { "l0" }, "r16" },
1460 { { "l1" }, "r17" },
1461 { { "l2" }, "r18" },
1462 { { "l3" }, "r19" },
1463 { { "l4" }, "r20" },
1464 { { "l5" }, "r21" },
1465 { { "l6" }, "r22" },
1466 { { "l7" }, "r23" },
1467 { { "i0" }, "r24" },
1468 { { "i1" }, "r25" },
1469 { { "i2" }, "r26" },
1470 { { "i3" }, "r27" },
1471 { { "i4" }, "r28" },
1472 { { "i5" }, "r29" },
1473 { { "i6", "fp" }, "r30" },
1474 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00001475};
1476
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001477void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00001478 unsigned &NumAliases) const {
1479 Aliases = GCCRegAliases;
1480 NumAliases = llvm::array_lengthof(GCCRegAliases);
1481}
Gabor Greif49991682008-02-21 16:29:08 +00001482} // end anonymous namespace.
1483
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001484namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00001485class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
1486public:
1487 AuroraUXSparcV8TargetInfo(const std::string& triple) :
1488 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
1489 SizeType = UnsignedInt;
1490 PtrDiffType = SignedInt;
1491 }
1492};
Torok Edwinb2b37c62009-06-30 17:10:35 +00001493class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001494public:
1495 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00001496 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00001497 SizeType = UnsignedInt;
1498 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001499 }
1500};
1501} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001502
Chris Lattnerb781dc792008-05-08 05:58:21 +00001503namespace {
1504 class PIC16TargetInfo : public TargetInfo{
1505 public:
1506 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001507 TLSSupported = false;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001508 IntWidth = 16;
1509 LongWidth = LongLongWidth = 32;
Eli Friedman678d3ba2009-05-16 23:30:57 +00001510 IntMaxTWidth = 32;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001511 PointerWidth = 16;
1512 IntAlign = 8;
1513 LongAlign = LongLongAlign = 8;
Eli Friedmanb5366062008-05-20 14:21:01 +00001514 PointerAlign = 8;
Sanjiv Guptad7959242008-10-31 09:52:39 +00001515 SizeType = UnsignedInt;
1516 IntMaxType = SignedLong;
1517 UIntMaxType = UnsignedLong;
Chris Lattner7e4c81c2009-02-13 22:28:55 +00001518 IntPtrType = SignedShort;
Eli Friedmand50881c2008-11-02 02:43:55 +00001519 PtrDiffType = SignedInt;
Sanjiv Gupta7c720072009-06-02 04:43:46 +00001520 FloatWidth = 32;
1521 FloatAlign = 32;
1522 DoubleWidth = 32;
1523 DoubleAlign = 32;
1524 LongDoubleWidth = 32;
1525 LongDoubleAlign = 32;
1526 FloatFormat = &llvm::APFloat::IEEEsingle;
1527 DoubleFormat = &llvm::APFloat::IEEEsingle;
1528 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner5c67237f2009-11-07 18:59:41 +00001529 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-f32:32:32-n8";
Sanjiv Gupta7c720072009-06-02 04:43:46 +00001530
Chris Lattnerb781dc792008-05-08 05:58:21 +00001531 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +00001532 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1533 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001534 virtual void getTargetDefines(const LangOptions &Opts,
1535 std::vector<char> &Defines) const {
Chris Lattnerb781dc792008-05-08 05:58:21 +00001536 Define(Defines, "__pic16");
Sanjiv Gupta30f95ec2009-07-07 04:42:23 +00001537 Define(Defines, "rom", "__attribute__((address_space(1)))");
1538 Define(Defines, "ram", "__attribute__((address_space(0)))");
Mike Stump11289f42009-09-09 15:08:12 +00001539 Define(Defines, "_section(SectName)",
Sanjiv Guptab841d1b2009-08-20 17:48:52 +00001540 "__attribute__((section(SectName)))");
Sanjiv Gupta84f0f772009-10-24 18:08:20 +00001541 Define(Defines, "near",
1542 "__attribute__((section(\"Address=NEAR\")))");
Sanjiv Guptab841d1b2009-08-20 17:48:52 +00001543 Define(Defines, "_address(Addr)",
1544 "__attribute__((section(\"Address=\"#Addr)))");
Sanjiv Gupta30f95ec2009-07-07 04:42:23 +00001545 Define(Defines, "_CONFIG(conf)", "asm(\"CONFIG \"#conf)");
Sanjiv Guptab841d1b2009-08-20 17:48:52 +00001546 Define(Defines, "_interrupt",
1547 "__attribute__((section(\"interrupt=0x4\"))) \
1548 __attribute__((used))");
Chris Lattnerb781dc792008-05-08 05:58:21 +00001549 }
1550 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1551 unsigned &NumRecords) const {}
Mike Stump11289f42009-09-09 15:08:12 +00001552 virtual const char *getVAListDeclaration() const {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00001553 return "";
1554 }
1555 virtual const char *getClobbers() const {
1556 return "";
1557 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001558 virtual void getGCCRegNames(const char * const *&Names,
1559 unsigned &NumNames) const {}
1560 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerb781dc792008-05-08 05:58:21 +00001561 TargetInfo::ConstraintInfo &info) const {
1562 return true;
1563 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001564 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerb781dc792008-05-08 05:58:21 +00001565 unsigned &NumAliases) const {}
1566 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1567 };
1568}
1569
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001570namespace {
1571 class MSP430TargetInfo : public TargetInfo {
1572 static const char * const GCCRegNames[];
1573 public:
1574 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1575 TLSSupported = false;
1576 IntWidth = 16;
1577 LongWidth = LongLongWidth = 32;
Eli Friedman678d3ba2009-05-16 23:30:57 +00001578 IntMaxTWidth = 32;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001579 PointerWidth = 16;
1580 IntAlign = 8;
1581 LongAlign = LongLongAlign = 8;
1582 PointerAlign = 8;
1583 SizeType = UnsignedInt;
1584 IntMaxType = SignedLong;
1585 UIntMaxType = UnsignedLong;
1586 IntPtrType = SignedShort;
1587 PtrDiffType = SignedInt;
Chris Lattner5c67237f2009-11-07 18:59:41 +00001588 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001589 }
1590 virtual void getTargetDefines(const LangOptions &Opts,
1591 std::vector<char> &Defines) const {
1592 Define(Defines, "MSP430");
1593 Define(Defines, "__MSP430__");
1594 // FIXME: defines for different 'flavours' of MCU
1595 }
1596 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1597 unsigned &NumRecords) const {
1598 // FIXME: Implement.
1599 Records = 0;
1600 NumRecords = 0;
1601 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001602 virtual void getGCCRegNames(const char * const *&Names,
1603 unsigned &NumNames) const;
1604 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1605 unsigned &NumAliases) const {
1606 // No aliases.
1607 Aliases = 0;
1608 NumAliases = 0;
1609 }
1610 virtual bool validateAsmConstraint(const char *&Name,
1611 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00001612 // No target constraints for now.
1613 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001614 }
1615 virtual const char *getClobbers() const {
1616 // FIXME: Is this really right?
1617 return "";
1618 }
1619 virtual const char *getVAListDeclaration() const {
1620 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00001621 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00001622 }
1623 };
1624
1625 const char * const MSP430TargetInfo::GCCRegNames[] = {
1626 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1627 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1628 };
1629
1630 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
1631 unsigned &NumNames) const {
1632 Names = GCCRegNames;
1633 NumNames = llvm::array_lengthof(GCCRegNames);
1634 }
1635}
1636
1637
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00001638namespace {
1639 class SystemZTargetInfo : public TargetInfo {
1640 static const char * const GCCRegNames[];
1641 public:
1642 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
1643 TLSSupported = false;
1644 IntWidth = IntAlign = 32;
1645 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
1646 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00001647 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
1648 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00001649 }
1650 virtual void getTargetDefines(const LangOptions &Opts,
1651 std::vector<char> &Defines) const {
1652 Define(Defines, "__s390__");
1653 Define(Defines, "__s390x__");
1654 }
1655 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1656 unsigned &NumRecords) const {
1657 // FIXME: Implement.
1658 Records = 0;
1659 NumRecords = 0;
1660 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00001661
1662 virtual void getDefaultLangOptions(LangOptions &Opts) {
1663 TargetInfo::getDefaultLangOptions(Opts);
1664 Opts.CharIsSigned = false;
1665 }
1666
1667 virtual void getGCCRegNames(const char * const *&Names,
1668 unsigned &NumNames) const;
1669 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1670 unsigned &NumAliases) const {
1671 // No aliases.
1672 Aliases = 0;
1673 NumAliases = 0;
1674 }
1675 virtual bool validateAsmConstraint(const char *&Name,
1676 TargetInfo::ConstraintInfo &info) const {
1677 // FIXME: implement
1678 return true;
1679 }
1680 virtual const char *getClobbers() const {
1681 // FIXME: Is this really right?
1682 return "";
1683 }
1684 virtual const char *getVAListDeclaration() const {
1685 // FIXME: implement
1686 return "typedef char* __builtin_va_list;";
1687 }
1688 };
1689
1690 const char * const SystemZTargetInfo::GCCRegNames[] = {
1691 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1692 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1693 };
1694
1695 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
1696 unsigned &NumNames) const {
1697 Names = GCCRegNames;
1698 NumNames = llvm::array_lengthof(GCCRegNames);
1699 }
1700}
1701
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00001702namespace {
1703 class BlackfinTargetInfo : public TargetInfo {
1704 static const char * const GCCRegNames[];
1705 public:
1706 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
1707 TLSSupported = false;
1708 DoubleAlign = 32;
1709 LongLongAlign = 32;
1710 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00001711 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00001712 }
1713
1714 virtual void getTargetDefines(const LangOptions &Opts,
1715 std::vector<char> &Defines) const {
1716 DefineStd(Defines, "bfin", Opts);
1717 DefineStd(Defines, "BFIN", Opts);
1718 Define(Defines, "__ADSPBLACKFIN__");
1719 // FIXME: This one is really dependent on -mcpu
1720 Define(Defines, "__ADSPLPBLACKFIN__");
1721 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
1722 }
1723
1724 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1725 unsigned &NumRecords) const {
1726 // FIXME: Implement.
1727 Records = 0;
1728 NumRecords = 0;
1729 }
1730
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00001731 virtual void getGCCRegNames(const char * const *&Names,
1732 unsigned &NumNames) const;
1733
1734 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1735 unsigned &NumAliases) const {
1736 // No aliases.
1737 Aliases = 0;
1738 NumAliases = 0;
1739 }
1740
1741 virtual bool validateAsmConstraint(const char *&Name,
1742 TargetInfo::ConstraintInfo &Info) const {
1743 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
1744 Info.setAllowsRegister();
1745 return true;
1746 }
1747 return false;
1748 }
1749
1750 virtual const char *getClobbers() const {
1751 return "";
1752 }
1753
1754 virtual const char *getVAListDeclaration() const {
1755 return "typedef char* __builtin_va_list;";
1756 }
1757 };
1758
1759 const char * const BlackfinTargetInfo::GCCRegNames[] = {
1760 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1761 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
1762 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
1763 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
1764 "a0", "a1", "cc",
1765 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
1766 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
1767 };
1768
1769 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
1770 unsigned &NumNames) const {
1771 Names = GCCRegNames;
1772 NumNames = llvm::array_lengthof(GCCRegNames);
1773 }
1774}
1775
Eli Friedmana9c3d712009-08-19 20:47:07 +00001776namespace {
1777
Mike Stump11289f42009-09-09 15:08:12 +00001778 // LLVM and Clang cannot be used directly to output native binaries for
1779 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00001780 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00001781 //
1782 // TCE uses the llvm bitcode as input and uses it for generating customized
1783 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00001784 // publicly available in http://tce.cs.tut.fi
1785
1786 class TCETargetInfo : public TargetInfo{
1787 public:
1788 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
1789 TLSSupported = false;
1790 IntWidth = 32;
1791 LongWidth = LongLongWidth = 32;
1792 IntMaxTWidth = 32;
1793 PointerWidth = 32;
1794 IntAlign = 32;
1795 LongAlign = LongLongAlign = 32;
1796 PointerAlign = 32;
1797 SizeType = UnsignedInt;
1798 IntMaxType = SignedLong;
1799 UIntMaxType = UnsignedLong;
1800 IntPtrType = SignedInt;
1801 PtrDiffType = SignedInt;
1802 FloatWidth = 32;
1803 FloatAlign = 32;
1804 DoubleWidth = 32;
1805 DoubleAlign = 32;
1806 LongDoubleWidth = 32;
1807 LongDoubleAlign = 32;
1808 FloatFormat = &llvm::APFloat::IEEEsingle;
1809 DoubleFormat = &llvm::APFloat::IEEEsingle;
1810 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
1811 DescriptionString = "E-p:32:32:32-a0:32:32"
1812 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001813 "-f32:32:32-f64:32:64-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00001814 }
1815
1816 virtual void getTargetDefines(const LangOptions &Opts,
1817 std::vector<char> &Defines) const {
1818 DefineStd(Defines, "tce", Opts);
1819 Define(Defines, "__TCE__");
1820 Define(Defines, "__TCE_V1__");
1821 }
1822 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1823 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00001824 virtual const char *getClobbers() const {
1825 return "";
1826 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00001827 virtual const char *getVAListDeclaration() const {
1828 return "typedef void* __builtin_va_list;";
1829 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00001830 virtual void getGCCRegNames(const char * const *&Names,
1831 unsigned &NumNames) const {}
1832 virtual bool validateAsmConstraint(const char *&Name,
1833 TargetInfo::ConstraintInfo &info) const {
1834 return true;
1835 }
1836 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1837 unsigned &NumAliases) const {}
1838 };
1839}
1840
Chris Lattner5ba61f02006-10-14 07:39:34 +00001841//===----------------------------------------------------------------------===//
1842// Driver code
1843//===----------------------------------------------------------------------===//
1844
Chris Lattner855d0242008-03-05 01:18:20 +00001845/// CreateTargetInfo - Return the target info object for the specified target
1846/// triple.
1847TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00001848 llvm::Triple Triple(T);
1849 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00001850
Daniel Dunbar52322032009-08-18 05:47:58 +00001851 switch (Triple.getArch()) {
1852 default:
1853 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00001854
Daniel Dunbar52322032009-08-18 05:47:58 +00001855 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00001856 case llvm::Triple::thumb:
Daniel Dunbar52322032009-08-18 05:47:58 +00001857 switch (os) {
1858 case llvm::Triple::Darwin:
Eli Friedman873f65a2008-08-21 00:13:15 +00001859 return new DarwinARMTargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001860 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001861 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001862 default:
1863 return new ARMTargetInfo(T);
1864 }
Eli Friedmanb5366062008-05-20 14:21:01 +00001865
Daniel Dunbar52322032009-08-18 05:47:58 +00001866 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00001867 return new BlackfinTargetInfo(T);
1868
Daniel Dunbar52322032009-08-18 05:47:58 +00001869 case llvm::Triple::msp430:
1870 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00001871
Daniel Dunbar52322032009-08-18 05:47:58 +00001872 case llvm::Triple::pic16:
1873 return new PIC16TargetInfo(T);
1874
1875 case llvm::Triple::ppc:
1876 if (os == llvm::Triple::Darwin)
1877 return new DarwinTargetInfo<PPCTargetInfo>(T);
1878 return new PPC32TargetInfo(T);
1879
1880 case llvm::Triple::ppc64:
1881 if (os == llvm::Triple::Darwin)
1882 return new DarwinTargetInfo<PPC64TargetInfo>(T);
1883 return new PPC64TargetInfo(T);
1884
1885 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00001886 if (os == llvm::Triple::AuroraUX)
1887 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001888 if (os == llvm::Triple::Solaris)
1889 return new SolarisSparcV8TargetInfo(T);
1890 return new SparcV8TargetInfo(T);
1891
1892 case llvm::Triple::systemz:
1893 return new SystemZTargetInfo(T);
1894
Eli Friedmana9c3d712009-08-19 20:47:07 +00001895 case llvm::Triple::tce:
1896 return new TCETargetInfo(T);
1897
Daniel Dunbar52322032009-08-18 05:47:58 +00001898 case llvm::Triple::x86:
1899 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00001900 case llvm::Triple::AuroraUX:
1901 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001902 case llvm::Triple::Darwin:
1903 return new DarwinI386TargetInfo(T);
1904 case llvm::Triple::Linux:
1905 return new LinuxTargetInfo<X86_32TargetInfo>(T);
1906 case llvm::Triple::DragonFly:
1907 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
1908 case llvm::Triple::NetBSD:
1909 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
1910 case llvm::Triple::OpenBSD:
1911 return new OpenBSDI386TargetInfo(T);
1912 case llvm::Triple::FreeBSD:
1913 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
1914 case llvm::Triple::Solaris:
1915 return new SolarisTargetInfo<X86_32TargetInfo>(T);
1916 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001917 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001918 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001919 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001920 case llvm::Triple::Win32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001921 return new VisualStudioWindowsX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001922 default:
1923 return new X86_32TargetInfo(T);
1924 }
1925
1926 case llvm::Triple::x86_64:
1927 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00001928 case llvm::Triple::AuroraUX:
1929 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001930 case llvm::Triple::Darwin:
1931 return new DarwinX86_64TargetInfo(T);
1932 case llvm::Triple::Linux:
1933 return new LinuxTargetInfo<X86_64TargetInfo>(T);
1934 case llvm::Triple::NetBSD:
1935 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
1936 case llvm::Triple::OpenBSD:
1937 return new OpenBSDX86_64TargetInfo(T);
1938 case llvm::Triple::FreeBSD:
1939 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
1940 case llvm::Triple::Solaris:
1941 return new SolarisTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001942 case llvm::Triple::MinGW64:
1943 return new MinGWX86_64TargetInfo(T);
1944 case llvm::Triple::Win32: // This is what Triple.h supports now.
1945 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00001946 default:
1947 return new X86_64TargetInfo(T);
1948 }
1949 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001950}