blob: 989d1754abfb967ac06a9cda4de2ac41ef3d9559 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Dale Johannesen182addf2010-10-29 23:24:33 +000030#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000091 Builder.defineMacro("__APPLE_CC__", "5621");
92 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000095
John McCall5d36a8c2011-06-16 00:03:19 +000096 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000097 // __weak is always defined, for use in blocks and with objc pointers.
98 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall31168b02011-06-15 23:02:42 +0000100 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000101 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000102 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
103 else
104 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000105
John McCall31168b02011-06-15 23:02:42 +0000106 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
107 // allow this in C, since one might have block pointers in structs that
108 // are used in pure C code and in Objective-C ARC.
109 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000110 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000111
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000112 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000116
117 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000119
Daniel Dunbarecf13562011-04-19 21:40:34 +0000120 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000122 if (Triple.isMacOSX()) {
123 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000125 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 Triple.getOSVersion(Maj, Min, Rev);
127 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000129
Sebastian Pop422377c2012-01-20 22:01:23 +0000130 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000131 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000132 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
133 if (PlatformName == "win32") {
134 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
135 return;
136 }
137
Daniel Dunbard86666f2010-01-26 01:44:04 +0000138 // Set the appropriate OS version define.
Bob Wilson8e5acc52012-01-31 23:52:58 +0000139 if (Triple.getOS() == llvm::Triple::IOS) {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000140 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000141 char Str[6];
142 Str[0] = '0' + Maj;
143 Str[1] = '0' + (Min / 10);
144 Str[2] = '0' + (Min % 10);
145 Str[3] = '0' + (Rev / 10);
146 Str[4] = '0' + (Rev % 10);
147 Str[5] = '\0';
148 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
149 } else {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000150 // Note that the Driver allows versions which aren't representable in the
151 // define (because we only get a single digit for the minor and micro
152 // revision numbers). So, we limit them to the maximum representable
153 // version.
Daniel Dunbard86666f2010-01-26 01:44:04 +0000154 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000155 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000156 char Str[5];
157 Str[0] = '0' + (Maj / 10);
158 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000159 Str[2] = '0' + std::min(Min, 9U);
160 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000161 Str[4] = '\0';
162 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000163 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000164
165 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000166}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000167
Chris Lattner30ba6742009-08-10 19:03:04 +0000168namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000169template<typename Target>
170class DarwinTargetInfo : public OSTargetInfo<Target> {
171protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000172 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000173 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000174 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000175 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000176 }
Mike Stump11289f42009-09-09 15:08:12 +0000177
Torok Edwinb2b37c62009-06-30 17:10:35 +0000178public:
179 DarwinTargetInfo(const std::string& triple) :
180 OSTargetInfo<Target>(triple) {
Eric Christopherbf15d2b2011-07-02 00:20:22 +0000181 llvm::Triple T = llvm::Triple(triple);
182 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000183 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000184 }
185
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000186 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000187 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000188 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000189 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000190 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000191 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000192 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000193 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000194
Anders Carlsson851318a2010-06-08 22:47:50 +0000195 virtual const char *getStaticInitSectionSpecifier() const {
196 // FIXME: We should return 0 when building kexts.
197 return "__TEXT,__StaticInit,regular,pure_instructions";
198 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000199
John McCalleed64c72012-01-29 01:20:30 +0000200 /// Darwin does not support protected visibility. Darwin's "default"
201 /// is very similar to ELF's "protected"; Darwin requires a "weak"
202 /// attribute on declarations that can be dynamically replaced.
203 virtual bool hasProtectedVisibility() const {
204 return false;
205 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000206};
207
Chris Lattner30ba6742009-08-10 19:03:04 +0000208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209// DragonFlyBSD Target
210template<typename Target>
211class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
212protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000213 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000214 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000216 Builder.defineMacro("__DragonFly__");
217 Builder.defineMacro("__DragonFly_cc_version", "100001");
218 Builder.defineMacro("__ELF__");
219 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
220 Builder.defineMacro("__tune_i386__");
221 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 }
223public:
Mike Stump11289f42009-09-09 15:08:12 +0000224 DragonFlyBSDTargetInfo(const std::string &triple)
Eli Friedman4286fba2012-02-10 23:02:29 +0000225 : OSTargetInfo<Target>(triple) {
226 this->UserLabelPrefix = "";
227
228 llvm::Triple Triple(triple);
229 switch (Triple.getArch()) {
230 default:
231 case llvm::Triple::x86:
232 case llvm::Triple::x86_64:
233 this->MCountName = ".mcount";
234 break;
235 }
236 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000237};
238
239// FreeBSD Target
240template<typename Target>
241class FreeBSDTargetInfo : public OSTargetInfo<Target> {
242protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000243 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000244 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245 // FreeBSD defines; list based off of gcc output
246
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000247 unsigned Release = Triple.getOSMajorVersion();
248 if (Release == 0U)
249 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000250
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000251 Builder.defineMacro("__FreeBSD__", Twine(Release));
252 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000253 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
254 DefineStd(Builder, "unix", Opts);
255 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000256 }
257public:
Mike Stump11289f42009-09-09 15:08:12 +0000258 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000259 : OSTargetInfo<Target>(triple) {
260 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000261
262 llvm::Triple Triple(triple);
263 switch (Triple.getArch()) {
264 default:
265 case llvm::Triple::x86:
266 case llvm::Triple::x86_64:
267 this->MCountName = ".mcount";
268 break;
269 case llvm::Triple::mips:
270 case llvm::Triple::mipsel:
271 case llvm::Triple::ppc:
272 case llvm::Triple::ppc64:
273 this->MCountName = "_mcount";
274 break;
275 case llvm::Triple::arm:
276 this->MCountName = "__mcount";
277 break;
278 }
279
Duncan Sands9cb27e92009-07-08 13:55:08 +0000280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner3e2ee142010-07-07 16:01:42 +0000283// Minix Target
284template<typename Target>
285class MinixTargetInfo : public OSTargetInfo<Target> {
286protected:
287 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
288 MacroBuilder &Builder) const {
289 // Minix defines
290
291 Builder.defineMacro("__minix", "3");
292 Builder.defineMacro("_EM_WSIZE", "4");
293 Builder.defineMacro("_EM_PSIZE", "4");
294 Builder.defineMacro("_EM_SSIZE", "2");
295 Builder.defineMacro("_EM_LSIZE", "4");
296 Builder.defineMacro("_EM_FSIZE", "4");
297 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000298 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000299 DefineStd(Builder, "unix", Opts);
300 }
301public:
302 MinixTargetInfo(const std::string &triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 }
306};
307
Torok Edwinb2b37c62009-06-30 17:10:35 +0000308// Linux target
309template<typename Target>
310class LinuxTargetInfo : public OSTargetInfo<Target> {
311protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000312 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000314 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000315 DefineStd(Builder, "unix", Opts);
316 DefineStd(Builder, "linux", Opts);
317 Builder.defineMacro("__gnu_linux__");
318 Builder.defineMacro("__ELF__");
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000319 if (Triple.getEnvironment() == llvm::Triple::ANDROIDEABI)
320 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000321 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000322 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000323 if (Opts.CPlusPlus)
324 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000325 }
326public:
Mike Stump11289f42009-09-09 15:08:12 +0000327 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328 : OSTargetInfo<Target>(triple) {
329 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000330 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000331 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000332
333 virtual const char *getStaticInitSectionSpecifier() const {
334 return ".text.startup";
335 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336};
337
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000338// NetBSD Target
339template<typename Target>
340class NetBSDTargetInfo : public OSTargetInfo<Target> {
341protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000342 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000344 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__NetBSD__");
346 Builder.defineMacro("__unix__");
347 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000348 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000349 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000350 }
351public:
Mike Stump11289f42009-09-09 15:08:12 +0000352 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000353 : OSTargetInfo<Target>(triple) {
354 this->UserLabelPrefix = "";
355 }
356};
357
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358// OpenBSD Target
359template<typename Target>
360class OpenBSDTargetInfo : public OSTargetInfo<Target> {
361protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000362 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000364 // OpenBSD defines; list based off of gcc output
365
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000366 Builder.defineMacro("__OpenBSD__");
367 DefineStd(Builder, "unix", Opts);
368 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000369 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000370 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000371 }
372public:
Mike Stump11289f42009-09-09 15:08:12 +0000373 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman3715d1f2011-12-15 02:15:56 +0000374 : OSTargetInfo<Target>(triple) {
375 this->UserLabelPrefix = "";
376
377 llvm::Triple Triple(triple);
378 switch (Triple.getArch()) {
379 default:
380 case llvm::Triple::x86:
381 case llvm::Triple::x86_64:
382 case llvm::Triple::arm:
383 case llvm::Triple::sparc:
384 this->MCountName = "__mcount";
385 break;
386 case llvm::Triple::mips64:
387 case llvm::Triple::mips64el:
388 case llvm::Triple::ppc:
389 case llvm::Triple::sparcv9:
390 this->MCountName = "_mcount";
391 break;
392 }
393 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000394};
395
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000396// PSP Target
397template<typename Target>
398class PSPTargetInfo : public OSTargetInfo<Target> {
399protected:
400 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000401 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000402 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000403 Builder.defineMacro("PSP");
404 Builder.defineMacro("_PSP");
405 Builder.defineMacro("__psp__");
406 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000407 }
408public:
409 PSPTargetInfo(const std::string& triple)
410 : OSTargetInfo<Target>(triple) {
411 this->UserLabelPrefix = "";
412 }
413};
414
John Thompsone467e192009-11-19 17:18:50 +0000415// PS3 PPU Target
416template<typename Target>
417class PS3PPUTargetInfo : public OSTargetInfo<Target> {
418protected:
419 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000420 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000421 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000422 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000423 Builder.defineMacro("__PPU__");
424 Builder.defineMacro("__CELLOS_LV2__");
425 Builder.defineMacro("__ELF__");
426 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000427 Builder.defineMacro("_ARCH_PPC64");
428 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000429 }
430public:
431 PS3PPUTargetInfo(const std::string& triple)
432 : OSTargetInfo<Target>(triple) {
433 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000434 this->LongWidth = this->LongAlign = 32;
435 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000436 this->IntMaxType = TargetInfo::SignedLongLong;
437 this->UIntMaxType = TargetInfo::UnsignedLongLong;
438 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000439 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000440 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000441 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000442 }
443};
444
445// FIXME: Need a real SPU target.
446// PS3 SPU Target
447template<typename Target>
448class PS3SPUTargetInfo : public OSTargetInfo<Target> {
449protected:
450 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000452 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000453 Builder.defineMacro("__SPU__");
454 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000455 }
456public:
457 PS3SPUTargetInfo(const std::string& triple)
458 : OSTargetInfo<Target>(triple) {
459 this->UserLabelPrefix = "";
460 }
461};
462
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000463// AuroraUX target
464template<typename Target>
465class AuroraUXTargetInfo : public OSTargetInfo<Target> {
466protected:
467 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000468 MacroBuilder &Builder) const {
469 DefineStd(Builder, "sun", Opts);
470 DefineStd(Builder, "unix", Opts);
471 Builder.defineMacro("__ELF__");
472 Builder.defineMacro("__svr4__");
473 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000474 }
475public:
476 AuroraUXTargetInfo(const std::string& triple)
477 : OSTargetInfo<Target>(triple) {
478 this->UserLabelPrefix = "";
479 this->WCharType = this->SignedLong;
480 // FIXME: WIntType should be SignedLong
481 }
482};
483
Torok Edwinb2b37c62009-06-30 17:10:35 +0000484// Solaris target
485template<typename Target>
486class SolarisTargetInfo : public OSTargetInfo<Target> {
487protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000488 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 MacroBuilder &Builder) const {
490 DefineStd(Builder, "sun", Opts);
491 DefineStd(Builder, "unix", Opts);
492 Builder.defineMacro("__ELF__");
493 Builder.defineMacro("__svr4__");
494 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000495 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
496 // newer, but to 500 for everything else. feature_test.h has a check to
497 // ensure that you are not using C99 with an old version of X/Open or C89
498 // with a new version.
499 if (Opts.C99 || Opts.C11)
500 Builder.defineMacro("_XOPEN_SOURCE", "600");
501 else
502 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000503 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000504 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000505 Builder.defineMacro("_LARGEFILE_SOURCE");
506 Builder.defineMacro("_LARGEFILE64_SOURCE");
507 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000508 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000509 }
510public:
Mike Stump11289f42009-09-09 15:08:12 +0000511 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000512 : OSTargetInfo<Target>(triple) {
513 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000514 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000515 // FIXME: WIntType should be SignedLong
516 }
517};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000518
519// Windows target
520template<typename Target>
521class WindowsTargetInfo : public OSTargetInfo<Target> {
522protected:
523 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000525 Builder.defineMacro("_WIN32");
526 }
527 void getVisualStudioDefines(const LangOptions &Opts,
528 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000529 if (Opts.CPlusPlus) {
530 if (Opts.RTTI)
531 Builder.defineMacro("_CPPRTTI");
532
533 if (Opts.Exceptions)
534 Builder.defineMacro("_CPPUNWIND");
535 }
536
537 if (!Opts.CharIsSigned)
538 Builder.defineMacro("_CHAR_UNSIGNED");
539
540 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
541 // but it works for now.
542 if (Opts.POSIXThreads)
543 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000544
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000545 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000546 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000547
Francois Pichet0706d202011-09-17 17:15:52 +0000548 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000549 Builder.defineMacro("_MSC_EXTENSIONS");
550
551 if (Opts.CPlusPlus0x) {
552 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
553 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
554 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
555 }
556 }
557
558 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000559 }
560
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000561public:
562 WindowsTargetInfo(const std::string &triple)
563 : OSTargetInfo<Target>(triple) {}
564};
565
Mike Stump11289f42009-09-09 15:08:12 +0000566} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000567
Chris Lattner09d98f52008-10-05 21:50:58 +0000568//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000569// Specific target implementations.
570//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000571
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000572namespace {
573// PPC abstract base class
574class PPCTargetInfo : public TargetInfo {
575 static const Builtin::Info BuiltinInfo[];
576 static const char * const GCCRegNames[];
577 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000578 std::string CPU;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000579public:
Nico Weber3435ede2012-01-31 02:07:33 +0000580 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
581 LongDoubleWidth = LongDoubleAlign = 128;
582 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
583 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000584
Hal Finkel8eb59282012-06-11 22:35:19 +0000585 virtual bool setCPU(const std::string &Name) {
586 bool CPUKnown = llvm::StringSwitch<bool>(Name)
587 .Case("generic", true)
588 .Case("440", true)
589 .Case("450", true)
590 .Case("601", true)
591 .Case("602", true)
592 .Case("603", true)
593 .Case("603e", true)
594 .Case("603ev", true)
595 .Case("604", true)
596 .Case("604e", true)
597 .Case("620", true)
598 .Case("g3", true)
599 .Case("7400", true)
600 .Case("g4", true)
601 .Case("7450", true)
602 .Case("g4+", true)
603 .Case("750", true)
604 .Case("970", true)
605 .Case("g5", true)
606 .Case("a2", true)
607 .Case("pwr6", true)
608 .Case("pwr7", true)
609 .Case("ppc", true)
610 .Case("ppc64", true)
611 .Default(false);
612
613 if (CPUKnown)
614 CPU = Name;
615
616 return CPUKnown;
617 }
618
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000619 virtual void getTargetBuiltins(const Builtin::Info *&Records,
620 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000621 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000622 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000623 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000624
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000625 virtual bool isCLZForZeroUndef() const { return false; }
626
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000627 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000629
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000630 virtual bool hasFeature(StringRef Feature) const;
631
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000632 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000633 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000634 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000635 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000636 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000637 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000638 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000639 default: return false;
640 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000641 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000642 case 'b': // Base register
643 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000644 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000645 break;
646 // FIXME: The following are added to allow parsing.
647 // I just took a guess at what the actions should be.
648 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000649 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000650 case 'v': // Altivec vector register
651 Info.setAllowsRegister();
652 break;
653 case 'w':
654 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000655 case 'd':// VSX vector register to hold vector double data
656 case 'f':// VSX vector register to hold vector float data
657 case 's':// VSX vector register to hold scalar float data
658 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000659 break;
660 default:
661 return false;
662 }
663 Info.setAllowsRegister();
664 Name++; // Skip over 'w'.
665 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000666 case 'h': // `MQ', `CTR', or `LINK' register
667 case 'q': // `MQ' register
668 case 'c': // `CTR' register
669 case 'l': // `LINK' register
670 case 'x': // `CR' register (condition register) number 0
671 case 'y': // `CR' register (condition register)
672 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000673 Info.setAllowsRegister();
674 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000675 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000676 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000677 // (use `L' instead for SImode constants)
678 case 'K': // Unsigned 16-bit constant
679 case 'L': // Signed 16-bit constant shifted left 16 bits
680 case 'M': // Constant larger than 31
681 case 'N': // Exact power of 2
682 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000683 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000684 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000685 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000686 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000687 break;
688 case 'm': // Memory operand. Note that on PowerPC targets, m can
689 // include addresses that update the base register. It
690 // is therefore only safe to use `m' in an asm statement
691 // if that asm statement accesses the operand exactly once.
692 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000693 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000694 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000695 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000696 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000697 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
698 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000699 // register to be updated.
700 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000701 if (Name[1] != 's')
702 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000703 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000704 // include any automodification of the base register. Unlike
705 // `m', this constraint can be used in asm statements that
706 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000707 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000708 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000709 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000710 break;
711 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000712 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000713 case 'Z': // Memory operand that is an indexed or indirect from a
714 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000715 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000716 Info.setAllowsMemory();
717 Info.setAllowsRegister();
718 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000719 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000720 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000721 // register (`p' is preferable for asm statements)
722 case 'S': // Constant suitable as a 64-bit mask operand
723 case 'T': // Constant suitable as a 32-bit mask operand
724 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000725 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000726 // instructions
727 case 'W': // Vector constant that does not require memory
728 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000729 break;
730 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000731 }
John Thompson07a61a42010-06-24 22:44:13 +0000732 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000733 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000734 virtual const char *getClobbers() const {
735 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000736 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000737};
Anders Carlssonf511f642007-11-27 04:11:28 +0000738
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000739const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000740#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000741#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000742 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000743#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000744};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000745
746
Chris Lattnerecd49032009-03-02 22:27:17 +0000747/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
748/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000749void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000750 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000751 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000752 Builder.defineMacro("__ppc__");
753 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000754 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000755 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000756 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000757 Builder.defineMacro("_ARCH_PPC64");
758 Builder.defineMacro("_LP64");
759 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000760 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000761 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000762 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000763 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000764 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000765
Chris Lattnerecd49032009-03-02 22:27:17 +0000766 // Target properties.
Joerg Sonnenberger870b3c52011-07-05 14:56:12 +0000767 if (getTriple().getOS() != llvm::Triple::NetBSD)
768 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000769 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000770
Chris Lattnerecd49032009-03-02 22:27:17 +0000771 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000772 Builder.defineMacro("__NATURAL_ALIGNMENT__");
773 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000774
Chris Lattnerecd49032009-03-02 22:27:17 +0000775 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000776 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000777
John Thompsone467e192009-11-19 17:18:50 +0000778 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000779 Builder.defineMacro("__VEC__", "10206");
780 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000781 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000782
783 // CPU identification.
784 if (CPU == "440") {
785 Builder.defineMacro("_ARCH_440");
786 } else if (CPU == "450") {
787 Builder.defineMacro("_ARCH_440");
788 Builder.defineMacro("_ARCH_450");
789 } else if (CPU == "970") {
790 Builder.defineMacro("_ARCH_970");
791 } else if (CPU == "pwr6") {
792 Builder.defineMacro("_ARCH_PWR6");
793 } else if (CPU == "pwr7") {
794 Builder.defineMacro("_ARCH_PWR7");
795 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000796}
797
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000798bool PPCTargetInfo::hasFeature(StringRef Feature) const {
799 return Feature == "powerpc";
800}
Chris Lattner17df24e2008-04-21 18:56:49 +0000801
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000802
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000803const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000804 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
805 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
806 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
807 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
808 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
809 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
810 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
811 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000812 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000813 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000814 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000815 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
816 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
817 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
818 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000819 "vrsave", "vscr",
820 "spe_acc", "spefscr",
821 "sfp"
822};
Chris Lattner10a5b382007-01-29 05:24:35 +0000823
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000824void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000825 unsigned &NumNames) const {
826 Names = GCCRegNames;
827 NumNames = llvm::array_lengthof(GCCRegNames);
828}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000829
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000830const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
831 // While some of these aliases do map to different registers
832 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000833 { { "0" }, "r0" },
834 { { "1"}, "r1" },
835 { { "2" }, "r2" },
836 { { "3" }, "r3" },
837 { { "4" }, "r4" },
838 { { "5" }, "r5" },
839 { { "6" }, "r6" },
840 { { "7" }, "r7" },
841 { { "8" }, "r8" },
842 { { "9" }, "r9" },
843 { { "10" }, "r10" },
844 { { "11" }, "r11" },
845 { { "12" }, "r12" },
846 { { "13" }, "r13" },
847 { { "14" }, "r14" },
848 { { "15" }, "r15" },
849 { { "16" }, "r16" },
850 { { "17" }, "r17" },
851 { { "18" }, "r18" },
852 { { "19" }, "r19" },
853 { { "20" }, "r20" },
854 { { "21" }, "r21" },
855 { { "22" }, "r22" },
856 { { "23" }, "r23" },
857 { { "24" }, "r24" },
858 { { "25" }, "r25" },
859 { { "26" }, "r26" },
860 { { "27" }, "r27" },
861 { { "28" }, "r28" },
862 { { "29" }, "r29" },
863 { { "30" }, "r30" },
864 { { "31" }, "r31" },
865 { { "fr0" }, "f0" },
866 { { "fr1" }, "f1" },
867 { { "fr2" }, "f2" },
868 { { "fr3" }, "f3" },
869 { { "fr4" }, "f4" },
870 { { "fr5" }, "f5" },
871 { { "fr6" }, "f6" },
872 { { "fr7" }, "f7" },
873 { { "fr8" }, "f8" },
874 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000875 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000876 { { "fr11" }, "f11" },
877 { { "fr12" }, "f12" },
878 { { "fr13" }, "f13" },
879 { { "fr14" }, "f14" },
880 { { "fr15" }, "f15" },
881 { { "fr16" }, "f16" },
882 { { "fr17" }, "f17" },
883 { { "fr18" }, "f18" },
884 { { "fr19" }, "f19" },
885 { { "fr20" }, "f20" },
886 { { "fr21" }, "f21" },
887 { { "fr22" }, "f22" },
888 { { "fr23" }, "f23" },
889 { { "fr24" }, "f24" },
890 { { "fr25" }, "f25" },
891 { { "fr26" }, "f26" },
892 { { "fr27" }, "f27" },
893 { { "fr28" }, "f28" },
894 { { "fr29" }, "f29" },
895 { { "fr30" }, "f30" },
896 { { "fr31" }, "f31" },
897 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000898};
899
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000900void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000901 unsigned &NumAliases) const {
902 Aliases = GCCRegAliases;
903 NumAliases = llvm::array_lengthof(GCCRegAliases);
904}
905} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000906
Chris Lattner5ba61f02006-10-14 07:39:34 +0000907namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000908class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000909public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000910 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000911 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000912 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000913
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000914 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +0000915 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000916 case llvm::Triple::FreeBSD:
917 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000918 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +0000919 PtrDiffType = SignedInt;
920 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000921 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +0000922 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000923 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000924 }
Roman Divacky816dcd12012-03-13 16:53:54 +0000925
Roman Divacky3ffe7462012-03-13 19:20:17 +0000926 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
927 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +0000928 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +0000929 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000930 }
931
932 virtual const char *getVAListDeclaration() const {
933 // This is the ELF definition, and is overridden by the Darwin sub-target
934 return "typedef struct __va_list_tag {"
935 " unsigned char gpr;"
936 " unsigned char fpr;"
937 " unsigned short reserved;"
938 " void* overflow_arg_area;"
939 " void* reg_save_area;"
940 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000941 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000942};
943} // end anonymous namespace.
944
945namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000946class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000947public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000948 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000949 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000950 IntMaxType = SignedLong;
951 UIntMaxType = UnsignedLong;
952 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000953 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000954 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Roman Divacky816dcd12012-03-13 16:53:54 +0000955
Roman Divacky3ffe7462012-03-13 19:20:17 +0000956 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
957 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +0000958 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +0000959 }
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000960 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000961 virtual const char *getVAListDeclaration() const {
962 return "typedef char* __builtin_va_list;";
963 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000964};
965} // end anonymous namespace.
966
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000967
968namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000969class DarwinPPC32TargetInfo :
970 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000971public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000972 DarwinPPC32TargetInfo(const std::string& triple)
973 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000974 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000975 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev68d773c2012-01-17 22:40:00 +0000976 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +0000977 SuitableAlign = 128;
Anton Yartsev68d773c2012-01-17 22:40:00 +0000978 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
979 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +0000980 }
981 virtual const char *getVAListDeclaration() const {
982 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000983 }
984};
985
986class DarwinPPC64TargetInfo :
987 public DarwinTargetInfo<PPC64TargetInfo> {
988public:
989 DarwinPPC64TargetInfo(const std::string& triple)
990 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
991 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +0000992 SuitableAlign = 128;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000993 }
994};
995} // end anonymous namespace.
996
Chris Lattner5ba61f02006-10-14 07:39:34 +0000997namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +0000998 static const unsigned NVPTXAddrSpaceMap[] = {
999 1, // opencl_global
1000 3, // opencl_local
1001 4, // opencl_constant
1002 1, // cuda_device
1003 4, // cuda_constant
1004 3, // cuda_shared
1005 };
1006 class NVPTXTargetInfo : public TargetInfo {
1007 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001008 static const Builtin::Info BuiltinInfo[];
1009 std::vector<llvm::StringRef> AvailableFeatures;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001010 public:
1011 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1012 BigEndian = false;
1013 TLSSupported = false;
1014 LongWidth = LongAlign = 64;
1015 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski83e96682012-05-24 17:43:12 +00001016 // Define available target features
1017 // These must be defined in sorted order!
Peter Collingbournec947aae2012-05-20 23:28:41 +00001018 }
1019 virtual void getTargetDefines(const LangOptions &Opts,
1020 MacroBuilder &Builder) const {
1021 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001022 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001023 }
1024 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1025 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001026 Records = BuiltinInfo;
1027 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001028 }
1029 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001030 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001031 }
1032
1033 virtual void getGCCRegNames(const char * const *&Names,
1034 unsigned &NumNames) const;
1035 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1036 unsigned &NumAliases) const {
1037 // No aliases.
1038 Aliases = 0;
1039 NumAliases = 0;
1040 }
1041 virtual bool validateAsmConstraint(const char *&Name,
1042 TargetInfo::ConstraintInfo &info) const {
1043 // FIXME: implement
1044 return true;
1045 }
1046 virtual const char *getClobbers() const {
1047 // FIXME: Is this really right?
1048 return "";
1049 }
1050 virtual const char *getVAListDeclaration() const {
1051 // FIXME: implement
1052 return "typedef char* __builtin_va_list;";
1053 }
1054 virtual bool setCPU(const std::string &Name) {
Justin Holewinski83e96682012-05-24 17:43:12 +00001055 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001056 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001057 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1058 StringRef Name,
1059 bool Enabled) const;
1060 };
1061
1062 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1063#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1064#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1065 ALL_LANGUAGES },
1066#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001067 };
1068
1069 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1070 "r0"
1071 };
1072
1073 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1074 unsigned &NumNames) const {
1075 Names = GCCRegNames;
1076 NumNames = llvm::array_lengthof(GCCRegNames);
1077 }
1078
Justin Holewinski83e96682012-05-24 17:43:12 +00001079 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1080 StringRef Name,
1081 bool Enabled) const {
1082 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1083 Name)) {
1084 Features[Name] = Enabled;
1085 return true;
1086 } else {
1087 return false;
1088 }
1089 }
1090
Peter Collingbournec947aae2012-05-20 23:28:41 +00001091 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1092 public:
Justin Holewinski83e96682012-05-24 17:43:12 +00001093 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001094 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001095 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001096 DescriptionString
1097 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1098 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1099 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001100 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001101 };
1102
1103 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1104 public:
Justin Holewinski83e96682012-05-24 17:43:12 +00001105 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001106 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001107 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001108 DescriptionString
1109 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1110 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1111 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001112 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001113 };
1114}
1115
1116namespace {
Chris Lattner5178f562010-03-06 21:21:27 +00001117// MBlaze abstract base class
1118class MBlazeTargetInfo : public TargetInfo {
1119 static const char * const GCCRegNames[];
1120 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1121
1122public:
1123 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +00001124 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +00001125 }
1126
1127 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1128 unsigned &NumRecords) const {
1129 // FIXME: Implement.
1130 Records = 0;
1131 NumRecords = 0;
1132 }
1133
1134 virtual void getTargetDefines(const LangOptions &Opts,
1135 MacroBuilder &Builder) const;
1136
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001137 virtual bool hasFeature(StringRef Feature) const {
1138 return Feature == "mblaze";
1139 }
1140
Chris Lattner5178f562010-03-06 21:21:27 +00001141 virtual const char *getVAListDeclaration() const {
1142 return "typedef char* __builtin_va_list;";
1143 }
1144 virtual const char *getTargetPrefix() const {
1145 return "mblaze";
1146 }
1147 virtual void getGCCRegNames(const char * const *&Names,
1148 unsigned &NumNames) const;
1149 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1150 unsigned &NumAliases) const;
1151 virtual bool validateAsmConstraint(const char *&Name,
1152 TargetInfo::ConstraintInfo &Info) const {
1153 switch (*Name) {
1154 default: return false;
1155 case 'O': // Zero
1156 return true;
1157 case 'b': // Base register
1158 case 'f': // Floating point register
1159 Info.setAllowsRegister();
1160 return true;
1161 }
1162 }
1163 virtual const char *getClobbers() const {
1164 return "";
1165 }
1166};
1167
1168/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1169/// #defines that are not tied to a specific subtarget.
1170void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1171 MacroBuilder &Builder) const {
1172 // Target identification.
1173 Builder.defineMacro("__microblaze__");
1174 Builder.defineMacro("_ARCH_MICROBLAZE");
1175 Builder.defineMacro("__MICROBLAZE__");
1176
1177 // Target properties.
1178 Builder.defineMacro("_BIG_ENDIAN");
1179 Builder.defineMacro("__BIG_ENDIAN__");
1180
1181 // Subtarget options.
1182 Builder.defineMacro("__REGISTER_PREFIX__", "");
1183}
1184
1185
1186const char * const MBlazeTargetInfo::GCCRegNames[] = {
1187 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1188 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1189 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1190 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1191 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1192 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1193 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1194 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1195 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1196 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1197};
1198
1199void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1200 unsigned &NumNames) const {
1201 Names = GCCRegNames;
1202 NumNames = llvm::array_lengthof(GCCRegNames);
1203}
1204
1205const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1206 { {"f0"}, "r0" },
1207 { {"f1"}, "r1" },
1208 { {"f2"}, "r2" },
1209 { {"f3"}, "r3" },
1210 { {"f4"}, "r4" },
1211 { {"f5"}, "r5" },
1212 { {"f6"}, "r6" },
1213 { {"f7"}, "r7" },
1214 { {"f8"}, "r8" },
1215 { {"f9"}, "r9" },
1216 { {"f10"}, "r10" },
1217 { {"f11"}, "r11" },
1218 { {"f12"}, "r12" },
1219 { {"f13"}, "r13" },
1220 { {"f14"}, "r14" },
1221 { {"f15"}, "r15" },
1222 { {"f16"}, "r16" },
1223 { {"f17"}, "r17" },
1224 { {"f18"}, "r18" },
1225 { {"f19"}, "r19" },
1226 { {"f20"}, "r20" },
1227 { {"f21"}, "r21" },
1228 { {"f22"}, "r22" },
1229 { {"f23"}, "r23" },
1230 { {"f24"}, "r24" },
1231 { {"f25"}, "r25" },
1232 { {"f26"}, "r26" },
1233 { {"f27"}, "r27" },
1234 { {"f28"}, "r28" },
1235 { {"f29"}, "r29" },
1236 { {"f30"}, "r30" },
1237 { {"f31"}, "r31" },
1238};
1239
1240void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1241 unsigned &NumAliases) const {
1242 Aliases = GCCRegAliases;
1243 NumAliases = llvm::array_lengthof(GCCRegAliases);
1244}
1245} // end anonymous namespace.
1246
1247namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001248// Namespace for x86 abstract base class
1249const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001250#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001251#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001252 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001253#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001254};
Eli Friedmanb5366062008-05-20 14:21:01 +00001255
Nuno Lopescfca1f02009-12-23 17:49:57 +00001256static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001257 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1258 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001259 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001260 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1261 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1262 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001263 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001264 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1265 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001266};
1267
Eric Christophercdd36352011-06-21 00:05:20 +00001268const TargetInfo::AddlRegName AddlRegNames[] = {
1269 { { "al", "ah", "eax", "rax" }, 0 },
1270 { { "bl", "bh", "ebx", "rbx" }, 3 },
1271 { { "cl", "ch", "ecx", "rcx" }, 2 },
1272 { { "dl", "dh", "edx", "rdx" }, 1 },
1273 { { "esi", "rsi" }, 4 },
1274 { { "edi", "rdi" }, 5 },
1275 { { "esp", "rsp" }, 7 },
1276 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001277};
1278
1279// X86 target abstract base class; x86-32 and x86-64 are very close, so
1280// most of the implementation can be shared.
1281class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001282 enum X86SSEEnum {
Craig Topper23b92192012-01-09 09:19:09 +00001283 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner96e43572009-03-02 22:40:39 +00001284 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001285 enum MMX3DNowEnum {
1286 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1287 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001288
Eric Christophere1ddaf92010-04-02 23:50:19 +00001289 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001290 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001291 bool HasLZCNT;
1292 bool HasBMI;
1293 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001294 bool HasPOPCNT;
Benjamin Kramer8ac9c222012-05-29 17:48:39 +00001295 bool HasSSE4a;
Craig Topperffdb46c2011-12-30 07:33:42 +00001296 bool HasFMA4;
Craig Topperbba778b2012-06-03 21:46:30 +00001297 bool HasFMA;
Craig Topperf561a9562012-06-09 22:24:14 +00001298 bool HasXOP;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001299
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001300 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1301 ///
1302 /// Each enumeration represents a particular CPU supported by Clang. These
1303 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1304 enum CPUKind {
1305 CK_Generic,
1306
1307 /// \name i386
1308 /// i386-generation processors.
1309 //@{
1310 CK_i386,
1311 //@}
1312
1313 /// \name i486
1314 /// i486-generation processors.
1315 //@{
1316 CK_i486,
1317 CK_WinChipC6,
1318 CK_WinChip2,
1319 CK_C3,
1320 //@}
1321
1322 /// \name i586
1323 /// i586-generation processors, P5 microarchitecture based.
1324 //@{
1325 CK_i586,
1326 CK_Pentium,
1327 CK_PentiumMMX,
1328 //@}
1329
1330 /// \name i686
1331 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1332 //@{
1333 CK_i686,
1334 CK_PentiumPro,
1335 CK_Pentium2,
1336 CK_Pentium3,
1337 CK_Pentium3M,
1338 CK_PentiumM,
1339 CK_C3_2,
1340
1341 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1342 /// Clang however has some logic to suport this.
1343 // FIXME: Warn, deprecate, and potentially remove this.
1344 CK_Yonah,
1345 //@}
1346
1347 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001348 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001349 //@{
1350 CK_Pentium4,
1351 CK_Pentium4M,
1352 CK_Prescott,
1353 CK_Nocona,
1354 //@}
1355
1356 /// \name Core
1357 /// Core microarchitecture based processors.
1358 //@{
1359 CK_Core2,
1360
1361 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1362 /// codename which GCC no longer accepts as an option to -march, but Clang
1363 /// has some logic for recognizing it.
1364 // FIXME: Warn, deprecate, and potentially remove this.
1365 CK_Penryn,
1366 //@}
1367
1368 /// \name Atom
1369 /// Atom processors
1370 //@{
1371 CK_Atom,
1372 //@}
1373
1374 /// \name Nehalem
1375 /// Nehalem microarchitecture based processors.
1376 //@{
1377 CK_Corei7,
1378 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001379 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001380 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001381 //@}
1382
1383 /// \name K6
1384 /// K6 architecture processors.
1385 //@{
1386 CK_K6,
1387 CK_K6_2,
1388 CK_K6_3,
1389 //@}
1390
1391 /// \name K7
1392 /// K7 architecture processors.
1393 //@{
1394 CK_Athlon,
1395 CK_AthlonThunderbird,
1396 CK_Athlon4,
1397 CK_AthlonXP,
1398 CK_AthlonMP,
1399 //@}
1400
1401 /// \name K8
1402 /// K8 architecture processors.
1403 //@{
1404 CK_Athlon64,
1405 CK_Athlon64SSE3,
1406 CK_AthlonFX,
1407 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001408 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001409 CK_Opteron,
1410 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001411 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001412 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001413
Benjamin Kramer569f2152012-01-10 11:50:18 +00001414 /// \name Bobcat
1415 /// Bobcat architecture processors.
1416 //@{
1417 CK_BTVER1,
1418 //@}
1419
1420 /// \name Bulldozer
1421 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001422 //@{
1423 CK_BDVER1,
1424 CK_BDVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001425 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001426
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001427 /// This specification is deprecated and will be removed in the future.
1428 /// Users should prefer \see CK_K8.
1429 // FIXME: Warn on this when the CPU is set to it.
1430 CK_x86_64,
1431 //@}
1432
1433 /// \name Geode
1434 /// Geode processors.
1435 //@{
1436 CK_Geode
1437 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001438 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001439
Eli Friedman3fd920a2008-08-20 02:34:37 +00001440public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001441 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001442 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper3f122a72012-05-31 05:18:48 +00001443 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasBMI(false),
1444 HasBMI2(false), HasPOPCNT(false), HasSSE4a(false), HasFMA4(false),
Craig Topperf561a9562012-06-09 22:24:14 +00001445 HasFMA(false), HasXOP(false), CPU(CK_Generic) {
Eli Friedman803acb32011-12-22 03:51:45 +00001446 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001447 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001448 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001449 virtual unsigned getFloatEvalMethod() const {
1450 // X87 evaluates with 80 bits "long double" precision.
1451 return SSELevel == NoSSE ? 2 : 0;
1452 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001453 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1454 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001455 Records = BuiltinInfo;
1456 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001457 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001458 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001459 unsigned &NumNames) const {
1460 Names = GCCRegNames;
1461 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001462 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001463 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001464 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001465 Aliases = 0;
1466 NumAliases = 0;
1467 }
1468 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1469 unsigned &NumNames) const {
1470 Names = AddlRegNames;
1471 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001472 }
Anders Carlsson58436352009-02-28 17:11:49 +00001473 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001474 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001475 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001476 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001477 return "~{dirflag},~{fpsr},~{flags}";
1478 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001479 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001480 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001481 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00001482 StringRef Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001483 bool Enabled) const;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001484 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001485 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001486 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001487 virtual const char* getABI() const {
Craig Topper23b92192012-01-09 09:19:09 +00001488 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001489 return "avx";
1490 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1491 return "no-mmx";
1492 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001493 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001494 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001495 CPU = llvm::StringSwitch<CPUKind>(Name)
1496 .Case("i386", CK_i386)
1497 .Case("i486", CK_i486)
1498 .Case("winchip-c6", CK_WinChipC6)
1499 .Case("winchip2", CK_WinChip2)
1500 .Case("c3", CK_C3)
1501 .Case("i586", CK_i586)
1502 .Case("pentium", CK_Pentium)
1503 .Case("pentium-mmx", CK_PentiumMMX)
1504 .Case("i686", CK_i686)
1505 .Case("pentiumpro", CK_PentiumPro)
1506 .Case("pentium2", CK_Pentium2)
1507 .Case("pentium3", CK_Pentium3)
1508 .Case("pentium3m", CK_Pentium3M)
1509 .Case("pentium-m", CK_PentiumM)
1510 .Case("c3-2", CK_C3_2)
1511 .Case("yonah", CK_Yonah)
1512 .Case("pentium4", CK_Pentium4)
1513 .Case("pentium4m", CK_Pentium4M)
1514 .Case("prescott", CK_Prescott)
1515 .Case("nocona", CK_Nocona)
1516 .Case("core2", CK_Core2)
1517 .Case("penryn", CK_Penryn)
1518 .Case("atom", CK_Atom)
1519 .Case("corei7", CK_Corei7)
1520 .Case("corei7-avx", CK_Corei7AVX)
1521 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001522 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001523 .Case("k6", CK_K6)
1524 .Case("k6-2", CK_K6_2)
1525 .Case("k6-3", CK_K6_3)
1526 .Case("athlon", CK_Athlon)
1527 .Case("athlon-tbird", CK_AthlonThunderbird)
1528 .Case("athlon-4", CK_Athlon4)
1529 .Case("athlon-xp", CK_AthlonXP)
1530 .Case("athlon-mp", CK_AthlonMP)
1531 .Case("athlon64", CK_Athlon64)
1532 .Case("athlon64-sse3", CK_Athlon64SSE3)
1533 .Case("athlon-fx", CK_AthlonFX)
1534 .Case("k8", CK_K8)
1535 .Case("k8-sse3", CK_K8SSE3)
1536 .Case("opteron", CK_Opteron)
1537 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001538 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001539 .Case("btver1", CK_BTVER1)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001540 .Case("bdver1", CK_BDVER1)
1541 .Case("bdver2", CK_BDVER2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001542 .Case("x86-64", CK_x86_64)
1543 .Case("geode", CK_Geode)
1544 .Default(CK_Generic);
1545
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001546 // Perform any per-CPU checks necessary to determine if this CPU is
1547 // acceptable.
1548 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1549 // invalid without explaining *why*.
1550 switch (CPU) {
1551 case CK_Generic:
1552 // No processor selected!
1553 return false;
1554
1555 case CK_i386:
1556 case CK_i486:
1557 case CK_WinChipC6:
1558 case CK_WinChip2:
1559 case CK_C3:
1560 case CK_i586:
1561 case CK_Pentium:
1562 case CK_PentiumMMX:
1563 case CK_i686:
1564 case CK_PentiumPro:
1565 case CK_Pentium2:
1566 case CK_Pentium3:
1567 case CK_Pentium3M:
1568 case CK_PentiumM:
1569 case CK_Yonah:
1570 case CK_C3_2:
1571 case CK_Pentium4:
1572 case CK_Pentium4M:
1573 case CK_Prescott:
1574 case CK_K6:
1575 case CK_K6_2:
1576 case CK_K6_3:
1577 case CK_Athlon:
1578 case CK_AthlonThunderbird:
1579 case CK_Athlon4:
1580 case CK_AthlonXP:
1581 case CK_AthlonMP:
1582 case CK_Geode:
1583 // Only accept certain architectures when compiling in 32-bit mode.
1584 if (PointerWidth != 32)
1585 return false;
1586
1587 // Fallthrough
1588 case CK_Nocona:
1589 case CK_Core2:
1590 case CK_Penryn:
1591 case CK_Atom:
1592 case CK_Corei7:
1593 case CK_Corei7AVX:
1594 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001595 case CK_CoreAVX2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001596 case CK_Athlon64:
1597 case CK_Athlon64SSE3:
1598 case CK_AthlonFX:
1599 case CK_K8:
1600 case CK_K8SSE3:
1601 case CK_Opteron:
1602 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001603 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001604 case CK_BTVER1:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001605 case CK_BDVER1:
1606 case CK_BDVER2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001607 case CK_x86_64:
1608 return true;
1609 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001610 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001611 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001612};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001613
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001614void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001615 // FIXME: This should not be here.
1616 Features["3dnow"] = false;
1617 Features["3dnowa"] = false;
1618 Features["mmx"] = false;
1619 Features["sse"] = false;
1620 Features["sse2"] = false;
1621 Features["sse3"] = false;
1622 Features["ssse3"] = false;
1623 Features["sse41"] = false;
1624 Features["sse42"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00001625 Features["sse4a"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001626 Features["aes"] = false;
Craig Topper3f122a72012-05-31 05:18:48 +00001627 Features["pclmul"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001628 Features["avx"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00001629 Features["avx2"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00001630 Features["lzcnt"] = false;
1631 Features["bmi"] = false;
1632 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00001633 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00001634 Features["fma4"] = false;
Craig Topperbba778b2012-06-03 21:46:30 +00001635 Features["fma"] = false;
Craig Topperf561a9562012-06-09 22:24:14 +00001636 Features["xop"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001637
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001638 // FIXME: This *really* should not be here.
1639
1640 // X86_64 always has SSE2.
1641 if (PointerWidth == 64)
1642 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1643
Chandler Carruth212334f2011-09-28 08:55:37 +00001644 switch (CPU) {
1645 case CK_Generic:
1646 case CK_i386:
1647 case CK_i486:
1648 case CK_i586:
1649 case CK_Pentium:
1650 case CK_i686:
1651 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00001652 break;
1653 case CK_PentiumMMX:
1654 case CK_Pentium2:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001655 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001656 break;
1657 case CK_Pentium3:
1658 case CK_Pentium3M:
Eli Friedman33465822011-07-08 23:31:17 +00001659 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001660 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001661 break;
1662 case CK_PentiumM:
1663 case CK_Pentium4:
1664 case CK_Pentium4M:
1665 case CK_x86_64:
Eli Friedman33465822011-07-08 23:31:17 +00001666 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001667 setFeatureEnabled(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001668 break;
1669 case CK_Yonah:
1670 case CK_Prescott:
1671 case CK_Nocona:
Eli Friedman33465822011-07-08 23:31:17 +00001672 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001673 setFeatureEnabled(Features, "sse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001674 break;
1675 case CK_Core2:
Eli Friedman33465822011-07-08 23:31:17 +00001676 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001677 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001678 break;
1679 case CK_Penryn:
Eli Friedman33465822011-07-08 23:31:17 +00001680 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramer6dced3b2012-01-04 14:36:57 +00001681 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001682 break;
1683 case CK_Atom:
Eli Friedman33465822011-07-08 23:31:17 +00001684 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00001685 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001686 break;
1687 case CK_Corei7:
Eli Friedman33465822011-07-08 23:31:17 +00001688 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001689 setFeatureEnabled(Features, "sse4", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001690 break;
1691 case CK_Corei7AVX:
1692 case CK_CoreAVXi:
Eli Friedman33465822011-07-08 23:31:17 +00001693 setFeatureEnabled(Features, "mmx", true);
Craig Topper5f365e92012-04-26 07:31:30 +00001694 setFeatureEnabled(Features, "avx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001695 setFeatureEnabled(Features, "aes", true);
Craig Topper3f122a72012-05-31 05:18:48 +00001696 setFeatureEnabled(Features, "pclmul", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001697 break;
Craig Topper865fff52011-12-17 19:55:21 +00001698 case CK_CoreAVX2:
1699 setFeatureEnabled(Features, "mmx", true);
Craig Topper5f365e92012-04-26 07:31:30 +00001700 setFeatureEnabled(Features, "avx2", true);
Craig Topper865fff52011-12-17 19:55:21 +00001701 setFeatureEnabled(Features, "aes", true);
Craig Topper3f122a72012-05-31 05:18:48 +00001702 setFeatureEnabled(Features, "pclmul", true);
Craig Topper22967d42011-12-25 05:06:45 +00001703 setFeatureEnabled(Features, "lzcnt", true);
1704 setFeatureEnabled(Features, "bmi", true);
1705 setFeatureEnabled(Features, "bmi2", true);
Craig Topperbba778b2012-06-03 21:46:30 +00001706 setFeatureEnabled(Features, "fma", true);
Craig Topper865fff52011-12-17 19:55:21 +00001707 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001708 case CK_K6:
1709 case CK_WinChipC6:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001710 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001711 break;
1712 case CK_K6_2:
1713 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00001714 case CK_WinChip2:
1715 case CK_C3:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001716 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001717 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00001718 case CK_Athlon:
1719 case CK_AthlonThunderbird:
1720 case CK_Geode:
1721 setFeatureEnabled(Features, "3dnowa", true);
1722 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001723 case CK_Athlon4:
1724 case CK_AthlonXP:
1725 case CK_AthlonMP:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001726 setFeatureEnabled(Features, "sse", true);
1727 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001728 break;
1729 case CK_K8:
1730 case CK_Opteron:
1731 case CK_Athlon64:
1732 case CK_AthlonFX:
Mike Stump11289f42009-09-09 15:08:12 +00001733 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001734 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001735 break;
1736 case CK_K8SSE3:
1737 case CK_OpteronSSE3:
1738 case CK_Athlon64SSE3:
Roman Divackyce253d82011-10-30 13:47:56 +00001739 setFeatureEnabled(Features, "sse3", true);
1740 setFeatureEnabled(Features, "3dnowa", true);
1741 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00001742 case CK_AMDFAM10:
Roman Divackydacbfe42010-12-29 13:28:29 +00001743 setFeatureEnabled(Features, "sse3", true);
Roman Divackyce253d82011-10-30 13:47:56 +00001744 setFeatureEnabled(Features, "sse4a", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001745 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001746 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00001747 case CK_BTVER1:
1748 setFeatureEnabled(Features, "ssse3", true);
1749 setFeatureEnabled(Features, "sse4a", true);
Craig Topper9ee12502012-05-30 05:54:54 +00001750 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001751 case CK_BDVER1:
1752 case CK_BDVER2:
Craig Toppereb590aa2012-05-01 07:18:03 +00001753 setFeatureEnabled(Features, "avx", true);
Craig Topperf561a9562012-06-09 22:24:14 +00001754 setFeatureEnabled(Features, "xop", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001755 setFeatureEnabled(Features, "aes", true);
Craig Topper3f122a72012-05-31 05:18:48 +00001756 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001757 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001758 case CK_C3_2:
Eli Friedman33465822011-07-08 23:31:17 +00001759 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001760 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001761 break;
Eli Friedman33465822011-07-08 23:31:17 +00001762 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001763}
1764
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001765bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00001766 StringRef Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001767 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001768 // FIXME: This *really* should not be here. We need some way of translating
1769 // options into llvm subtarget features.
1770 if (!Features.count(Name) &&
1771 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001772 return false;
1773
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001774 // FIXME: this should probably use a switch with fall through.
1775
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001776 if (Enabled) {
1777 if (Name == "mmx")
1778 Features["mmx"] = true;
1779 else if (Name == "sse")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001780 Features["mmx"] = Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001781 else if (Name == "sse2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001782 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001783 else if (Name == "sse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001784 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1785 true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001786 else if (Name == "ssse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001787 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001788 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001789 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001790 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper1de83482011-12-29 16:10:46 +00001791 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1792 Features["popcnt"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001793 else if (Name == "sse4.1")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001794 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001795 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001796 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00001797 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001798 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00001799 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001800 else if (Name == "aes")
Craig Topper1e9e01f2012-06-03 21:56:22 +00001801 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3f122a72012-05-31 05:18:48 +00001802 else if (Name == "pclmul")
Craig Topper1e9e01f2012-06-03 21:56:22 +00001803 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001804 else if (Name == "avx")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001805 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1806 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00001807 Features["popcnt"] = Features["avx"] = true;
Craig Topper865fff52011-12-17 19:55:21 +00001808 else if (Name == "avx2")
1809 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1810 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00001811 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topperbba778b2012-06-03 21:46:30 +00001812 else if (Name == "fma")
1813 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1814 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1815 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topperffdb46c2011-12-30 07:33:42 +00001816 else if (Name == "fma4")
1817 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1818 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper9ee12502012-05-30 05:54:54 +00001819 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1820 Features["fma4"] = true;
Craig Topperf561a9562012-06-09 22:24:14 +00001821 else if (Name == "xop")
1822 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1823 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1824 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1825 Features["fma4"] = Features["xop"] = true;
Roman Divackyce253d82011-10-30 13:47:56 +00001826 else if (Name == "sse4a")
Craig Topperffdb46c2011-12-30 07:33:42 +00001827 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper9ee12502012-05-30 05:54:54 +00001828 Features["sse4a"] = true;
Craig Topper22967d42011-12-25 05:06:45 +00001829 else if (Name == "lzcnt")
1830 Features["lzcnt"] = true;
1831 else if (Name == "bmi")
1832 Features["bmi"] = true;
1833 else if (Name == "bmi2")
1834 Features["bmi2"] = true;
Craig Topper1de83482011-12-29 16:10:46 +00001835 else if (Name == "popcnt")
1836 Features["popcnt"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001837 } else {
1838 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00001839 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001840 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001841 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001842 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper12c9df32012-06-03 22:23:42 +00001843 Features["sse4a"] = Features["avx"] = Features["avx2"] =
1844 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperf561a9562012-06-09 22:24:14 +00001845 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001846 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001847 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper1e9e01f2012-06-03 21:56:22 +00001848 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper12c9df32012-06-03 22:23:42 +00001849 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperf561a9562012-06-09 22:24:14 +00001850 Features["fma4"] = Features["aes"] = Features["pclmul"] =
1851 Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001852 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001853 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper12c9df32012-06-03 22:23:42 +00001854 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperf561a9562012-06-09 22:24:14 +00001855 Features["avx2"] = Features["fma"] = Features["fma4"] =
1856 Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001857 else if (Name == "ssse3")
Craig Topper12c9df32012-06-03 22:23:42 +00001858 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1859 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001860 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper12c9df32012-06-03 22:23:42 +00001861 Features["sse41"] = Features["sse42"] = Features["avx"] =
1862 Features["avx2"] = Features["fma"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001863 else if (Name == "sse4.2")
Craig Topper12c9df32012-06-03 22:23:42 +00001864 Features["sse42"] = Features["avx"] = Features["avx2"] =
1865 Features["fma"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001866 else if (Name == "3dnow")
1867 Features["3dnow"] = Features["3dnowa"] = false;
1868 else if (Name == "3dnowa")
1869 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001870 else if (Name == "aes")
1871 Features["aes"] = false;
Craig Topper3f122a72012-05-31 05:18:48 +00001872 else if (Name == "pclmul")
1873 Features["pclmul"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001874 else if (Name == "avx")
Craig Topperbba778b2012-06-03 21:46:30 +00001875 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperf561a9562012-06-09 22:24:14 +00001876 Features["fma4"] = Features["xop"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00001877 else if (Name == "avx2")
1878 Features["avx2"] = false;
Craig Topperbba778b2012-06-03 21:46:30 +00001879 else if (Name == "fma")
1880 Features["fma"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00001881 else if (Name == "sse4a")
Craig Topperf561a9562012-06-09 22:24:14 +00001882 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00001883 else if (Name == "lzcnt")
1884 Features["lzcnt"] = false;
1885 else if (Name == "bmi")
1886 Features["bmi"] = false;
1887 else if (Name == "bmi2")
1888 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00001889 else if (Name == "popcnt")
1890 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00001891 else if (Name == "fma4")
Craig Topperf561a9562012-06-09 22:24:14 +00001892 Features["fma4"] = Features["xop"] = false;
1893 else if (Name == "xop")
1894 Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001895 }
1896
1897 return true;
1898}
1899
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001900/// HandleTargetOptions - Perform initialization based on the user
1901/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001902void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001903 // Remember the maximum enabled sselevel.
1904 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1905 // Ignore disabled features.
1906 if (Features[i][0] == '-')
1907 continue;
1908
Benjamin Kramer27402c62012-03-05 15:10:44 +00001909 StringRef Feature = StringRef(Features[i]).substr(1);
1910
1911 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00001912 HasAES = true;
1913 continue;
1914 }
1915
Craig Topper3f122a72012-05-31 05:18:48 +00001916 if (Feature == "pclmul") {
1917 HasPCLMUL = true;
1918 continue;
1919 }
1920
Benjamin Kramer27402c62012-03-05 15:10:44 +00001921 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00001922 HasLZCNT = true;
1923 continue;
1924 }
1925
Benjamin Kramer27402c62012-03-05 15:10:44 +00001926 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00001927 HasBMI = true;
1928 continue;
1929 }
1930
Benjamin Kramer27402c62012-03-05 15:10:44 +00001931 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00001932 HasBMI2 = true;
1933 continue;
1934 }
1935
Benjamin Kramer27402c62012-03-05 15:10:44 +00001936 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00001937 HasPOPCNT = true;
1938 continue;
1939 }
1940
Benjamin Kramer8ac9c222012-05-29 17:48:39 +00001941 if (Feature == "sse4a") {
1942 HasSSE4a = true;
1943 continue;
1944 }
1945
Benjamin Kramer27402c62012-03-05 15:10:44 +00001946 if (Feature == "fma4") {
Craig Topperffdb46c2011-12-30 07:33:42 +00001947 HasFMA4 = true;
1948 continue;
1949 }
1950
Craig Topperbba778b2012-06-03 21:46:30 +00001951 if (Feature == "fma") {
1952 HasFMA = true;
1953 continue;
1954 }
1955
Craig Topperf561a9562012-06-09 22:24:14 +00001956 if (Feature == "xop") {
1957 HasXOP = true;
1958 continue;
1959 }
1960
Daniel Dunbar979586e2009-11-11 09:38:56 +00001961 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00001962 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper23b92192012-01-09 09:19:09 +00001963 .Case("avx2", AVX2)
1964 .Case("avx", AVX)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001965 .Case("sse42", SSE42)
1966 .Case("sse41", SSE41)
1967 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001968 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001969 .Case("sse2", SSE2)
1970 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00001971 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001972 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001973
Eli Friedman33465822011-07-08 23:31:17 +00001974 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00001975 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00001976 .Case("3dnowa", AMD3DNowAthlon)
1977 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00001978 .Case("mmx", MMX)
1979 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001980
Eli Friedman33465822011-07-08 23:31:17 +00001981 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001982 }
Eli Friedman33465822011-07-08 23:31:17 +00001983
1984 // Don't tell the backend if we're turning off mmx; it will end up disabling
1985 // SSE, which we don't want.
1986 std::vector<std::string>::iterator it;
1987 it = std::find(Features.begin(), Features.end(), "-mmx");
1988 if (it != Features.end())
1989 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001990}
Chris Lattnerecd49032009-03-02 22:27:17 +00001991
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001992/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1993/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001994void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001995 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001996 // Target identification.
1997 if (PointerWidth == 64) {
Aaron Ballmanbc9e0432012-03-14 20:50:57 +00001998 if (getLongWidth() == 64) {
1999 Builder.defineMacro("_LP64");
2000 Builder.defineMacro("__LP64__");
2001 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002002 Builder.defineMacro("__amd64__");
2003 Builder.defineMacro("__amd64");
2004 Builder.defineMacro("__x86_64");
2005 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002006 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002007 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002008 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002009
Chris Lattnerecd49032009-03-02 22:27:17 +00002010 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002011 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2012 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002013 switch (CPU) {
2014 case CK_Generic:
2015 break;
2016 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002017 // The rest are coming from the i386 define above.
2018 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002019 break;
2020 case CK_i486:
2021 case CK_WinChipC6:
2022 case CK_WinChip2:
2023 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002024 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002025 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002026 case CK_PentiumMMX:
2027 Builder.defineMacro("__pentium_mmx__");
2028 Builder.defineMacro("__tune_pentium_mmx__");
2029 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002030 case CK_i586:
2031 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002032 defineCPUMacros(Builder, "i586");
2033 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002034 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002035 case CK_Pentium3:
2036 case CK_Pentium3M:
2037 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002038 Builder.defineMacro("__tune_pentium3__");
2039 // Fallthrough
2040 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002041 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002042 Builder.defineMacro("__tune_pentium2__");
2043 // Fallthrough
2044 case CK_PentiumPro:
2045 Builder.defineMacro("__tune_i686__");
2046 Builder.defineMacro("__tune_pentiumpro__");
2047 // Fallthrough
2048 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002049 Builder.defineMacro("__i686");
2050 Builder.defineMacro("__i686__");
2051 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2052 Builder.defineMacro("__pentiumpro");
2053 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002054 break;
2055 case CK_Pentium4:
2056 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002057 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002058 break;
2059 case CK_Yonah:
2060 case CK_Prescott:
2061 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002062 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002063 break;
2064 case CK_Core2:
2065 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002066 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002067 break;
2068 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002069 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002070 break;
2071 case CK_Corei7:
2072 case CK_Corei7AVX:
2073 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002074 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002075 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002076 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002077 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002078 Builder.defineMacro("__k6_2__");
2079 Builder.defineMacro("__tune_k6_2__");
2080 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002081 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002082 if (CPU != CK_K6_2) { // In case of fallthrough
2083 // FIXME: GCC may be enabling these in cases where some other k6
2084 // architecture is specified but -m3dnow is explicitly provided. The
2085 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002086 Builder.defineMacro("__k6_3__");
2087 Builder.defineMacro("__tune_k6_3__");
2088 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002089 // Fallthrough
2090 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002091 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002092 break;
2093 case CK_Athlon:
2094 case CK_AthlonThunderbird:
2095 case CK_Athlon4:
2096 case CK_AthlonXP:
2097 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002098 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002099 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002100 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002101 Builder.defineMacro("__tune_athlon_sse__");
2102 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002103 break;
2104 case CK_K8:
2105 case CK_K8SSE3:
2106 case CK_x86_64:
2107 case CK_Opteron:
2108 case CK_OpteronSSE3:
2109 case CK_Athlon64:
2110 case CK_Athlon64SSE3:
2111 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002112 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002113 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002114 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002115 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002116 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002117 case CK_BTVER1:
2118 defineCPUMacros(Builder, "btver1");
2119 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002120 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002121 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002122 break;
2123 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002124 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002125 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002127 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002128 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002129 }
Chris Lattner96e43572009-03-02 22:40:39 +00002130
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002131 // Target properties.
2132 Builder.defineMacro("__LITTLE_ENDIAN__");
2133 Builder.defineMacro("__REGISTER_PREFIX__", "");
2134
Chris Lattner6df41af2009-04-19 17:32:33 +00002135 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2136 // functions in glibc header files that use FP Stack inline asm which the
2137 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002138 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002139
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002140 if (HasAES)
2141 Builder.defineMacro("__AES__");
2142
Craig Topper3f122a72012-05-31 05:18:48 +00002143 if (HasPCLMUL)
2144 Builder.defineMacro("__PCLMUL__");
2145
Craig Topper22967d42011-12-25 05:06:45 +00002146 if (HasLZCNT)
2147 Builder.defineMacro("__LZCNT__");
2148
2149 if (HasBMI)
2150 Builder.defineMacro("__BMI__");
2151
2152 if (HasBMI2)
2153 Builder.defineMacro("__BMI2__");
2154
Craig Topper1de83482011-12-29 16:10:46 +00002155 if (HasPOPCNT)
2156 Builder.defineMacro("__POPCNT__");
2157
Benjamin Kramer8ac9c222012-05-29 17:48:39 +00002158 if (HasSSE4a)
2159 Builder.defineMacro("__SSE4A__");
2160
Craig Topperffdb46c2011-12-30 07:33:42 +00002161 if (HasFMA4)
2162 Builder.defineMacro("__FMA4__");
2163
Craig Topperbba778b2012-06-03 21:46:30 +00002164 if (HasFMA)
2165 Builder.defineMacro("__FMA__");
2166
Craig Topperf561a9562012-06-09 22:24:14 +00002167 if (HasXOP)
2168 Builder.defineMacro("__XOP__");
2169
Chris Lattner96e43572009-03-02 22:40:39 +00002170 // Each case falls through to the previous one here.
2171 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002172 case AVX2:
2173 Builder.defineMacro("__AVX2__");
2174 case AVX:
2175 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002176 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002177 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002178 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002179 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002180 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002181 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002182 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002183 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002184 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002185 Builder.defineMacro("__SSE2__");
2186 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002187 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002188 Builder.defineMacro("__SSE__");
2189 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002190 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002191 break;
2192 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002193
Francois Pichet0706d202011-09-17 17:15:52 +00002194 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002195 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002196 case AVX2:
2197 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002198 case SSE42:
2199 case SSE41:
2200 case SSSE3:
2201 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002202 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002203 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002204 break;
2205 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002206 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002207 break;
2208 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002209 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002210 }
2211 }
2212
Anders Carlssone437c682010-01-27 03:47:49 +00002213 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002214 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002215 case AMD3DNowAthlon:
2216 Builder.defineMacro("__3dNOW_A__");
2217 case AMD3DNow:
2218 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002219 case MMX:
2220 Builder.defineMacro("__MMX__");
2221 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002222 break;
2223 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002224}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002225
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002226bool X86TargetInfo::hasFeature(StringRef Feature) const {
2227 return llvm::StringSwitch<bool>(Feature)
2228 .Case("aes", HasAES)
2229 .Case("avx", SSELevel >= AVX)
2230 .Case("avx2", SSELevel >= AVX2)
2231 .Case("bmi", HasBMI)
2232 .Case("bmi2", HasBMI2)
Craig Topperbba778b2012-06-03 21:46:30 +00002233 .Case("fma", HasFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002234 .Case("fma4", HasFMA4)
2235 .Case("lzcnt", HasLZCNT)
2236 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2237 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2238 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002239 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002240 .Case("popcnt", HasPOPCNT)
2241 .Case("sse", SSELevel >= SSE1)
2242 .Case("sse2", SSELevel >= SSE2)
2243 .Case("sse3", SSELevel >= SSE3)
2244 .Case("ssse3", SSELevel >= SSSE3)
2245 .Case("sse41", SSELevel >= SSE41)
2246 .Case("sse42", SSELevel >= SSE42)
Craig Topper3f122a72012-05-31 05:18:48 +00002247 .Case("sse4a", HasSSE4a)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002248 .Case("x86", true)
2249 .Case("x86_32", PointerWidth == 32)
2250 .Case("x86_64", PointerWidth == 64)
Craig Topperf561a9562012-06-09 22:24:14 +00002251 .Case("xop", HasXOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002252 .Default(false);
2253}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002254
Eli Friedman3fd920a2008-08-20 02:34:37 +00002255bool
Anders Carlsson58436352009-02-28 17:11:49 +00002256X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002257 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002258 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002259 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002260 case 'Y': // first letter of a pair:
2261 switch (*(Name+1)) {
2262 default: return false;
2263 case '0': // First SSE register.
2264 case 't': // Any SSE register, when SSE2 is enabled.
2265 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2266 case 'm': // any MMX register, when inter-unit moves enabled.
2267 break; // falls through to setAllowsRegister.
2268 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002269 case 'a': // eax.
2270 case 'b': // ebx.
2271 case 'c': // ecx.
2272 case 'd': // edx.
2273 case 'S': // esi.
2274 case 'D': // edi.
2275 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002276 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002277 case 't': // top of floating point stack.
2278 case 'u': // second from top of floating point stack.
2279 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002280 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002281 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002282 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002283 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2284 case 'l': // "Index" registers: any general register that can be used as an
2285 // index in a base+index memory access.
2286 Info.setAllowsRegister();
2287 return true;
2288 case 'C': // SSE floating point constant.
2289 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002290 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002291 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002292 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002293 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002294 return true;
2295 }
2296}
2297
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002298
Eli Friedman3fd920a2008-08-20 02:34:37 +00002299std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002300X86TargetInfo::convertConstraint(const char *&Constraint) const {
2301 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002302 case 'a': return std::string("{ax}");
2303 case 'b': return std::string("{bx}");
2304 case 'c': return std::string("{cx}");
2305 case 'd': return std::string("{dx}");
2306 case 'S': return std::string("{si}");
2307 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002308 case 'p': // address
2309 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002310 case 't': // top of floating point stack.
2311 return std::string("{st}");
2312 case 'u': // second from top of floating point stack.
2313 return std::string("{st(1)}"); // second from top of floating point stack.
2314 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002315 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002316 }
2317}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002318} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002319
2320namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002321// X86-32 generic target
2322class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002323public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00002324 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2325 DoubleAlign = LongLongAlign = 32;
2326 LongDoubleWidth = 96;
2327 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002328 SuitableAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +00002329 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2330 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames4f4aa1a2011-10-11 00:52:51 +00002331 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002332 SizeType = UnsignedInt;
2333 PtrDiffType = SignedInt;
2334 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002335 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002336
2337 // Use fpret for all types.
2338 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2339 (1 << TargetInfo::Double) |
2340 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002341
2342 // x86-32 has atomics up to 8 bytes
2343 // FIXME: Check that we actually have cmpxchg8b before setting
2344 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2345 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002346 }
2347 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002348 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00002349 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002350
Chris Lattnerd545ad12009-09-23 06:06:36 +00002351 int getEHDataRegisterNumber(unsigned RegNo) const {
2352 if (RegNo == 0) return 0;
2353 if (RegNo == 1) return 2;
2354 return -1;
2355 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002356};
2357} // end anonymous namespace
2358
2359namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002360class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2361public:
2362 NetBSDI386TargetInfo(const std::string &triple) :
2363 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2364 }
2365
2366 virtual unsigned getFloatEvalMethod() const {
2367 // NetBSD defaults to "double" rounding
2368 return 1;
2369 }
2370};
2371} // end anonymous namespace
2372
2373namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002374class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2375public:
2376 OpenBSDI386TargetInfo(const std::string& triple) :
2377 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2378 SizeType = UnsignedLong;
2379 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002380 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002381 }
2382};
2383} // end anonymous namespace
2384
2385namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00002386class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002387public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002388 DarwinI386TargetInfo(const std::string& triple) :
2389 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002390 LongDoubleWidth = 128;
2391 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002392 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00002393 SizeType = UnsignedLong;
2394 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00002395 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2396 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002397 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00002398 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00002399 }
2400
Eli Friedman3fd920a2008-08-20 02:34:37 +00002401};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002402} // end anonymous namespace
2403
2404namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002405// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002406class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002407public:
2408 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002409 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00002410 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00002411 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00002412 DoubleAlign = LongLongAlign = 64;
2413 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovd7e4a092009-12-19 02:05:07 +00002414 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002415 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002416 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002417 virtual void getTargetDefines(const LangOptions &Opts,
2418 MacroBuilder &Builder) const {
2419 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2420 }
2421};
2422} // end anonymous namespace
2423
2424namespace {
2425
2426// x86-32 Windows Visual Studio target
2427class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2428public:
2429 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2430 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002431 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002432 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2433 }
2434 virtual void getTargetDefines(const LangOptions &Opts,
2435 MacroBuilder &Builder) const {
2436 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2437 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2438 // The value of the following reflects processor type.
2439 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2440 // We lost the original triple, so we use the default.
2441 Builder.defineMacro("_M_IX86", "600");
2442 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002443};
2444} // end anonymous namespace
2445
2446namespace {
2447// x86-32 MinGW target
2448class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2449public:
2450 MinGWX86_32TargetInfo(const std::string& triple)
2451 : WindowsX86_32TargetInfo(triple) {
2452 }
2453 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002454 MacroBuilder &Builder) const {
2455 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002456 DefineStd(Builder, "WIN32", Opts);
2457 DefineStd(Builder, "WINNT", Opts);
2458 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002459 Builder.defineMacro("__MSVCRT__");
2460 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002461
2462 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2463 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002464 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002465 // Provide "as-is" __declspec.
2466 Builder.defineMacro("__declspec", "__declspec");
2467 else
2468 // Provide alias of __attribute__ like mingw32-gcc.
2469 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002470 }
2471};
2472} // end anonymous namespace
2473
2474namespace {
2475// x86-32 Cygwin target
2476class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2477public:
2478 CygwinX86_32TargetInfo(const std::string& triple)
2479 : X86_32TargetInfo(triple) {
2480 TLSSupported = false;
2481 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002482 DoubleAlign = LongLongAlign = 64;
2483 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2484 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002485 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002486 }
2487 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002488 MacroBuilder &Builder) const {
2489 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2490 Builder.defineMacro("__CYGWIN__");
2491 Builder.defineMacro("__CYGWIN32__");
2492 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00002493 if (Opts.CPlusPlus)
2494 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00002495 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002496};
2497} // end anonymous namespace
2498
2499namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00002500// x86-32 Haiku target
2501class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2502public:
2503 HaikuX86_32TargetInfo(const std::string& triple)
2504 : X86_32TargetInfo(triple) {
2505 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00002506 IntPtrType = SignedLong;
2507 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00002508 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00002509 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00002510 virtual void getTargetDefines(const LangOptions &Opts,
2511 MacroBuilder &Builder) const {
2512 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2513 Builder.defineMacro("__INTEL__");
2514 Builder.defineMacro("__HAIKU__");
2515 }
2516};
2517} // end anonymous namespace
2518
Douglas Gregor9fabd852011-07-01 22:41:14 +00002519// RTEMS Target
2520template<typename Target>
2521class RTEMSTargetInfo : public OSTargetInfo<Target> {
2522protected:
2523 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2524 MacroBuilder &Builder) const {
2525 // RTEMS defines; list based off of gcc output
2526
Douglas Gregor9fabd852011-07-01 22:41:14 +00002527 Builder.defineMacro("__rtems__");
2528 Builder.defineMacro("__ELF__");
2529 }
2530public:
2531 RTEMSTargetInfo(const std::string &triple)
2532 : OSTargetInfo<Target>(triple) {
2533 this->UserLabelPrefix = "";
2534
2535 llvm::Triple Triple(triple);
2536 switch (Triple.getArch()) {
2537 default:
2538 case llvm::Triple::x86:
2539 // this->MCountName = ".mcount";
2540 break;
2541 case llvm::Triple::mips:
2542 case llvm::Triple::mipsel:
2543 case llvm::Triple::ppc:
2544 case llvm::Triple::ppc64:
2545 // this->MCountName = "_mcount";
2546 break;
2547 case llvm::Triple::arm:
2548 // this->MCountName = "__mcount";
2549 break;
2550 }
2551
2552 }
2553};
2554
2555namespace {
2556// x86-32 RTEMS target
2557class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2558public:
2559 RTEMSX86_32TargetInfo(const std::string& triple)
2560 : X86_32TargetInfo(triple) {
2561 SizeType = UnsignedLong;
2562 IntPtrType = SignedLong;
2563 PtrDiffType = SignedLong;
2564 this->UserLabelPrefix = "";
2565 }
2566 virtual void getTargetDefines(const LangOptions &Opts,
2567 MacroBuilder &Builder) const {
2568 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2569 Builder.defineMacro("__INTEL__");
2570 Builder.defineMacro("__rtems__");
2571 }
2572};
2573} // end anonymous namespace
2574
Chris Lattnerb986aba2010-04-11 19:29:39 +00002575namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002576// x86-64 generic target
2577class X86_64TargetInfo : public X86TargetInfo {
2578public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002579 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00002580 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00002581 LongDoubleWidth = 128;
2582 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00002583 LargeArrayMinWidth = 128;
2584 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002585 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00002586 IntMaxType = SignedLong;
2587 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00002588 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002589 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00002590
Eli Friedman873f65a2008-08-21 00:13:15 +00002591 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2592 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002593 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002594
2595 // Use fpret only for long double.
2596 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002597
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00002598 // Use fp2ret for _Complex long double.
2599 ComplexLongDoubleUsesFP2Ret = true;
2600
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002601 // x86-64 has atomics up to 16 bytes.
2602 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2603 // on CPUs with cmpxchg16b
2604 MaxAtomicPromoteWidth = 128;
2605 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00002606 }
Anders Carlssona7408e72007-10-13 00:45:48 +00002607 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002608 return "typedef struct __va_list_tag {"
2609 " unsigned gp_offset;"
2610 " unsigned fp_offset;"
2611 " void* overflow_arg_area;"
2612 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00002613 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00002614 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002615 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002616
Chris Lattnerd545ad12009-09-23 06:06:36 +00002617 int getEHDataRegisterNumber(unsigned RegNo) const {
2618 if (RegNo == 0) return 0;
2619 if (RegNo == 1) return 1;
2620 return -1;
2621 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002622};
2623} // end anonymous namespace
2624
2625namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002626// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002627class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002628public:
2629 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002630 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002631 TLSSupported = false;
2632 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00002633 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002634 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00002635 IntMaxType = SignedLongLong;
2636 UIntMaxType = UnsignedLongLong;
2637 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00002638 SizeType = UnsignedLongLong;
2639 PtrDiffType = SignedLongLong;
2640 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00002641 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002642 }
2643 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002644 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002645 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002646 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002647 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00002648 virtual const char *getVAListDeclaration() const {
2649 return "typedef char* __builtin_va_list;";
2650 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002651};
2652} // end anonymous namespace
2653
2654namespace {
2655// x86-64 Windows Visual Studio target
2656class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2657public:
2658 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2659 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002660 LongDoubleWidth = LongDoubleAlign = 64;
2661 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002662 }
2663 virtual void getTargetDefines(const LangOptions &Opts,
2664 MacroBuilder &Builder) const {
2665 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2666 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002667 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002668 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002669 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002670};
2671} // end anonymous namespace
2672
2673namespace {
2674// x86-64 MinGW target
2675class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2676public:
2677 MinGWX86_64TargetInfo(const std::string& triple)
2678 : WindowsX86_64TargetInfo(triple) {
2679 }
2680 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002681 MacroBuilder &Builder) const {
2682 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002683 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002684 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00002685 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002686 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002687
2688 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2689 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002690 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002691 // Provide "as-is" __declspec.
2692 Builder.defineMacro("__declspec", "__declspec");
2693 else
2694 // Provide alias of __attribute__ like mingw32-gcc.
2695 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002696 }
2697};
2698} // end anonymous namespace
2699
2700namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00002701class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2702public:
Mike Stump11289f42009-09-09 15:08:12 +00002703 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00002704 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2705 Int64Type = SignedLongLong;
2706 }
2707};
2708} // end anonymous namespace
2709
2710namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00002711class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2712public:
Mike Stump11289f42009-09-09 15:08:12 +00002713 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00002714 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2715 IntMaxType = SignedLongLong;
2716 UIntMaxType = UnsignedLongLong;
2717 Int64Type = SignedLongLong;
2718 }
2719};
2720} // end anonymous namespace
2721
2722namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002723class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002724 // Possible FPU choices.
2725 enum FPUMode {
2726 NoFPU,
2727 VFP2FPU,
2728 VFP3FPU,
2729 NeonFPU
2730 };
2731
2732 static bool FPUModeIsVFP(FPUMode Mode) {
2733 return Mode >= VFP2FPU && Mode <= NeonFPU;
2734 }
2735
2736 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2737 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002738
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002739 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002740
2741 unsigned FPU : 3;
2742
Daniel Dunbar893d4752009-12-19 04:15:38 +00002743 unsigned IsThumb : 1;
2744
2745 // Initialized via features.
2746 unsigned SoftFloat : 1;
2747 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002748
Chris Lattner5cc15e02010-03-03 19:03:45 +00002749 static const Builtin::Info BuiltinInfo[];
2750
Chris Lattner17df24e2008-04-21 18:56:49 +00002751public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002752 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002753 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002754 {
Eli Friedman803acb32011-12-22 03:51:45 +00002755 BigEndian = false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002756 SizeType = UnsignedInt;
2757 PtrDiffType = SignedInt;
James Molloyc445be42011-11-23 13:35:08 +00002758 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2759 WCharType = UnsignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002760
Chris Lattner1a8f3942010-04-23 16:29:58 +00002761 // {} in inline assembly are neon specifiers, not assembly variant
2762 // specifiers.
2763 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002764
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002765 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00002766 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00002767 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002768 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2769 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002770 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2771 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002772 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00002773 } else {
2774 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2775 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002776 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00002777 }
John McCall86353412010-08-21 22:46:04 +00002778
2779 // ARM targets default to using the ARM C++ ABI.
2780 CXXABI = CXXABI_ARM;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002781
2782 // ARM has atomics up to 8 bytes
2783 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2784 MaxAtomicPromoteWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00002785
2786 // Do force alignment of members that follow zero length bitfields. If
2787 // the alignment of the zero-length bitfield is greater than the member
2788 // that follows it, `bar', `bar' will be aligned as the type of the
2789 // zero length bitfield.
2790 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00002791 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002792 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002793 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002794 ABI = Name;
2795
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002796 // The defaults (above) are for AAPCS, check if we need to change them.
2797 //
2798 // FIXME: We need support for -meabi... we could just mangle it into the
2799 // name.
2800 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002801 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002802 SizeType = UnsignedLong;
2803
James Molloyc445be42011-11-23 13:35:08 +00002804 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2805 WCharType = SignedInt;
2806
Daniel Dunbarf8125062010-04-22 16:14:54 +00002807 // Do not respect the alignment of bit-field types when laying out
2808 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2809 UseBitFieldTypeAlignment = false;
2810
Chad Rosier18903ee2011-08-04 01:21:14 +00002811 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00002812 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2813 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00002814 ZeroLengthBitfieldBoundary = 32;
2815
Daniel Dunbar03184792009-09-22 21:44:58 +00002816 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002817 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2818 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002819 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson1957a2f2011-06-29 16:09:20 +00002820 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002821 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002822 } else {
2823 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00002824 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002825 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002826 }
2827
Chad Rosier99ee7822011-07-26 07:03:04 +00002828 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002829 } else if (Name == "aapcs") {
2830 // FIXME: Enumerated types are variable width in straight AAPCS.
2831 } else if (Name == "aapcs-linux") {
Chad Rosier99ee7822011-07-26 07:03:04 +00002832 ;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002833 } else
2834 return false;
2835
2836 return true;
2837 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00002838
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002839 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002840 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2841 Features["vfp2"] = true;
2842 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2843 Features["neon"] = true;
2844 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002845
Daniel Dunbar893d4752009-12-19 04:15:38 +00002846 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00002847 StringRef Name,
Daniel Dunbar893d4752009-12-19 04:15:38 +00002848 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00002849 if (Name == "soft-float" || Name == "soft-float-abi" ||
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002850 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
2851 Name == "neonfp") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002852 Features[Name] = Enabled;
2853 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00002854 return false;
2855
Daniel Dunbar893d4752009-12-19 04:15:38 +00002856 return true;
2857 }
2858
2859 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002860 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002861 SoftFloat = SoftFloatABI = false;
2862 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2863 if (Features[i] == "+soft-float")
2864 SoftFloat = true;
2865 else if (Features[i] == "+soft-float-abi")
2866 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002867 else if (Features[i] == "+vfp2")
2868 FPU = VFP2FPU;
2869 else if (Features[i] == "+vfp3")
2870 FPU = VFP3FPU;
2871 else if (Features[i] == "+neon")
2872 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002873 }
2874
2875 // Remove front-end specific options which the backend handles differently.
2876 std::vector<std::string>::iterator it;
2877 it = std::find(Features.begin(), Features.end(), "+soft-float");
2878 if (it != Features.end())
2879 Features.erase(it);
2880 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2881 if (it != Features.end())
2882 Features.erase(it);
2883 }
2884
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002885 virtual bool hasFeature(StringRef Feature) const {
2886 return llvm::StringSwitch<bool>(Feature)
2887 .Case("arm", true)
2888 .Case("softfloat", SoftFloat)
2889 .Case("thumb", IsThumb)
2890 .Case("neon", FPU == NeonFPU && !SoftFloat &&
2891 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
2892 .Default(false);
2893 }
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002894 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002895 return llvm::StringSwitch<const char*>(Name)
2896 .Cases("arm8", "arm810", "4")
2897 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2898 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2899 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2900 .Case("ep9312", "4T")
2901 .Cases("arm10tdmi", "arm1020t", "5T")
2902 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2903 .Case("arm926ej-s", "5TEJ")
2904 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2905 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002906 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002907 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002908 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002909 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2910 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00002911 .Case("cortex-m3", "7M")
Jim Grosbach903e63f2012-03-29 19:53:34 +00002912 .Case("cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00002913 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002914 .Default(0);
2915 }
2916 virtual bool setCPU(const std::string &Name) {
2917 if (!getCPUDefineSuffix(Name))
2918 return false;
2919
2920 CPU = Name;
2921 return true;
2922 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002923 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002924 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002925 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002926 Builder.defineMacro("__arm");
2927 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002928
Chris Lattnerecd49032009-03-02 22:27:17 +00002929 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002930 Builder.defineMacro("__ARMEL__");
2931 Builder.defineMacro("__LITTLE_ENDIAN__");
2932 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002933
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002934 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002935 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002936
Mike Stump9d54bd72009-04-08 02:07:04 +00002937 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002938
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002939 // FIXME: It's more complicated than this and we don't really support
2940 // interworking.
2941 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002942 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002943
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002944 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002945 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002946
Daniel Dunbar893d4752009-12-19 04:15:38 +00002947 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002948 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002949
2950 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002951 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002952
Bob Wilson19c1b882011-05-13 18:56:03 +00002953 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002954 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002955 Builder.defineMacro("__THUMBEL__");
2956 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002957 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002958 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002959 }
2960
2961 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002962 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002963
2964 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002965 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002966
2967 // This only gets set when Neon instructions are actually available, unlike
2968 // the VFP define, hence the soft float and arch check. This is subtly
2969 // different from gcc, we follow the intent which was that it should be set
2970 // when Neon instructions are actually available.
Bob Wilson19c1b882011-05-13 18:56:03 +00002971 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002972 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002973 }
2974 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2975 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002976 Records = BuiltinInfo;
2977 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002978 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00002979 virtual bool isCLZForZeroUndef() const { return false; }
Chris Lattner17df24e2008-04-21 18:56:49 +00002980 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002981 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002982 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002983 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002984 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002985 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002986 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002987 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002988 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002989 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002990 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002991 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002992 case 'l': // r0-r7
2993 case 'h': // r8-r15
2994 case 'w': // VFP Floating point register single precision
2995 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002996 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002997 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00002998 case 'Q': // A memory address that is a single base register.
2999 Info.setAllowsMemory();
3000 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003001 case 'U': // a memory reference...
3002 switch (Name[1]) {
3003 case 'q': // ...ARMV4 ldrsb
3004 case 'v': // ...VFP load/store (reg+constant offset)
3005 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00003006 case 't': // address valid for load/store opaque types wider
3007 // than 128-bits
3008 case 'n': // valid address for Neon doubleword vector load/store
3009 case 'm': // valid address for Neon element and structure load/store
3010 case 's': // valid address for non-offset loads/stores of quad-word
3011 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003012 Info.setAllowsMemory();
3013 Name++;
3014 return true;
3015 }
Nate Begeman2908fa02008-04-22 05:03:19 +00003016 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003017 return false;
3018 }
Evan Chengd863adb2011-06-16 19:13:15 +00003019 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003020 std::string R;
3021 switch (*Constraint) {
3022 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00003023 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003024 Constraint++;
3025 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00003026 case 'p': // 'p' should be translated to 'r' by default.
3027 R = std::string("r");
3028 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003029 default:
3030 return std::string(1, *Constraint);
3031 }
3032 return R;
3033 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003034 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003035 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00003036 return "";
3037 }
3038};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003039
3040const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00003041 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003042 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00003043 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3044
3045 // Float registers
3046 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3047 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3048 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003049 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00003050
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003051 // Double registers
3052 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3053 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00003054 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3055 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003056
3057 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00003058 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3059 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003060};
3061
3062void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00003063 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003064 Names = GCCRegNames;
3065 NumNames = llvm::array_lengthof(GCCRegNames);
3066}
3067
3068const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003069 { { "a1" }, "r0" },
3070 { { "a2" }, "r1" },
3071 { { "a3" }, "r2" },
3072 { { "a4" }, "r3" },
3073 { { "v1" }, "r4" },
3074 { { "v2" }, "r5" },
3075 { { "v3" }, "r6" },
3076 { { "v4" }, "r7" },
3077 { { "v5" }, "r8" },
3078 { { "v6", "rfp" }, "r9" },
3079 { { "sl" }, "r10" },
3080 { { "fp" }, "r11" },
3081 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00003082 { { "r13" }, "sp" },
3083 { { "r14" }, "lr" },
3084 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003085 // The S, D and Q registers overlap, but aren't really aliases; we
3086 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003087};
3088
3089void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3090 unsigned &NumAliases) const {
3091 Aliases = GCCRegAliases;
3092 NumAliases = llvm::array_lengthof(GCCRegAliases);
3093}
Chris Lattner5cc15e02010-03-03 19:03:45 +00003094
3095const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00003096#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00003097#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00003098 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00003099#include "clang/Basic/BuiltinsARM.def"
3100};
Chris Lattner17df24e2008-04-21 18:56:49 +00003101} // end anonymous namespace.
3102
Eli Friedmanf05b7722008-08-20 07:44:10 +00003103namespace {
Mike Stump11289f42009-09-09 15:08:12 +00003104class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00003105 public DarwinTargetInfo<ARMTargetInfo> {
3106protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00003107 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003108 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00003109 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00003110 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00003111
Torok Edwinb2b37c62009-06-30 17:10:35 +00003112public:
Mike Stump11289f42009-09-09 15:08:12 +00003113 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00003114 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3115 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003116 // iOS always has 64-bit atomic instructions.
3117 // FIXME: This should be based off of the target features in ARMTargetInfo.
3118 MaxAtomicInlineWidth = 64;
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00003119 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00003120};
3121} // end anonymous namespace.
3122
Tony Linthicum76329bf2011-12-12 21:14:55 +00003123
3124namespace {
3125// Hexagon abstract base class
3126class HexagonTargetInfo : public TargetInfo {
3127 static const Builtin::Info BuiltinInfo[];
3128 static const char * const GCCRegNames[];
3129 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3130 std::string CPU;
3131public:
3132 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003133 BigEndian = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003134 DescriptionString = ("e-p:32:32:32-"
Sirish Pande11ebc4e2012-05-10 20:19:54 +00003135 "i64:64:64-i32:32:32-i16:16:16-i1:32:32"
3136 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003137
3138 // {} in inline assembly are packet specifiers, not assembly variant
3139 // specifiers.
3140 NoAsmVariants = true;
3141 }
3142
3143 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3144 unsigned &NumRecords) const {
3145 Records = BuiltinInfo;
3146 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3147 }
3148
3149 virtual bool validateAsmConstraint(const char *&Name,
3150 TargetInfo::ConstraintInfo &Info) const {
3151 return true;
3152 }
3153
3154 virtual void getTargetDefines(const LangOptions &Opts,
3155 MacroBuilder &Builder) const;
3156
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003157 virtual bool hasFeature(StringRef Feature) const {
3158 return Feature == "hexagon";
3159 }
3160
Tony Linthicum76329bf2011-12-12 21:14:55 +00003161 virtual const char *getVAListDeclaration() const {
3162 return "typedef char* __builtin_va_list;";
3163 }
3164 virtual void getGCCRegNames(const char * const *&Names,
3165 unsigned &NumNames) const;
3166 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3167 unsigned &NumAliases) const;
3168 virtual const char *getClobbers() const {
3169 return "";
3170 }
Sebastian Pop86500282012-01-13 20:37:10 +00003171
3172 static const char *getHexagonCPUSuffix(StringRef Name) {
3173 return llvm::StringSwitch<const char*>(Name)
3174 .Case("hexagonv2", "2")
3175 .Case("hexagonv3", "3")
3176 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00003177 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00003178 .Default(0);
3179 }
3180
Tony Linthicum76329bf2011-12-12 21:14:55 +00003181 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00003182 if (!getHexagonCPUSuffix(Name))
3183 return false;
3184
Tony Linthicum76329bf2011-12-12 21:14:55 +00003185 CPU = Name;
3186 return true;
3187 }
3188};
3189
3190void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3191 MacroBuilder &Builder) const {
3192 Builder.defineMacro("qdsp6");
3193 Builder.defineMacro("__qdsp6", "1");
3194 Builder.defineMacro("__qdsp6__", "1");
3195
3196 Builder.defineMacro("hexagon");
3197 Builder.defineMacro("__hexagon", "1");
3198 Builder.defineMacro("__hexagon__", "1");
3199
3200 if(CPU == "hexagonv1") {
3201 Builder.defineMacro("__HEXAGON_V1__");
3202 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3203 if(Opts.HexagonQdsp6Compat) {
3204 Builder.defineMacro("__QDSP6_V1__");
3205 Builder.defineMacro("__QDSP6_ARCH__", "1");
3206 }
3207 }
3208 else if(CPU == "hexagonv2") {
3209 Builder.defineMacro("__HEXAGON_V2__");
3210 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3211 if(Opts.HexagonQdsp6Compat) {
3212 Builder.defineMacro("__QDSP6_V2__");
3213 Builder.defineMacro("__QDSP6_ARCH__", "2");
3214 }
3215 }
3216 else if(CPU == "hexagonv3") {
3217 Builder.defineMacro("__HEXAGON_V3__");
3218 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3219 if(Opts.HexagonQdsp6Compat) {
3220 Builder.defineMacro("__QDSP6_V3__");
3221 Builder.defineMacro("__QDSP6_ARCH__", "3");
3222 }
3223 }
3224 else if(CPU == "hexagonv4") {
3225 Builder.defineMacro("__HEXAGON_V4__");
3226 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3227 if(Opts.HexagonQdsp6Compat) {
3228 Builder.defineMacro("__QDSP6_V4__");
3229 Builder.defineMacro("__QDSP6_ARCH__", "4");
3230 }
3231 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00003232 else if(CPU == "hexagonv5") {
3233 Builder.defineMacro("__HEXAGON_V5__");
3234 Builder.defineMacro("__HEXAGON_ARCH__", "5");
3235 if(Opts.HexagonQdsp6Compat) {
3236 Builder.defineMacro("__QDSP6_V5__");
3237 Builder.defineMacro("__QDSP6_ARCH__", "5");
3238 }
3239 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00003240}
3241
3242const char * const HexagonTargetInfo::GCCRegNames[] = {
3243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3245 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3246 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3247 "p0", "p1", "p2", "p3",
3248 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3249};
3250
3251void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3252 unsigned &NumNames) const {
3253 Names = GCCRegNames;
3254 NumNames = llvm::array_lengthof(GCCRegNames);
3255}
3256
3257
3258const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3259 { { "sp" }, "r29" },
3260 { { "fp" }, "r30" },
3261 { { "lr" }, "r31" },
3262 };
3263
3264void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3265 unsigned &NumAliases) const {
3266 Aliases = GCCRegAliases;
3267 NumAliases = llvm::array_lengthof(GCCRegAliases);
3268}
3269
3270
3271const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3272#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3273#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3274 ALL_LANGUAGES },
3275#include "clang/Basic/BuiltinsHexagon.def"
3276};
3277}
3278
3279
Chris Lattner5ba61f02006-10-14 07:39:34 +00003280namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003281class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00003282 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3283 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003284 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00003285public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003286 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3287 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00003288 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00003289 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003290 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003291 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00003292 StringRef Name,
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003293 bool Enabled) const {
3294 if (Name == "soft-float")
3295 Features[Name] = Enabled;
3296 else
3297 return false;
3298
3299 return true;
3300 }
3301 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3302 SoftFloat = false;
3303 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3304 if (Features[i] == "+soft-float")
3305 SoftFloat = true;
3306 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003307 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003308 MacroBuilder &Builder) const {
3309 DefineStd(Builder, "sparc", Opts);
3310 Builder.defineMacro("__sparcv8");
3311 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003312
3313 if (SoftFloat)
3314 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00003315 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003316
3317 virtual bool hasFeature(StringRef Feature) const {
3318 return llvm::StringSwitch<bool>(Feature)
3319 .Case("softfloat", SoftFloat)
3320 .Case("sparc", true)
3321 .Default(false);
3322 }
3323
Gabor Greif49991682008-02-21 16:29:08 +00003324 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3325 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003326 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00003327 }
3328 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003329 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00003330 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003331 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00003332 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003333 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00003334 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00003335 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00003336 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003337 // FIXME: Implement!
3338 return false;
Gabor Greif49991682008-02-21 16:29:08 +00003339 }
3340 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003341 // FIXME: Implement!
3342 return "";
Gabor Greif49991682008-02-21 16:29:08 +00003343 }
3344};
3345
Chris Lattner9b415d62009-01-27 01:58:38 +00003346const char * const SparcV8TargetInfo::GCCRegNames[] = {
3347 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3348 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3349 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3350 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3351};
3352
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003353void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00003354 unsigned &NumNames) const {
3355 Names = GCCRegNames;
3356 NumNames = llvm::array_lengthof(GCCRegNames);
3357}
3358
3359const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003360 { { "g0" }, "r0" },
3361 { { "g1" }, "r1" },
3362 { { "g2" }, "r2" },
3363 { { "g3" }, "r3" },
3364 { { "g4" }, "r4" },
3365 { { "g5" }, "r5" },
3366 { { "g6" }, "r6" },
3367 { { "g7" }, "r7" },
3368 { { "o0" }, "r8" },
3369 { { "o1" }, "r9" },
3370 { { "o2" }, "r10" },
3371 { { "o3" }, "r11" },
3372 { { "o4" }, "r12" },
3373 { { "o5" }, "r13" },
3374 { { "o6", "sp" }, "r14" },
3375 { { "o7" }, "r15" },
3376 { { "l0" }, "r16" },
3377 { { "l1" }, "r17" },
3378 { { "l2" }, "r18" },
3379 { { "l3" }, "r19" },
3380 { { "l4" }, "r20" },
3381 { { "l5" }, "r21" },
3382 { { "l6" }, "r22" },
3383 { { "l7" }, "r23" },
3384 { { "i0" }, "r24" },
3385 { { "i1" }, "r25" },
3386 { { "i2" }, "r26" },
3387 { { "i3" }, "r27" },
3388 { { "i4" }, "r28" },
3389 { { "i5" }, "r29" },
3390 { { "i6", "fp" }, "r30" },
3391 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00003392};
3393
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003394void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00003395 unsigned &NumAliases) const {
3396 Aliases = GCCRegAliases;
3397 NumAliases = llvm::array_lengthof(GCCRegAliases);
3398}
Gabor Greif49991682008-02-21 16:29:08 +00003399} // end anonymous namespace.
3400
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003401namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003402class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3403public:
3404 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3405 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3406 SizeType = UnsignedInt;
3407 PtrDiffType = SignedInt;
3408 }
3409};
Torok Edwinb2b37c62009-06-30 17:10:35 +00003410class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003411public:
3412 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00003413 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00003414 SizeType = UnsignedInt;
3415 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003416 }
3417};
3418} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00003419
Chris Lattnerb781dc792008-05-08 05:58:21 +00003420namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003421 class MSP430TargetInfo : public TargetInfo {
3422 static const char * const GCCRegNames[];
3423 public:
3424 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003425 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003426 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00003427 IntWidth = 16; IntAlign = 16;
3428 LongWidth = 32; LongLongWidth = 64;
3429 LongAlign = LongLongAlign = 16;
3430 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003431 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003432 SizeType = UnsignedInt;
3433 IntMaxType = SignedLong;
3434 UIntMaxType = UnsignedLong;
3435 IntPtrType = SignedShort;
3436 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00003437 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00003438 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003439 }
3440 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003441 MacroBuilder &Builder) const {
3442 Builder.defineMacro("MSP430");
3443 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003444 // FIXME: defines for different 'flavours' of MCU
3445 }
3446 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3447 unsigned &NumRecords) const {
3448 // FIXME: Implement.
3449 Records = 0;
3450 NumRecords = 0;
3451 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003452 virtual bool hasFeature(StringRef Feature) const {
3453 return Feature == "msp430";
3454 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003455 virtual void getGCCRegNames(const char * const *&Names,
3456 unsigned &NumNames) const;
3457 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3458 unsigned &NumAliases) const {
3459 // No aliases.
3460 Aliases = 0;
3461 NumAliases = 0;
3462 }
3463 virtual bool validateAsmConstraint(const char *&Name,
3464 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00003465 // No target constraints for now.
3466 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003467 }
3468 virtual const char *getClobbers() const {
3469 // FIXME: Is this really right?
3470 return "";
3471 }
3472 virtual const char *getVAListDeclaration() const {
3473 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00003474 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003475 }
3476 };
3477
3478 const char * const MSP430TargetInfo::GCCRegNames[] = {
3479 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3480 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3481 };
3482
3483 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3484 unsigned &NumNames) const {
3485 Names = GCCRegNames;
3486 NumNames = llvm::array_lengthof(GCCRegNames);
3487 }
3488}
3489
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00003490namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00003491
Mike Stump11289f42009-09-09 15:08:12 +00003492 // LLVM and Clang cannot be used directly to output native binaries for
3493 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00003494 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00003495 //
3496 // TCE uses the llvm bitcode as input and uses it for generating customized
3497 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00003498 // publicly available in http://tce.cs.tut.fi
3499
Eli Friedman1f191002011-10-07 19:51:42 +00003500 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3501 3, // opencl_global
3502 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00003503 5, // opencl_constant
3504 0, // cuda_device
3505 0, // cuda_constant
3506 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00003507 };
3508
Eli Friedmana9c3d712009-08-19 20:47:07 +00003509 class TCETargetInfo : public TargetInfo{
3510 public:
3511 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3512 TLSSupported = false;
3513 IntWidth = 32;
3514 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003515 PointerWidth = 32;
3516 IntAlign = 32;
3517 LongAlign = LongLongAlign = 32;
3518 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003519 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003520 SizeType = UnsignedInt;
3521 IntMaxType = SignedLong;
3522 UIntMaxType = UnsignedLong;
3523 IntPtrType = SignedInt;
3524 PtrDiffType = SignedInt;
3525 FloatWidth = 32;
3526 FloatAlign = 32;
3527 DoubleWidth = 32;
3528 DoubleAlign = 32;
3529 LongDoubleWidth = 32;
3530 LongDoubleAlign = 32;
3531 FloatFormat = &llvm::APFloat::IEEEsingle;
3532 DoubleFormat = &llvm::APFloat::IEEEsingle;
3533 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00003534 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3535 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00003536 "f32:32:32-f64:32:32-v64:32:32-"
3537 "v128:32:32-a0:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00003538 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003539 }
3540
3541 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003542 MacroBuilder &Builder) const {
3543 DefineStd(Builder, "tce", Opts);
3544 Builder.defineMacro("__TCE__");
3545 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00003546 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003547 virtual bool hasFeature(StringRef Feature) const {
3548 return Feature == "tce";
3549 }
3550
Eli Friedmana9c3d712009-08-19 20:47:07 +00003551 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3552 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00003553 virtual const char *getClobbers() const {
3554 return "";
3555 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00003556 virtual const char *getVAListDeclaration() const {
3557 return "typedef void* __builtin_va_list;";
3558 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00003559 virtual void getGCCRegNames(const char * const *&Names,
3560 unsigned &NumNames) const {}
3561 virtual bool validateAsmConstraint(const char *&Name,
3562 TargetInfo::ConstraintInfo &info) const {
3563 return true;
3564 }
3565 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3566 unsigned &NumAliases) const {}
3567 };
3568}
3569
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003570namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003571class MipsTargetInfoBase : public TargetInfo {
3572 std::string CPU;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003573 bool SoftFloat;
3574 bool SingleFloat;
3575
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003576protected:
3577 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003578
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003579public:
Simon Atanasyance74e9d2012-04-12 19:59:24 +00003580 MipsTargetInfoBase(const std::string& triple,
3581 const std::string& ABIStr,
3582 const std::string& CPUStr)
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003583 : TargetInfo(triple),
Simon Atanasyance74e9d2012-04-12 19:59:24 +00003584 CPU(CPUStr),
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003585 SoftFloat(false), SingleFloat(false),
3586 ABI(ABIStr)
3587 {}
3588
Eric Christopher0b26a612010-03-02 02:41:08 +00003589 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003590 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00003591 virtual bool setCPU(const std::string &Name) {
3592 CPU = Name;
3593 return true;
3594 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003595 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00003596 Features[ABI] = true;
3597 Features[CPU] = true;
3598 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003599
Eric Christopher0b26a612010-03-02 02:41:08 +00003600 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003601 MacroBuilder &Builder) const {
Simon Atanasyand3d173d2012-06-05 13:06:56 +00003602 if (SoftFloat && SingleFloat)
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003603 llvm_unreachable("Invalid float ABI for Mips.");
Simon Atanasyand3d173d2012-06-05 13:06:56 +00003604 else if (SoftFloat)
3605 Builder.defineMacro("__mips_soft_float", Twine(1));
3606 else {
3607 Builder.defineMacro("__mips_hard_float", Twine(1));
3608 if (SingleFloat)
3609 Builder.defineMacro("__mips_single_float", Twine(1));
3610 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00003611
3612 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3613 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3614 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003615 }
3616
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003617 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003618 MacroBuilder &Builder) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003619 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3620 unsigned &NumRecords) const {
3621 // FIXME: Implement!
3622 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003623 virtual bool hasFeature(StringRef Feature) const {
3624 return Feature == "mips";
3625 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003626 virtual const char *getVAListDeclaration() const {
3627 return "typedef void* __builtin_va_list;";
3628 }
3629 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003630 unsigned &NumNames) const {
3631 static const char * const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00003632 // CPU register names
3633 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003634 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3635 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3636 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00003637 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
3638 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003639 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3640 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3641 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3642 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00003643 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003644 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3645 "$fcc5","$fcc6","$fcc7"
3646 };
3647 Names = GCCRegNames;
3648 NumNames = llvm::array_lengthof(GCCRegNames);
3649 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003650 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003651 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003652 virtual bool validateAsmConstraint(const char *&Name,
3653 TargetInfo::ConstraintInfo &Info) const {
3654 switch (*Name) {
3655 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00003656 return false;
3657
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003658 case 'r': // CPU registers.
3659 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3660 case 'y': // Equivalent to "r", backwards compatibility only.
3661 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00003662 case 'c': // $25 for indirect jumps
3663 case 'l': // lo register
3664 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003665 Info.setAllowsRegister();
3666 return true;
3667 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003668 }
3669
3670 virtual const char *getClobbers() const {
3671 // FIXME: Implement!
3672 return "";
3673 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003674
3675 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3676 StringRef Name,
3677 bool Enabled) const {
Simon Atanasyan296a7bb2012-04-18 12:00:11 +00003678 if (Name == "soft-float" || Name == "single-float" ||
3679 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
3680 Name == "mips32" || Name == "mips32r2" ||
3681 Name == "mips64" || Name == "mips64r2") {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003682 Features[Name] = Enabled;
3683 return true;
3684 }
3685 return false;
3686 }
3687
3688 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3689 SoftFloat = false;
3690 SingleFloat = false;
3691
3692 for (std::vector<std::string>::iterator it = Features.begin(),
3693 ie = Features.end(); it != ie; ++it) {
3694 if (*it == "+single-float") {
3695 SingleFloat = true;
3696 break;
3697 }
3698
3699 if (*it == "+soft-float") {
3700 SoftFloat = true;
3701 // This option is front-end specific.
3702 // Do not need to pass it to the backend.
3703 Features.erase(it);
3704 break;
3705 }
3706 }
3707 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003708};
3709
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003710class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003711public:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003712 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyance74e9d2012-04-12 19:59:24 +00003713 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00003714 SizeType = UnsignedInt;
3715 PtrDiffType = SignedInt;
3716 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003717 virtual bool setABI(const std::string &Name) {
3718 if ((Name == "o32") || (Name == "eabi")) {
3719 ABI = Name;
3720 return true;
3721 } else
3722 return false;
3723 }
3724 virtual void getArchDefines(const LangOptions &Opts,
3725 MacroBuilder &Builder) const {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003726 MipsTargetInfoBase::getArchDefines(Opts, Builder);
3727
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003728 if (ABI == "o32") {
3729 Builder.defineMacro("__mips_o32");
3730 Builder.defineMacro("_ABIO32", "1");
3731 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3732 }
3733 else if (ABI == "eabi")
3734 Builder.defineMacro("__mips_eabi");
3735 else
David Blaikie83d382b2011-09-23 05:06:16 +00003736 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003737 }
3738 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3739 unsigned &NumAliases) const {
3740 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3741 { { "at" }, "$1" },
3742 { { "v0" }, "$2" },
3743 { { "v1" }, "$3" },
3744 { { "a0" }, "$4" },
3745 { { "a1" }, "$5" },
3746 { { "a2" }, "$6" },
3747 { { "a3" }, "$7" },
3748 { { "t0" }, "$8" },
3749 { { "t1" }, "$9" },
3750 { { "t2" }, "$10" },
3751 { { "t3" }, "$11" },
3752 { { "t4" }, "$12" },
3753 { { "t5" }, "$13" },
3754 { { "t6" }, "$14" },
3755 { { "t7" }, "$15" },
3756 { { "s0" }, "$16" },
3757 { { "s1" }, "$17" },
3758 { { "s2" }, "$18" },
3759 { { "s3" }, "$19" },
3760 { { "s4" }, "$20" },
3761 { { "s5" }, "$21" },
3762 { { "s6" }, "$22" },
3763 { { "s7" }, "$23" },
3764 { { "t8" }, "$24" },
3765 { { "t9" }, "$25" },
3766 { { "k0" }, "$26" },
3767 { { "k1" }, "$27" },
3768 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00003769 { { "sp","$sp" }, "$29" },
3770 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003771 { { "ra" }, "$31" }
3772 };
3773 Aliases = GCCRegAliases;
3774 NumAliases = llvm::array_lengthof(GCCRegAliases);
3775 }
3776};
3777
3778class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3779public:
3780 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3781 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3782 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3783 }
3784 virtual void getTargetDefines(const LangOptions &Opts,
3785 MacroBuilder &Builder) const {
3786 DefineStd(Builder, "mips", Opts);
3787 Builder.defineMacro("_mips");
3788 DefineStd(Builder, "MIPSEB", Opts);
3789 Builder.defineMacro("_MIPSEB");
3790 Builder.defineMacro("__REGISTER_PREFIX__", "");
3791 getArchDefines(Opts, Builder);
3792 }
3793};
3794
3795class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3796public:
3797 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003798 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003799 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakab579fe52011-06-02 00:09:17 +00003800 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003801 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003802 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003803 MacroBuilder &Builder) const {
3804 DefineStd(Builder, "mips", Opts);
3805 Builder.defineMacro("_mips");
3806 DefineStd(Builder, "MIPSEL", Opts);
3807 Builder.defineMacro("_MIPSEL");
3808 Builder.defineMacro("__REGISTER_PREFIX__", "");
3809 getArchDefines(Opts, Builder);
3810 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003811};
Akira Hatanakabef17452011-09-20 19:21:49 +00003812
3813class Mips64TargetInfoBase : public MipsTargetInfoBase {
3814 virtual void SetDescriptionString(const std::string &Name) = 0;
3815public:
3816 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyance74e9d2012-04-12 19:59:24 +00003817 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00003818 LongWidth = LongAlign = 64;
3819 PointerWidth = PointerAlign = 64;
3820 LongDoubleWidth = LongDoubleAlign = 128;
3821 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003822 SuitableAlign = 128;
Akira Hatanakac12a2712011-10-22 00:07:27 +00003823 }
Akira Hatanakabef17452011-09-20 19:21:49 +00003824 virtual bool setABI(const std::string &Name) {
3825 SetDescriptionString(Name);
Akira Hatanakac12a2712011-10-22 00:07:27 +00003826
3827 if (Name != "n32" && Name != "n64")
Akira Hatanakabef17452011-09-20 19:21:49 +00003828 return false;
Akira Hatanakac12a2712011-10-22 00:07:27 +00003829
3830 ABI = Name;
3831
3832 if (Name == "n32") {
3833 LongWidth = LongAlign = 32;
3834 PointerWidth = PointerAlign = 32;
3835 }
3836
3837 return true;
Akira Hatanakabef17452011-09-20 19:21:49 +00003838 }
3839 virtual void getArchDefines(const LangOptions &Opts,
3840 MacroBuilder &Builder) const {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00003841 MipsTargetInfoBase::getArchDefines(Opts, Builder);
3842
Akira Hatanakabef17452011-09-20 19:21:49 +00003843 if (ABI == "n32") {
3844 Builder.defineMacro("__mips_n32");
3845 Builder.defineMacro("_ABIN32", "2");
3846 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3847 }
3848 else if (ABI == "n64") {
3849 Builder.defineMacro("__mips_n64");
3850 Builder.defineMacro("_ABI64", "3");
3851 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3852 }
3853 else
David Blaikie83d382b2011-09-23 05:06:16 +00003854 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00003855 }
3856 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3857 unsigned &NumAliases) const {
3858 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3859 { { "at" }, "$1" },
3860 { { "v0" }, "$2" },
3861 { { "v1" }, "$3" },
3862 { { "a0" }, "$4" },
3863 { { "a1" }, "$5" },
3864 { { "a2" }, "$6" },
3865 { { "a3" }, "$7" },
3866 { { "a4" }, "$8" },
3867 { { "a5" }, "$9" },
3868 { { "a6" }, "$10" },
3869 { { "a7" }, "$11" },
3870 { { "t0" }, "$12" },
3871 { { "t1" }, "$13" },
3872 { { "t2" }, "$14" },
3873 { { "t3" }, "$15" },
3874 { { "s0" }, "$16" },
3875 { { "s1" }, "$17" },
3876 { { "s2" }, "$18" },
3877 { { "s3" }, "$19" },
3878 { { "s4" }, "$20" },
3879 { { "s5" }, "$21" },
3880 { { "s6" }, "$22" },
3881 { { "s7" }, "$23" },
3882 { { "t8" }, "$24" },
3883 { { "t9" }, "$25" },
3884 { { "k0" }, "$26" },
3885 { { "k1" }, "$27" },
3886 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00003887 { { "sp","$sp" }, "$29" },
3888 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00003889 { { "ra" }, "$31" }
3890 };
3891 Aliases = GCCRegAliases;
3892 NumAliases = llvm::array_lengthof(GCCRegAliases);
3893 }
3894};
3895
3896class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3897 virtual void SetDescriptionString(const std::string &Name) {
3898 // Change DescriptionString only if ABI is n32.
3899 if (Name == "n32")
3900 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003901 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3902 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003903 }
3904public:
3905 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3906 // Default ABI is n64.
3907 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003908 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3909 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003910 }
3911 virtual void getTargetDefines(const LangOptions &Opts,
3912 MacroBuilder &Builder) const {
3913 DefineStd(Builder, "mips", Opts);
3914 Builder.defineMacro("_mips");
3915 DefineStd(Builder, "MIPSEB", Opts);
3916 Builder.defineMacro("_MIPSEB");
3917 Builder.defineMacro("__REGISTER_PREFIX__", "");
3918 getArchDefines(Opts, Builder);
3919 }
3920};
3921
3922class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3923 virtual void SetDescriptionString(const std::string &Name) {
3924 // Change DescriptionString only if ABI is n32.
3925 if (Name == "n32")
3926 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003927 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3928 "-v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003929 }
3930public:
3931 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003932 // Default ABI is n64.
3933 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00003934 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003935 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3936 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003937 }
3938 virtual void getTargetDefines(const LangOptions &Opts,
3939 MacroBuilder &Builder) const {
3940 DefineStd(Builder, "mips", Opts);
3941 Builder.defineMacro("_mips");
3942 DefineStd(Builder, "MIPSEL", Opts);
3943 Builder.defineMacro("_MIPSEL");
3944 Builder.defineMacro("__REGISTER_PREFIX__", "");
3945 getArchDefines(Opts, Builder);
3946 }
3947};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003948} // end anonymous namespace.
3949
Ivan Krasindd7403e2011-08-24 20:22:22 +00003950namespace {
3951class PNaClTargetInfo : public TargetInfo {
3952public:
3953 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003954 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00003955 this->UserLabelPrefix = "";
3956 this->LongAlign = 32;
3957 this->LongWidth = 32;
3958 this->PointerAlign = 32;
3959 this->PointerWidth = 32;
3960 this->IntMaxType = TargetInfo::SignedLongLong;
3961 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3962 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00003963 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00003964 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00003965 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00003966 this->SizeType = TargetInfo::UnsignedInt;
3967 this->PtrDiffType = TargetInfo::SignedInt;
3968 this->IntPtrType = TargetInfo::SignedInt;
David Meyerbfdbb252011-10-11 03:12:01 +00003969 this->RegParmMax = 2;
Ivan Krasindd7403e2011-08-24 20:22:22 +00003970 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3971 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3972 }
3973
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003974 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00003975 }
3976 virtual void getArchDefines(const LangOptions &Opts,
3977 MacroBuilder &Builder) const {
3978 Builder.defineMacro("__le32__");
3979 Builder.defineMacro("__pnacl__");
3980 }
3981 virtual void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const {
Ivan Krasin9b2cbdf2011-08-25 23:49:20 +00003983 DefineStd(Builder, "unix", Opts);
3984 Builder.defineMacro("__ELF__");
3985 if (Opts.POSIXThreads)
3986 Builder.defineMacro("_REENTRANT");
3987 if (Opts.CPlusPlus)
3988 Builder.defineMacro("_GNU_SOURCE");
3989
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00003990 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00003991 Builder.defineMacro("__native_client__");
3992 getArchDefines(Opts, Builder);
3993 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003994 virtual bool hasFeature(StringRef Feature) const {
3995 return Feature == "pnacl";
3996 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00003997 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3998 unsigned &NumRecords) const {
3999 }
4000 virtual const char *getVAListDeclaration() const {
Ivan Krasin96a80612011-09-20 14:56:54 +00004001 return "typedef int __builtin_va_list[4];";
Ivan Krasindd7403e2011-08-24 20:22:22 +00004002 }
4003 virtual void getGCCRegNames(const char * const *&Names,
4004 unsigned &NumNames) const;
4005 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4006 unsigned &NumAliases) const;
4007 virtual bool validateAsmConstraint(const char *&Name,
4008 TargetInfo::ConstraintInfo &Info) const {
4009 return false;
4010 }
4011
4012 virtual const char *getClobbers() const {
4013 return "";
4014 }
4015};
4016
4017void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4018 unsigned &NumNames) const {
4019 Names = NULL;
4020 NumNames = 0;
4021}
4022
4023void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4024 unsigned &NumAliases) const {
4025 Aliases = NULL;
4026 NumAliases = 0;
4027}
4028} // end anonymous namespace.
4029
4030
Chris Lattner5ba61f02006-10-14 07:39:34 +00004031//===----------------------------------------------------------------------===//
4032// Driver code
4033//===----------------------------------------------------------------------===//
4034
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004035static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00004036 llvm::Triple Triple(T);
4037 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00004038
Daniel Dunbar52322032009-08-18 05:47:58 +00004039 switch (Triple.getArch()) {
4040 default:
4041 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00004042
Tony Linthicum76329bf2011-12-12 21:14:55 +00004043 case llvm::Triple::hexagon:
4044 return new HexagonTargetInfo(T);
4045
Daniel Dunbar52322032009-08-18 05:47:58 +00004046 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00004047 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00004048 if (Triple.isOSDarwin())
4049 return new DarwinARMTargetInfo(T);
4050
Daniel Dunbar52322032009-08-18 05:47:58 +00004051 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00004052 case llvm::Triple::Linux:
4053 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004054 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00004055 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004056 case llvm::Triple::NetBSD:
4057 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00004058 case llvm::Triple::RTEMS:
4059 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004060 default:
4061 return new ARMTargetInfo(T);
4062 }
Eli Friedmanb5366062008-05-20 14:21:01 +00004063
Daniel Dunbar52322032009-08-18 05:47:58 +00004064 case llvm::Triple::msp430:
4065 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00004066
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004067 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004068 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004069 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004070 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004071 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004072 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004073 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004074 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004075 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004076 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004077 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004078 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00004079 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004080
4081 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004082 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004083 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004084 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004085 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004086 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004087 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004088 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004089 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004090 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004091 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004092 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00004093 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004094
Akira Hatanakabef17452011-09-20 19:21:49 +00004095 case llvm::Triple::mips64:
4096 switch (os) {
4097 case llvm::Triple::Linux:
4098 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
4099 case llvm::Triple::RTEMS:
4100 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
4101 case llvm::Triple::FreeBSD:
4102 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
4103 case llvm::Triple::NetBSD:
4104 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
4105 default:
4106 return new Mips64EBTargetInfo(T);
4107 }
4108
4109 case llvm::Triple::mips64el:
4110 switch (os) {
4111 case llvm::Triple::Linux:
4112 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
4113 case llvm::Triple::RTEMS:
4114 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
4115 case llvm::Triple::FreeBSD:
4116 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
4117 case llvm::Triple::NetBSD:
4118 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
4119 default:
4120 return new Mips64ELTargetInfo(T);
4121 }
4122
Ivan Krasindd7403e2011-08-24 20:22:22 +00004123 case llvm::Triple::le32:
4124 switch (os) {
4125 case llvm::Triple::NativeClient:
4126 return new PNaClTargetInfo(T);
4127 default:
4128 return NULL;
4129 }
4130
Daniel Dunbar52322032009-08-18 05:47:58 +00004131 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00004132 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00004133 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004134 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00004135 case llvm::Triple::Linux:
4136 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004137 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00004138 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004139 case llvm::Triple::NetBSD:
4140 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
4141 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00004142 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004143 default:
4144 return new PPC32TargetInfo(T);
4145 }
Daniel Dunbar52322032009-08-18 05:47:58 +00004146
4147 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00004148 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00004149 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004150 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00004151 case llvm::Triple::Linux:
4152 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004153 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00004154 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004155 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00004156 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004157 case llvm::Triple::NetBSD:
4158 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4159 default:
4160 return new PPC64TargetInfo(T);
4161 }
Daniel Dunbar52322032009-08-18 05:47:58 +00004162
Peter Collingbournec947aae2012-05-20 23:28:41 +00004163 case llvm::Triple::nvptx:
4164 return new NVPTX32TargetInfo(T);
4165 case llvm::Triple::nvptx64:
4166 return new NVPTX64TargetInfo(T);
4167
Chris Lattner5178f562010-03-06 21:21:27 +00004168 case llvm::Triple::mblaze:
4169 return new MBlazeTargetInfo(T);
4170
Daniel Dunbar52322032009-08-18 05:47:58 +00004171 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004172 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00004173 case llvm::Triple::Linux:
4174 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004175 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004176 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004177 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00004178 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004179 case llvm::Triple::NetBSD:
4180 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
4181 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00004182 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00004183 default:
4184 return new SparcV8TargetInfo(T);
4185 }
Daniel Dunbar52322032009-08-18 05:47:58 +00004186
John Thompsone467e192009-11-19 17:18:50 +00004187 // FIXME: Need a real SPU target.
4188 case llvm::Triple::cellspu:
4189 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
4190
Eli Friedmana9c3d712009-08-19 20:47:07 +00004191 case llvm::Triple::tce:
4192 return new TCETargetInfo(T);
4193
Daniel Dunbar52322032009-08-18 05:47:58 +00004194 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00004195 if (Triple.isOSDarwin())
4196 return new DarwinI386TargetInfo(T);
4197
Daniel Dunbar52322032009-08-18 05:47:58 +00004198 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004199 case llvm::Triple::AuroraUX:
4200 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004201 case llvm::Triple::Linux:
4202 return new LinuxTargetInfo<X86_32TargetInfo>(T);
4203 case llvm::Triple::DragonFly:
4204 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4205 case llvm::Triple::NetBSD:
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004206 return new NetBSDI386TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004207 case llvm::Triple::OpenBSD:
4208 return new OpenBSDI386TargetInfo(T);
4209 case llvm::Triple::FreeBSD:
4210 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00004211 case llvm::Triple::Minix:
4212 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004213 case llvm::Triple::Solaris:
4214 return new SolarisTargetInfo<X86_32TargetInfo>(T);
4215 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004216 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004217 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004218 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004219 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004220 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004221 case llvm::Triple::Haiku:
4222 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00004223 case llvm::Triple::RTEMS:
4224 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004225 default:
4226 return new X86_32TargetInfo(T);
4227 }
4228
4229 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00004230 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4231 return new DarwinX86_64TargetInfo(T);
4232
Daniel Dunbar52322032009-08-18 05:47:58 +00004233 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004234 case llvm::Triple::AuroraUX:
4235 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004236 case llvm::Triple::Linux:
4237 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00004238 case llvm::Triple::DragonFly:
4239 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004240 case llvm::Triple::NetBSD:
4241 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4242 case llvm::Triple::OpenBSD:
4243 return new OpenBSDX86_64TargetInfo(T);
4244 case llvm::Triple::FreeBSD:
4245 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4246 case llvm::Triple::Solaris:
4247 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00004248 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004249 return new MinGWX86_64TargetInfo(T);
4250 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00004251 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00004252 default:
4253 return new X86_64TargetInfo(T);
4254 }
4255 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00004256}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004257
4258/// CreateTargetInfo - Return the target info object for the specified target
4259/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00004260TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004261 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004262 llvm::Triple Triple(Opts.Triple);
4263
4264 // Construct the target
Dylan Noblesmithe2778992012-02-05 02:12:40 +00004265 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004266 if (!Target) {
4267 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
4268 return 0;
4269 }
4270
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004271 // Set the target CPU if specified.
4272 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
4273 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
4274 return 0;
4275 }
4276
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004277 // Set the target ABI if specified.
4278 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
4279 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
4280 return 0;
4281 }
4282
Charles Davis95a546e2010-06-11 01:06:47 +00004283 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00004284 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00004285 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
4286 return 0;
4287 }
4288
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004289 // Compute the default target features, we need the target to handle this
4290 // because features may have dependencies on one another.
4291 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004292 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004293
4294 // Apply the user specified deltas.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00004295 // First the enables.
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004296 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4297 ie = Opts.Features.end(); it != ie; ++it) {
4298 const char *Name = it->c_str();
4299
Rafael Espindolaa6416a72011-11-27 20:00:43 +00004300 if (Name[0] != '+')
4301 continue;
4302
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004303 // Apply the feature via the target.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00004304 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4305 Diags.Report(diag::err_target_invalid_feature) << Name;
4306 return 0;
4307 }
4308 }
4309
4310 // Then the disables.
4311 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4312 ie = Opts.Features.end(); it != ie; ++it) {
4313 const char *Name = it->c_str();
4314
4315 if (Name[0] == '+')
4316 continue;
4317
4318 // Apply the feature via the target.
4319 if (Name[0] != '-' ||
4320 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004321 Diags.Report(diag::err_target_invalid_feature) << Name;
4322 return 0;
4323 }
4324 }
4325
4326 // Add the features to the compile options.
4327 //
4328 // FIXME: If we are completely confident that we have the right set, we only
4329 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004330 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004331 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4332 ie = Features.end(); it != ie; ++it)
Benjamin Kramer27402c62012-03-05 15:10:44 +00004333 Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004334 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004335
4336 return Target.take();
4337}