blob: 4ee377e27557427a73760683f72b4aa37dfd2813 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikove7772382009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek38591a22007-12-12 18:05:32 +000011// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner99ca9d62009-06-14 01:05:48 +000015#include "clang/Basic/Builtins.h"
16#include "clang/Basic/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000017#include "clang/Basic/TargetInfo.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Eli Friedmand4011892008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000020#include "llvm/ADT/STLExtras.h"
Chris Lattnerc345a802009-03-20 16:06:38 +000021#include "llvm/ADT/SmallString.h"
Daniel Dunbar0433a022009-08-19 20:04:03 +000022#include "llvm/ADT/StringRef.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000023#include "llvm/ADT/StringSwitch.h"
Chris Lattnerf54f2212009-08-12 06:24:27 +000024#include "llvm/ADT/Triple.h"
Chris Lattner43954312009-08-10 19:03:04 +000025#include "llvm/MC/MCSectionMachO.h"
Chris Lattner4b009652007-07-25 00:24:17 +000026using namespace clang;
27
Chris Lattner4b009652007-07-25 00:24:17 +000028//===----------------------------------------------------------------------===//
29// Common code shared among targets.
30//===----------------------------------------------------------------------===//
31
Daniel Dunbar0433a022009-08-19 20:04:03 +000032static void Define(std::vector<char> &Buf, const llvm::StringRef &Macro,
33 const llvm::StringRef &Val = "1") {
Chris Lattner0db667a2007-10-06 06:57:34 +000034 const char *Def = "#define ";
35 Buf.insert(Buf.end(), Def, Def+strlen(Def));
Daniel Dunbar0433a022009-08-19 20:04:03 +000036 Buf.insert(Buf.end(), Macro.begin(), Macro.end());
Chris Lattner0db667a2007-10-06 06:57:34 +000037 Buf.push_back(' ');
Daniel Dunbar0433a022009-08-19 20:04:03 +000038 Buf.insert(Buf.end(), Val.begin(), Val.end());
Chris Lattner0db667a2007-10-06 06:57:34 +000039 Buf.push_back('\n');
40}
41
Chris Lattnerc345a802009-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 Korobeynikove7772382009-05-03 13:42:53 +000045static void DefineStd(std::vector<char> &Buf, const char *MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000046 const LangOptions &Opts) {
47 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000048
Chris Lattnerc345a802009-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 Korobeynikove7772382009-05-03 13:42:53 +000053
Chris Lattnerc345a802009-03-20 16:06:38 +000054 // Define __unix.
55 llvm::SmallString<20> TmpStr;
56 TmpStr = "__";
57 TmpStr += MacroName;
Daniel Dunbar0433a022009-08-19 20:04:03 +000058 Define(Buf, TmpStr.str());
Anton Korobeynikove7772382009-05-03 13:42:53 +000059
Chris Lattnerc345a802009-03-20 16:06:38 +000060 // Define __unix__.
61 TmpStr += "__";
Daniel Dunbar0433a022009-08-19 20:04:03 +000062 Define(Buf, TmpStr.str());
Chris Lattnerc345a802009-03-20 16:06:38 +000063}
64
Chris Lattnerbd00eb82008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner43954312009-08-10 19:03:04 +000068
Edwin Török36565e52009-06-30 17:10:35 +000069namespace {
Douglas Gregor937331f2009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Edwin Török36565e52009-06-30 17:10:35 +000072protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-06-30 17:10:35 +000074 std::vector<char> &Defines) const=0;
75public:
Douglas Gregor937331f2009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Edwin Török36565e52009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
78 std::vector<char> &Defines) const {
Douglas Gregor937331f2009-07-01 15:12:53 +000079 TgtInfo::getTargetDefines(Opts, Defines);
Daniel Dunbar608b3882009-08-24 09:10:05 +000080 getOSDefines(Opts, TgtInfo::getTriple(), Defines);
Edwin Török2d98f9f2009-06-30 17:00:25 +000081 }
Edwin Török36565e52009-06-30 17:10:35 +000082
83};
Chris Lattnerf54f2212009-08-12 06:24:27 +000084} // end anonymous namespace
Edwin Török2d98f9f2009-06-30 17:00:25 +000085
Chris Lattner43954312009-08-10 19:03:04 +000086
Daniel Dunbar93f64532009-04-10 19:52:24 +000087static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
Chris Lattner59122202009-06-23 00:43:21 +000088 Define(Defs, "__APPLE_CC__", "5621");
Eli Friedman872996c2008-08-20 02:34:37 +000089 Define(Defs, "__APPLE__");
90 Define(Defs, "__MACH__");
Chris Lattner8405e092009-02-05 07:19:24 +000091 Define(Defs, "OBJC_NEW_PROPERTIES");
Anton Korobeynikove7772382009-05-03 13:42:53 +000092
Chris Lattner8181e622009-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 Korobeynikove7772382009-05-03 13:42:53 +000095
Chris Lattner8181e622009-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 Lattner33854aa2009-04-07 04:48:21 +000098 Define(Defs, "__strong", "");
Chris Lattner8181e622009-04-07 16:50:40 +000099 else
Chris Lattner33854aa2009-04-07 04:48:21 +0000100 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmaneff0a422009-06-04 23:00:29 +0000101
102 if (Opts.Static)
103 Define(Defs, "__STATIC__");
104 else
105 Define(Defs, "__DYNAMIC__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000106
107 if (Opts.POSIXThreads)
108 Define(Defs, "_REENTRANT", "1");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000109}
110
Daniel Dunbar608b3882009-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 Lattnerf54f2212009-08-12 06:24:27 +0000114 return;
Mike Stump25cf7602009-09-09 15:08:12 +0000115
Chris Lattnerc5dc8eb2008-09-30 01:00:25 +0000116 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000117 unsigned Maj, Min, Rev;
Daniel Dunbar608b3882009-08-24 09:10:05 +0000118 Triple.getDarwinNumber(Maj, Min, Rev);
Mike Stump25cf7602009-09-09 15:08:12 +0000119
Chris Lattnerf54f2212009-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 Dunbar93f64532009-04-10 19:52:24 +0000124 }
Chris Lattnerf54f2212009-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 Dunbar93f64532009-04-10 19:52:24 +0000130}
131
Anton Korobeynikove7772382009-05-03 13:42:53 +0000132static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
Daniel Dunbar608b3882009-08-24 09:10:05 +0000133 const llvm::Triple &Triple) {
134 if (Triple.getOS() != llvm::Triple::Darwin)
Chris Lattnerf54f2212009-08-12 06:24:27 +0000135 return;
Mike Stump25cf7602009-09-09 15:08:12 +0000136
Daniel Dunbar93f64532009-04-10 19:52:24 +0000137 // Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
138 unsigned Maj, Min, Rev;
Daniel Dunbar608b3882009-08-24 09:10:05 +0000139 Triple.getDarwinNumber(Maj, Min, Rev);
Mike Stump25cf7602009-09-09 15:08:12 +0000140
Chris Lattnerf54f2212009-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 Lattnerc5dc8eb2008-09-30 01:00:25 +0000147 }
Chris Lattnerf54f2212009-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 Friedman872996c2008-08-20 02:34:37 +0000153}
Chris Lattner4b009652007-07-25 00:24:17 +0000154
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000155/// GetDarwinLanguageOptions - Set the default language options for darwin.
156static void GetDarwinLanguageOptions(LangOptions &Opts,
Daniel Dunbar608b3882009-08-24 09:10:05 +0000157 const llvm::Triple &Triple) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000158 Opts.NeXTRuntime = true;
Mike Stump25cf7602009-09-09 15:08:12 +0000159
Daniel Dunbar608b3882009-08-24 09:10:05 +0000160 if (Triple.getOS() != llvm::Triple::Darwin)
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000161 return;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000162
Daniel Dunbar608b3882009-08-24 09:10:05 +0000163 unsigned MajorVersion = Triple.getDarwinMajorNumber();
Chris Lattnerf54f2212009-08-12 06:24:27 +0000164
Bill Wendlinge1d4f5d2009-06-28 07:36:13 +0000165 // Blocks and stack protectors default to on for 10.6 (darwin10) and beyond.
Chris Lattnerf54f2212009-08-12 06:24:27 +0000166 if (MajorVersion > 9) {
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000167 Opts.Blocks = 1;
Bill Wendling39e99a42009-06-28 23:01:01 +0000168 Opts.setStackProtectorMode(LangOptions::SSPOn);
Bill Wendlinge1d4f5d2009-06-28 07:36:13 +0000169 }
Fariborz Jahanian27f58962009-02-24 23:34:44 +0000170
Bill Wendlinge1d4f5d2009-06-28 07:36:13 +0000171 // Non-fragile ABI (in 64-bit mode) default to on for 10.5 (darwin9) and
172 // beyond.
Chris Lattnerf54f2212009-08-12 06:24:27 +0000173 if (MajorVersion >= 9 && Opts.ObjC1 &&
Daniel Dunbar608b3882009-08-24 09:10:05 +0000174 Triple.getArch() == llvm::Triple::x86_64)
Fariborz Jahanian72efecb2009-02-24 23:38:42 +0000175 Opts.ObjCNonFragileABI = 1;
Chris Lattnerd7bc88b2008-12-04 23:20:07 +0000176}
177
Chris Lattner43954312009-08-10 19:03:04 +0000178namespace {
Edwin Török36565e52009-06-30 17:10:35 +0000179template<typename Target>
180class DarwinTargetInfo : public OSTargetInfo<Target> {
181protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000182 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-06-30 17:10:35 +0000183 std::vector<char> &Defines) const {
184 getDarwinDefines(Defines, Opts);
185 getDarwinOSXDefines(Defines, Triple);
186 }
Mike Stump25cf7602009-09-09 15:08:12 +0000187
Edwin Török36565e52009-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 Dunbar608b3882009-08-24 09:10:05 +0000193 GetDarwinLanguageOptions(Opts, TargetInfo::getTriple());
Edwin Török36565e52009-06-30 17:10:35 +0000194 }
195public:
196 DarwinTargetInfo(const std::string& triple) :
197 OSTargetInfo<Target>(triple) {
198 this->TLSSupported = false;
199 }
200
Edwin Török36565e52009-06-30 17:10:35 +0000201 virtual const char *getUnicodeStringSection() const {
202 return "__TEXT,__ustring";
203 }
Mike Stump25cf7602009-09-09 15:08:12 +0000204
Chris Lattner43954312009-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 }
Edwin Török36565e52009-06-30 17:10:35 +0000212};
213
Chris Lattner43954312009-08-10 19:03:04 +0000214
Edwin Török36565e52009-06-30 17:10:35 +0000215// DragonFlyBSD Target
216template<typename Target>
217class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
218protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000219 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-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 Stump25cf7602009-09-09 15:08:12 +0000230 DragonFlyBSDTargetInfo(const std::string &triple)
Edwin Török36565e52009-06-30 17:10:35 +0000231 : OSTargetInfo<Target>(triple) {}
232};
233
234// FreeBSD Target
235template<typename Target>
236class FreeBSDTargetInfo : public OSTargetInfo<Target> {
237protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000238 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-06-30 17:10:35 +0000239 std::vector<char> &Defs) const {
240 // FreeBSD defines; list based off of gcc output
241
Daniel Dunbar608b3882009-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");
Edwin Török36565e52009-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 Stump25cf7602009-09-09 15:08:12 +0000258 FreeBSDTargetInfo(const std::string &triple)
Duncan Sandscd2cb662009-07-08 13:55:08 +0000259 : OSTargetInfo<Target>(triple) {
260 this->UserLabelPrefix = "";
261 }
Edwin Török36565e52009-06-30 17:10:35 +0000262};
263
264// Linux target
265template<typename Target>
266class LinuxTargetInfo : public OSTargetInfo<Target> {
267protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000268 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-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 Dunbar62a7cbc2009-09-03 04:54:28 +0000275 if (Opts.POSIXThreads)
276 Define(Defs, "_REENTRANT", "1");
Edwin Török36565e52009-06-30 17:10:35 +0000277 }
278public:
Mike Stump25cf7602009-09-09 15:08:12 +0000279 LinuxTargetInfo(const std::string& triple)
Edwin Török36565e52009-06-30 17:10:35 +0000280 : OSTargetInfo<Target>(triple) {
281 this->UserLabelPrefix = "";
282 }
283};
284
Chris Lattner25fff082009-07-13 20:29:08 +0000285// NetBSD Target
286template<typename Target>
287class NetBSDTargetInfo : public OSTargetInfo<Target> {
288protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Chris Lattner25fff082009-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 Dunbar62a7cbc2009-09-03 04:54:28 +0000295 if (Opts.POSIXThreads)
296 Define(Defs, "_POSIX_THREADS", "1");
Chris Lattner25fff082009-07-13 20:29:08 +0000297 }
298public:
Mike Stump25cf7602009-09-09 15:08:12 +0000299 NetBSDTargetInfo(const std::string &triple)
Chris Lattner25fff082009-07-13 20:29:08 +0000300 : OSTargetInfo<Target>(triple) {
301 this->UserLabelPrefix = "";
302 }
303};
304
Edwin Török36565e52009-06-30 17:10:35 +0000305// OpenBSD Target
306template<typename Target>
307class OpenBSDTargetInfo : public OSTargetInfo<Target> {
308protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000309 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-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 Dunbar62a7cbc2009-09-03 04:54:28 +0000316 if (Opts.POSIXThreads)
317 Define(Defs, "_POSIX_THREADS", "1");
Edwin Török36565e52009-06-30 17:10:35 +0000318 }
319public:
Mike Stump25cf7602009-09-09 15:08:12 +0000320 OpenBSDTargetInfo(const std::string &triple)
Edwin Török36565e52009-06-30 17:10:35 +0000321 : OSTargetInfo<Target>(triple) {}
322};
323
Edward O'Callaghan0a7ef9a2009-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
Edwin Török36565e52009-06-30 17:10:35 +0000345// Solaris target
346template<typename Target>
347class SolarisTargetInfo : public OSTargetInfo<Target> {
348protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000349 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-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 Stump25cf7602009-09-09 15:08:12 +0000358 SolarisTargetInfo(const std::string& triple)
Edwin Török36565e52009-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 Stump25cf7602009-09-09 15:08:12 +0000365} // end anonymous namespace.
Edwin Török36565e52009-06-30 17:10:35 +0000366
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000367//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000368// Specific target implementations.
369//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000370
Eli Friedmanfd5a4122008-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 Friedmand9389be2009-06-05 07:05:05 +0000379 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
380
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000381 virtual void getTargetBuiltins(const Builtin::Info *&Records,
382 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000383 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000384 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000385 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000386
Chris Lattner79682402009-03-20 15:52:06 +0000387 virtual void getTargetDefines(const LangOptions &Opts,
388 std::vector<char> &Defines) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000389
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000390 virtual const char *getVAListDeclaration() const {
Chris Lattnera07708f2008-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 Friedmanfd5a4122008-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 Lattnera07708f2008-10-27 01:11:29 +0000399 "} __builtin_va_list[1];";*/
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000400 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000401 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000402 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000403 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000404 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +0000405 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000406 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000407 switch (*Name) {
Anders Carlsson4ce42302007-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 Lattnerc49cc1a2009-04-26 07:16:29 +0000413 Info.setAllowsRegister();
Anders Carlsson4ce42302007-11-27 04:11:28 +0000414 return true;
415 }
416 }
Eli Friedmand9389be2009-06-05 07:05:05 +0000417 virtual void getDefaultLangOptions(LangOptions &Opts) {
418 TargetInfo::getDefaultLangOptions(Opts);
419 Opts.CharIsSigned = false;
420 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000421 virtual const char *getClobbers() const {
422 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000423 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000424};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000425
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000426const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-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 Lattner99ca9d62009-06-14 01:05:48 +0000429#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000430};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000431
432
Chris Lattnerbef1d722009-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 Lattner79682402009-03-20 15:52:06 +0000435void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
436 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-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 Korobeynikove7772382009-05-03 13:42:53 +0000449
Chris Lattnerbef1d722009-03-02 22:27:17 +0000450 // Target properties.
451 Define(Defs, "_BIG_ENDIAN");
452 Define(Defs, "__BIG_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000453
Chris Lattnerbef1d722009-03-02 22:27:17 +0000454 // Subtarget options.
455 Define(Defs, "__NATURAL_ALIGNMENT__");
456 Define(Defs, "__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000457
Chris Lattnerbef1d722009-03-02 22:27:17 +0000458 // FIXME: Should be controlled by command line option.
459 Define(Defs, "__LONG_DOUBLE_128__");
460}
461
Chris Lattner9fd73612008-04-21 18:56:49 +0000462
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000463const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-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 Friedmanfd5a4122008-08-20 23:11:40 +0000472 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +0000473 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000474 "xer",
Chris Lattner14d2bb72009-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 Friedmanfd5a4122008-08-20 23:11:40 +0000479 "vrsave", "vscr",
480 "spe_acc", "spefscr",
481 "sfp"
482};
Chris Lattner4b009652007-07-25 00:24:17 +0000483
Anton Korobeynikove7772382009-05-03 13:42:53 +0000484void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000485 unsigned &NumNames) const {
486 Names = GCCRegNames;
487 NumNames = llvm::array_lengthof(GCCRegNames);
488}
Chris Lattner4b009652007-07-25 00:24:17 +0000489
Eli Friedmanfd5a4122008-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 Dunbar40b774e2009-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 Stump369c21c2009-09-17 21:15:00 +0000535 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-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 Friedmanfd5a4122008-08-20 23:11:40 +0000558};
559
Anton Korobeynikove7772382009-05-03 13:42:53 +0000560void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000561 unsigned &NumAliases) const {
562 Aliases = GCCRegAliases;
563 NumAliases = llvm::array_lengthof(GCCRegAliases);
564}
565} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000566
567namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000568class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000569public:
Eli Friedman2b161652008-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 Lattner2e17d912009-11-07 18:59:41 +0000572 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Eli Friedman2b161652008-08-21 00:13:15 +0000573 }
Chris Lattner4b009652007-07-25 00:24:17 +0000574};
575} // end anonymous namespace.
576
577namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000578class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000579public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000580 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000581 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +0000582 IntMaxType = SignedLong;
583 UIntMaxType = UnsignedLong;
584 Int64Type = SignedLong;
Eli Friedman2b161652008-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 Lattner2e17d912009-11-07 18:59:41 +0000586 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnere5fde952008-05-09 06:17:04 +0000587 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000588};
589} // end anonymous namespace.
590
Chris Lattner4b009652007-07-25 00:24:17 +0000591namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000592// Namespace for x86 abstract base class
593const Builtin::Info BuiltinInfo[] = {
Douglas Gregor2e8a7aa2009-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 Lattner99ca9d62009-06-14 01:05:48 +0000596#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +0000597};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000598
Eli Friedman872996c2008-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 Lattner715fe4c2009-03-02 22:40:39 +0000623 enum X86SSEEnum {
624 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
625 } SSELevel;
Eli Friedman872996c2008-08-20 02:34:37 +0000626public:
Anton Korobeynikove7772382009-05-03 13:42:53 +0000627 X86TargetInfo(const std::string& triple)
Daniel Dunbar07181d72009-05-06 03:16:41 +0000628 : TargetInfo(triple), SSELevel(NoMMXSSE) {
Eli Friedman872996c2008-08-20 02:34:37 +0000629 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000630 }
631 virtual void getTargetBuiltins(const Builtin::Info *&Records,
632 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000633 Records = BuiltinInfo;
634 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000635 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000636 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000637 unsigned &NumNames) const {
638 Names = GCCRegNames;
639 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000640 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000641 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000642 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000643 Aliases = GCCRegAliases;
644 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000645 }
Anders Carlsson36834a72009-02-28 17:11:49 +0000646 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +0000647 TargetInfo::ConstraintInfo &info) const;
648 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000649 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000650 return "~{dirflag},~{fpsr},~{flags}";
651 }
Chris Lattner79682402009-03-20 15:52:06 +0000652 virtual void getTargetDefines(const LangOptions &Opts,
653 std::vector<char> &Defines) const;
Daniel Dunbar0838f962009-05-06 21:07:50 +0000654 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
655 const std::string &Name,
656 bool Enabled) const;
Mike Stump25cf7602009-09-09 15:08:12 +0000657 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar0838f962009-05-06 21:07:50 +0000658 llvm::StringMap<bool> &Features) const;
Daniel Dunbar8dd8f262009-11-11 09:38:56 +0000659 virtual void HandleTargetFeatures(const std::vector<std::string> &Features);
Chris Lattner4b009652007-07-25 00:24:17 +0000660};
Chris Lattner7d6220c2009-03-02 22:20:04 +0000661
Mike Stump25cf7602009-09-09 15:08:12 +0000662void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar0838f962009-05-06 21:07:50 +0000663 llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-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 Korobeynikove7772382009-05-03 13:42:53 +0000674
Daniel Dunbar07181d72009-05-06 03:16:41 +0000675 // LLVM does not currently recognize this.
676 // Features["sse4a"] = false;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000677
Daniel Dunbar07181d72009-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 Dunbarc2e55de2009-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 Stump25cf7602009-09-09 15:08:12 +0000706 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarc2e55de2009-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 Stump25cf7602009-09-09 15:08:12 +0000715 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +0000716 setFeatureEnabled(Features, "3dnowa", true);
717 } else if (CPU == "c3-2")
718 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar07181d72009-05-06 03:16:41 +0000719}
720
Daniel Dunbar0838f962009-05-06 21:07:50 +0000721bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump25cf7602009-09-09 15:08:12 +0000722 const std::string &Name,
Daniel Dunbar0838f962009-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 Stump25cf7602009-09-09 15:08:12 +0000736 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +0000737 Features["sse3"] = true;
738 else if (Name == "ssse3")
Mike Stump25cf7602009-09-09 15:08:12 +0000739 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +0000740 Features["ssse3"] = true;
741 else if (Name == "sse4")
Mike Stump25cf7602009-09-09 15:08:12 +0000742 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-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 Stump25cf7602009-09-09 15:08:12 +0000750 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +0000751 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
752 else if (Name == "sse")
Mike Stump25cf7602009-09-09 15:08:12 +0000753 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +0000754 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
755 else if (Name == "sse2")
Mike Stump25cf7602009-09-09 15:08:12 +0000756 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +0000757 Features["sse41"] = Features["sse42"] = false;
758 else if (Name == "sse3")
Mike Stump25cf7602009-09-09 15:08:12 +0000759 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar0838f962009-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 Dunbar07181d72009-05-06 03:16:41 +0000774/// HandleTargetOptions - Perform initialization based on the user
775/// configured set of features.
Daniel Dunbar8dd8f262009-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 Lattner7d6220c2009-03-02 22:20:04 +0000795}
Chris Lattnerbef1d722009-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 Lattner79682402009-03-20 15:52:06 +0000799void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
800 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-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 Lattnerbef1d722009-03-02 22:27:17 +0000809 } else {
Chris Lattnerc345a802009-03-20 16:06:38 +0000810 DefineStd(Defs, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +0000811 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000812
Chris Lattnerbef1d722009-03-02 22:27:17 +0000813 // Target properties.
814 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000815
Chris Lattnerbef1d722009-03-02 22:27:17 +0000816 // Subtarget options.
817 Define(Defs, "__nocona");
818 Define(Defs, "__nocona__");
819 Define(Defs, "__tune_nocona__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000820 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +0000821
Chris Lattner25ac1c12009-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 Korobeynikove7772382009-05-03 13:42:53 +0000826
Chris Lattner715fe4c2009-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 Lattnerbef1d722009-03-02 22:27:17 +0000848}
Anton Korobeynikove7772382009-05-03 13:42:53 +0000849
850
Eli Friedman872996c2008-08-20 02:34:37 +0000851bool
Anders Carlsson36834a72009-02-28 17:11:49 +0000852X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000853 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000854 switch (*Name) {
Eli Friedman872996c2008-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 Carlsson2285e622008-10-06 00:41:45 +0000866 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +0000867 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +0000868 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikove7772382009-05-03 13:42:53 +0000869 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +0000870 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +0000871 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +0000872 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +0000873 case 'N': // unsigned 8-bit integer constant for use with in and out
874 // instructions.
Eli Friedman7e17aed2009-06-08 20:45:44 +0000875 case 'R': // "legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000876 Info.setAllowsRegister();
Eli Friedman872996c2008-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 Friedman872996c2008-08-20 02:34:37 +0000898} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000899
900namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000901// X86-32 generic target
902class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000903public:
Eli Friedman872996c2008-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 Friedman2b161652008-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 Lattner2e17d912009-11-07 18:59:41 +0000910 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman04ede302009-03-29 20:31:09 +0000911 SizeType = UnsignedInt;
912 PtrDiffType = SignedInt;
913 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +0000914 RegParmMax = 3;
Eli Friedman872996c2008-08-20 02:34:37 +0000915 }
916 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000917 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000918 }
Chris Lattneraa339182009-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 Friedman872996c2008-08-20 02:34:37 +0000925};
926} // end anonymous namespace
927
928namespace {
Eli Friedman1c79f4b2009-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 Friedman96ada022009-07-05 22:31:18 +0000935 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +0000936 }
937};
938} // end anonymous namespace
939
940namespace {
Edwin Török36565e52009-06-30 17:10:35 +0000941class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +0000942public:
Edwin Török36565e52009-06-30 17:10:35 +0000943 DarwinI386TargetInfo(const std::string& triple) :
944 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman872996c2008-08-20 02:34:37 +0000945 LongDoubleWidth = 128;
946 LongDoubleAlign = 128;
Eli Friedman04ede302009-03-29 20:31:09 +0000947 SizeType = UnsignedLong;
948 IntPtrType = SignedLong;
Eli Friedman2b161652008-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 Lattner2e17d912009-11-07 18:59:41 +0000951 "a0:0:64-f80:128:128-n8:16:32";
Edwin Török2d98f9f2009-06-30 17:00:25 +0000952 }
953
Eli Friedman872996c2008-08-20 02:34:37 +0000954};
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000955} // end anonymous namespace
956
957namespace {
Eli Friedman23cb7912008-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 Friedman8f575172009-04-19 21:38:35 +0000963 TLSSupported = false;
Chris Lattnera8a69e12009-06-24 17:12:15 +0000964 WCharType = UnsignedShort;
Eli Friedman6b6ca942009-06-08 06:11:14 +0000965 WCharWidth = WCharAlign = 16;
Eli Friedmanb28055e2009-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 Lattner2e17d912009-11-07 18:59:41 +0000969 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman23cb7912008-08-21 01:40:19 +0000970 }
Chris Lattner79682402009-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 Friedman23cb7912008-08-21 01:40:19 +0000974 // This list is based off of the the list of things MingW defines
Eli Friedman23cb7912008-08-21 01:40:19 +0000975 Define(Defines, "_WIN32");
Chris Lattnerc345a802009-03-20 16:06:38 +0000976 DefineStd(Defines, "WIN32", Opts);
977 DefineStd(Defines, "WINNT", Opts);
Eli Friedman23cb7912008-08-21 01:40:19 +0000978 Define(Defines, "_X86_");
Eli Friedman23cb7912008-08-21 01:40:19 +0000979 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +0000980};
981} // end anonymous namespace
Eli Friedman6b6ca942009-06-08 06:11:14 +0000982
Daniel Dunbar8d8e9d62009-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 Friedman6b6ca942009-06-08 06:11:14 +00001004 virtual void getDefaultLangOptions(LangOptions &Opts) {
Daniel Dunbar8d8e9d62009-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__");
Cédric Venet2c16e4e2009-09-27 10:09:11 +00001023 Define(Defines, "__declspec", "__declspec");
Daniel Dunbar8d8e9d62009-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 Lattner2e17d912009-11-07 18:59:41 +00001040 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar8d8e9d62009-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 Friedman6b6ca942009-06-08 06:11:14 +00001048 }
Eli Friedman23cb7912008-08-21 01:40:19 +00001049};
1050} // end anonymous namespace
1051
1052namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001053// x86-64 generic target
1054class X86_64TargetInfo : public X86TargetInfo {
1055public:
Chris Lattner79682402009-03-20 15:52:06 +00001056 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001057 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001058 LongDoubleWidth = 128;
1059 LongDoubleAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00001060 IntMaxType = SignedLong;
1061 UIntMaxType = UnsignedLong;
Eli Friedman38e31802009-07-01 03:36:11 +00001062 Int64Type = SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00001063 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00001064
Eli Friedman2b161652008-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 Lattner2e17d912009-11-07 18:59:41 +00001067 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Chris Lattner4b009652007-07-25 00:24:17 +00001068 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00001069 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-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 Friedman3c79eee2009-07-03 00:45:06 +00001075 "} __va_list_tag;"
1076 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001077 }
Chris Lattneraa339182009-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 Friedman872996c2008-08-20 02:34:37 +00001084};
1085} // end anonymous namespace
1086
1087namespace {
Daniel Dunbar8d8e9d62009-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 Stump4da7a162009-10-08 23:00:00 +00001096 LongWidth = LongAlign = 32;
Daniel Dunbar8d8e9d62009-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 Friedman38e31802009-07-01 03:36:11 +00001144class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1145public:
Mike Stump25cf7602009-09-09 15:08:12 +00001146 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman38e31802009-07-01 03:36:11 +00001147 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1148 Int64Type = SignedLongLong;
1149 }
1150};
1151} // end anonymous namespace
1152
1153namespace {
Eli Friedman96ada022009-07-05 22:31:18 +00001154class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1155public:
Mike Stump25cf7602009-09-09 15:08:12 +00001156 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman96ada022009-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 Friedmanbe727fe2008-08-20 07:44:10 +00001166class ARMTargetInfo : public TargetInfo {
Mike Stumpf90a29f2009-04-08 02:07:04 +00001167 enum {
1168 Armv4t,
1169 Armv5,
1170 Armv6,
Mike Stump4e21ba42009-08-04 19:48:52 +00001171 Armv7a,
Mike Stumpf90a29f2009-04-08 02:07:04 +00001172 XScale
1173 } ArmArch;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001174
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001175 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1176 static const char * const GCCRegNames[];
1177
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001178 std::string ABI;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001179 bool IsThumb;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001180
Chris Lattner9fd73612008-04-21 18:56:49 +00001181public:
Daniel Dunbarf0156562009-09-17 16:21:10 +00001182 ARMTargetInfo(const std::string &TripleStr)
1183 : TargetInfo(TripleStr), ABI("aapcs-linux"), IsThumb(false)
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001184 {
Daniel Dunbarf0156562009-09-17 16:21:10 +00001185 llvm::Triple Triple(TripleStr);
1186
Daniel Dunbarb9531632009-09-14 00:02:24 +00001187 SizeType = UnsignedInt;
1188 PtrDiffType = SignedInt;
Daniel Dunbarf0156562009-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 Stump4e21ba42009-08-04 19:48:52 +00001198 ArmArch = Armv7a;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001199 else if (Version.empty() || Version == "v6" || Version == "v6t2")
Mike Stumpf90a29f2009-04-08 02:07:04 +00001200 ArmArch = Armv6;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001201 else if (Version == "v5")
Mike Stumpf90a29f2009-04-08 02:07:04 +00001202 ArmArch = Armv5;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001203 else if (Version == "v4t")
Mike Stumpf90a29f2009-04-08 02:07:04 +00001204 ArmArch = Armv4t;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001205 else if (Arch == "xscale" || Arch == "thumbv5e")
Mike Stumpf90a29f2009-04-08 02:07:04 +00001206 ArmArch = XScale;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001207 else
Chris Lattner433d9722009-04-23 04:22:04 +00001208 ArmArch = Armv6;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001209
1210 if (Arch.startswith("thumb"))
1211 IsThumb = true;
Daniel Dunbar54f62dc2009-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 Lattner2e17d912009-11-07 18:59:41 +00001216 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar54f62dc2009-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 Lattner2e17d912009-11-07 18:59:41 +00001220 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001221 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001222 }
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001223 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbarb9531632009-09-14 00:02:24 +00001224 virtual bool setABI(const std::string &Name) {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001225 ABI = Name;
1226
Daniel Dunbarb9531632009-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 Dunbar54f62dc2009-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 Lattner2e17d912009-11-07 18:59:41 +00001238 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar54f62dc2009-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 Lattner2e17d912009-11-07 18:59:41 +00001242 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001243 }
1244
Daniel Dunbarb9531632009-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 Lattner79682402009-03-20 15:52:06 +00001255 virtual void getTargetDefines(const LangOptions &Opts,
1256 std::vector<char> &Defs) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00001257 // Target identification.
1258 Define(Defs, "__arm");
1259 Define(Defs, "__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00001260
Chris Lattnerbef1d722009-03-02 22:27:17 +00001261 // Target properties.
1262 Define(Defs, "__LITTLE_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00001263
Mike Stumpf90a29f2009-04-08 02:07:04 +00001264 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00001265 //
1266 // FIXME: Neither THUMB_INTERWORK nor SOFTFP is not being set correctly
1267 // here.
Mike Stump4e21ba42009-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 Stumpf90a29f2009-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 Dunbarf0156562009-09-17 16:21:10 +00001286
Chris Lattnerbef1d722009-03-02 22:27:17 +00001287 Define(Defs, "__ARMEL__");
Daniel Dunbarf0156562009-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 Friedman468ca6d2009-05-29 19:00:15 +00001297 Define(Defs, "__APCS_32__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00001298 // FIXME: This should be conditional on VFP instruction support.
Eli Friedman468ca6d2009-05-29 19:00:15 +00001299 Define(Defs, "__VFP_FP__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00001300
1301 Define(Defs, "__USING_SJLJ_EXCEPTIONS__");
Chris Lattner9fd73612008-04-21 18:56:49 +00001302 }
1303 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1304 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001305 // FIXME: Implement.
1306 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +00001307 NumRecords = 0;
1308 }
1309 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001310 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +00001311 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001312 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001313 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +00001314 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001315 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00001316 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00001317 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001318 // FIXME: Check if this is complete
Anders Carlsson36834a72009-02-28 17:11:49 +00001319 switch (*Name) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001320 default:
Nate Begeman222823a2008-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 Lattnerc49cc1a2009-04-26 07:16:29 +00001325 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00001326 return true;
1327 }
Chris Lattner9fd73612008-04-21 18:56:49 +00001328 return false;
1329 }
1330 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001331 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00001332 return "";
1333 }
1334};
Daniel Dunbar40b774e2009-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 Lattner9fd73612008-04-21 18:56:49 +00001372} // end anonymous namespace.
1373
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001374
1375namespace {
Mike Stump25cf7602009-09-09 15:08:12 +00001376class DarwinARMTargetInfo :
Edwin Török36565e52009-06-30 17:10:35 +00001377 public DarwinTargetInfo<ARMTargetInfo> {
1378protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +00001379 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Edwin Török36565e52009-06-30 17:10:35 +00001380 std::vector<char> &Defines) const {
1381 getDarwinDefines(Defines, Opts);
1382 getDarwinIPhoneOSDefines(Defines, Triple);
Eli Friedman8f575172009-04-19 21:38:35 +00001383 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001384
Edwin Török36565e52009-06-30 17:10:35 +00001385public:
Mike Stump25cf7602009-09-09 15:08:12 +00001386 DarwinARMTargetInfo(const std::string& triple)
Edwin Török36565e52009-06-30 17:10:35 +00001387 : DarwinTargetInfo<ARMTargetInfo>(triple) {}
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001388};
1389} // end anonymous namespace.
1390
Chris Lattner4b009652007-07-25 00:24:17 +00001391namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001392class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001393 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1394 static const char * const GCCRegNames[];
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001395public:
Eli Friedmanff158dd2008-08-20 07:28:14 +00001396 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1397 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-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 Lattner2e17d912009-11-07 18:59:41 +00001399 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanff158dd2008-08-20 07:28:14 +00001400 }
Chris Lattner79682402009-03-20 15:52:06 +00001401 virtual void getTargetDefines(const LangOptions &Opts,
1402 std::vector<char> &Defines) const {
Eli Friedmana456b7f2009-05-22 01:12:57 +00001403 DefineStd(Defines, "sparc", Opts);
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001404 Define(Defines, "__sparcv8");
Eli Friedmana456b7f2009-05-22 01:12:57 +00001405 Define(Defines, "__REGISTER_PREFIX__", "");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001406 }
1407 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1408 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001409 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001410 }
1411 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001412 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001413 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001414 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001415 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +00001416 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001417 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00001418 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001419 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001420 // FIXME: Implement!
1421 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001422 }
1423 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001424 // FIXME: Implement!
1425 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001426 }
1427};
1428
Chris Lattnerff7c53d2009-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 Korobeynikove7772382009-05-03 13:42:53 +00001436void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-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 Korobeynikove7772382009-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 Lattnerff7c53d2009-01-27 01:58:38 +00001475};
1476
Anton Korobeynikove7772382009-05-03 13:42:53 +00001477void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00001478 unsigned &NumAliases) const {
1479 Aliases = GCCRegAliases;
1480 NumAliases = llvm::array_lengthof(GCCRegAliases);
1481}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00001482} // end anonymous namespace.
1483
Eli Friedmanff158dd2008-08-20 07:28:14 +00001484namespace {
Edward O'Callaghan0a7ef9a2009-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};
Edwin Török36565e52009-06-30 17:10:35 +00001493class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001494public:
1495 SolarisSparcV8TargetInfo(const std::string& triple) :
Edwin Török36565e52009-06-30 17:10:35 +00001496 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00001497 SizeType = UnsignedInt;
1498 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00001499 }
1500};
1501} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001502
Chris Lattner85970f32008-05-08 05:58:21 +00001503namespace {
1504 class PIC16TargetInfo : public TargetInfo{
1505 public:
1506 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman8f575172009-04-19 21:38:35 +00001507 TLSSupported = false;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001508 IntWidth = 16;
1509 LongWidth = LongLongWidth = 32;
Eli Friedman78a2f412009-05-16 23:30:57 +00001510 IntMaxTWidth = 32;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001511 PointerWidth = 16;
1512 IntAlign = 8;
1513 LongAlign = LongLongAlign = 8;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001514 PointerAlign = 8;
Sanjiv Guptafa451432008-10-31 09:52:39 +00001515 SizeType = UnsignedInt;
1516 IntMaxType = SignedLong;
1517 UIntMaxType = UnsignedLong;
Chris Lattnerd9ef7242009-02-13 22:28:55 +00001518 IntPtrType = SignedShort;
Eli Friedman7cca0982008-11-02 02:43:55 +00001519 PtrDiffType = SignedInt;
Sanjiv Guptaae8f1e82009-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 Lattner2e17d912009-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 Guptaae8f1e82009-06-02 04:43:46 +00001530
Chris Lattner85970f32008-05-08 05:58:21 +00001531 }
Chris Lattner727b3c42008-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 Lattner79682402009-03-20 15:52:06 +00001534 virtual void getTargetDefines(const LangOptions &Opts,
1535 std::vector<char> &Defines) const {
Chris Lattner85970f32008-05-08 05:58:21 +00001536 Define(Defines, "__pic16");
Sanjiv Guptad75fd0b2009-07-07 04:42:23 +00001537 Define(Defines, "rom", "__attribute__((address_space(1)))");
1538 Define(Defines, "ram", "__attribute__((address_space(0)))");
Mike Stump25cf7602009-09-09 15:08:12 +00001539 Define(Defines, "_section(SectName)",
Sanjiv Gupta9e2b9e02009-08-20 17:48:52 +00001540 "__attribute__((section(SectName)))");
Sanjiv Gupta09e95f02009-10-24 18:08:20 +00001541 Define(Defines, "near",
1542 "__attribute__((section(\"Address=NEAR\")))");
Sanjiv Gupta9e2b9e02009-08-20 17:48:52 +00001543 Define(Defines, "_address(Addr)",
1544 "__attribute__((section(\"Address=\"#Addr)))");
Sanjiv Guptad75fd0b2009-07-07 04:42:23 +00001545 Define(Defines, "_CONFIG(conf)", "asm(\"CONFIG \"#conf)");
Sanjiv Gupta9e2b9e02009-08-20 17:48:52 +00001546 Define(Defines, "_interrupt",
1547 "__attribute__((section(\"interrupt=0x4\"))) \
1548 __attribute__((used))");
Chris Lattner85970f32008-05-08 05:58:21 +00001549 }
1550 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1551 unsigned &NumRecords) const {}
Mike Stump25cf7602009-09-09 15:08:12 +00001552 virtual const char *getVAListDeclaration() const {
Daniel Dunbar2e967de2009-08-24 09:54:37 +00001553 return "";
1554 }
1555 virtual const char *getClobbers() const {
1556 return "";
1557 }
Anton Korobeynikove7772382009-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 Lattner85970f32008-05-08 05:58:21 +00001561 TargetInfo::ConstraintInfo &info) const {
1562 return true;
1563 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001564 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner85970f32008-05-08 05:58:21 +00001565 unsigned &NumAliases) const {}
1566 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1567 };
1568}
1569
Anton Korobeynikov954bd3f2009-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 Friedman78a2f412009-05-16 23:30:57 +00001578 IntMaxTWidth = 32;
Anton Korobeynikov954bd3f2009-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 Lattner2e17d912009-11-07 18:59:41 +00001588 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-n8:16";
Anton Korobeynikov954bd3f2009-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 Korobeynikov954bd3f2009-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 Korobeynikov174219b2009-10-15 23:17:13 +00001612 // No target constraints for now.
1613 return false;
Anton Korobeynikov954bd3f2009-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 Korobeynikovf5955592009-05-08 18:24:57 +00001621 return "typedef char* __builtin_va_list;";
Anton Korobeynikov954bd3f2009-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 Korobeynikov57f236f2009-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 Lattner2e17d912009-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 Korobeynikov57f236f2009-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 Korobeynikov57f236f2009-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 Olesen61774372009-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 Lattner2e17d912009-11-07 18:59:41 +00001711 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen61774372009-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 Olesen61774372009-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 Friedmanf0ff32f2009-08-19 20:47:07 +00001776namespace {
1777
Mike Stump25cf7602009-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 Friedmanf0ff32f2009-08-19 20:47:07 +00001780 // type and alignment information.
Mike Stump25cf7602009-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 Friedmanf0ff32f2009-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 Lattner2e17d912009-11-07 18:59:41 +00001813 "-f32:32:32-f64:32:64-n32";
Eli Friedmanf0ff32f2009-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 Dunbar2e967de2009-08-24 09:54:37 +00001824 virtual const char *getClobbers() const {
1825 return "";
1826 }
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00001827 virtual const char *getVAListDeclaration() const {
1828 return "typedef void* __builtin_va_list;";
1829 }
Eli Friedmanf0ff32f2009-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 Lattner4b009652007-07-25 00:24:17 +00001841//===----------------------------------------------------------------------===//
1842// Driver code
1843//===----------------------------------------------------------------------===//
1844
Chris Lattnerfc457002008-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 Dunbar8ba3de02009-08-18 05:47:58 +00001848 llvm::Triple Triple(T);
1849 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001850
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001851 switch (Triple.getArch()) {
1852 default:
1853 return NULL;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001854
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001855 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00001856 case llvm::Triple::thumb:
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001857 switch (os) {
1858 case llvm::Triple::Darwin:
Eli Friedman2b161652008-08-21 00:13:15 +00001859 return new DarwinARMTargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001860 case llvm::Triple::FreeBSD:
Edwin Török36565e52009-06-30 17:10:35 +00001861 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001862 default:
1863 return new ARMTargetInfo(T);
1864 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001865
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001866 case llvm::Triple::bfin:
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00001867 return new BlackfinTargetInfo(T);
1868
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001869 case llvm::Triple::msp430:
1870 return new MSP430TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001871
Daniel Dunbar8ba3de02009-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'Callaghan0a7ef9a2009-10-18 13:33:59 +00001886 if (os == llvm::Triple::AuroraUX)
1887 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar8ba3de02009-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 Friedmanf0ff32f2009-08-19 20:47:07 +00001895 case llvm::Triple::tce:
1896 return new TCETargetInfo(T);
1897
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001898 case llvm::Triple::x86:
1899 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00001900 case llvm::Triple::AuroraUX:
1901 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar8ba3de02009-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 Dunbar8d8e9d62009-09-23 07:31:35 +00001917 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001918 case llvm::Triple::MinGW32:
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001919 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00001920 case llvm::Triple::Win32:
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001921 return new VisualStudioWindowsX86_32TargetInfo(T);
Daniel Dunbar8ba3de02009-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'Callaghan0a7ef9a2009-10-18 13:33:59 +00001928 case llvm::Triple::AuroraUX:
1929 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar8ba3de02009-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 Dunbar8d8e9d62009-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 Dunbar8ba3de02009-08-18 05:47:58 +00001946 default:
1947 return new X86_64TargetInfo(T);
1948 }
1949 }
Chris Lattner4b009652007-07-25 00:24:17 +00001950}