blob: 72f66416fbd17444405c8f258086a6a3481ff898 [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"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.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:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &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) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000097
John McCall5d36a8c2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000107
John McCall31168b02011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000112 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000113
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000131
Sebastian Pop422377c2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Jim Grosbache2bfac42013-11-19 20:18:39 +0000140 // If there's an environment specified in the triple, that means we're dealing
141 // with an embedded variant of some sort and don't want the platform
142 // version-min defines, so only add them if there's not one.
143 if (Triple.getEnvironmentName().empty()) {
144 // Set the appropriate OS version define.
145 if (Triple.isiOS()) {
146 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
147 char Str[6];
148 Str[0] = '0' + Maj;
149 Str[1] = '0' + (Min / 10);
150 Str[2] = '0' + (Min % 10);
151 Str[3] = '0' + (Rev / 10);
152 Str[4] = '0' + (Rev % 10);
153 Str[5] = '\0';
154 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
155 Str);
Tim Northover157d9112014-01-16 08:48:16 +0000156 } else if (Triple.isMacOSX()) {
Jim Grosbache2bfac42013-11-19 20:18:39 +0000157 // Note that the Driver allows versions which aren't representable in the
158 // define (because we only get a single digit for the minor and micro
159 // revision numbers). So, we limit them to the maximum representable
160 // version.
161 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[5];
164 Str[0] = '0' + (Maj / 10);
165 Str[1] = '0' + (Maj % 10);
166 Str[2] = '0' + std::min(Min, 9U);
167 Str[3] = '0' + std::min(Rev, 9U);
168 Str[4] = '\0';
169 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
170 }
Daniel Dunbar497ff132009-04-10 19:52:24 +0000171 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000172
Tim Northover157d9112014-01-16 08:48:16 +0000173 // Tell users about the kernel if there is one.
174 if (Triple.isOSDarwin())
175 Builder.defineMacro("__MACH__");
176
Daniel Dunbarecf13562011-04-19 21:40:34 +0000177 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000178}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000179
Chris Lattner30ba6742009-08-10 19:03:04 +0000180namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000181template<typename Target>
182class DarwinTargetInfo : public OSTargetInfo<Target> {
183protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000184 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000185 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000186 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000187 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188 }
Mike Stump11289f42009-09-09 15:08:12 +0000189
Torok Edwinb2b37c62009-06-30 17:10:35 +0000190public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000191 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
192 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
193 this->MCountName = "\01mcount";
194 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000196 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000197 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000198 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000199 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000200 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000201 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000202 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000203 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000204
Anders Carlsson851318a2010-06-08 22:47:50 +0000205 virtual const char *getStaticInitSectionSpecifier() const {
206 // FIXME: We should return 0 when building kexts.
207 return "__TEXT,__StaticInit,regular,pure_instructions";
208 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000209
John McCalleed64c72012-01-29 01:20:30 +0000210 /// Darwin does not support protected visibility. Darwin's "default"
211 /// is very similar to ELF's "protected"; Darwin requires a "weak"
212 /// attribute on declarations that can be dynamically replaced.
213 virtual bool hasProtectedVisibility() const {
214 return false;
215 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216};
217
Chris Lattner30ba6742009-08-10 19:03:04 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219// DragonFlyBSD Target
220template<typename Target>
221class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
222protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000223 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000224 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000226 Builder.defineMacro("__DragonFly__");
227 Builder.defineMacro("__DragonFly_cc_version", "100001");
228 Builder.defineMacro("__ELF__");
229 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
230 Builder.defineMacro("__tune_i386__");
231 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 }
233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000234 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
235 : OSTargetInfo<Target>(Triple) {
236 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000237
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000238 switch (Triple.getArch()) {
239 default:
240 case llvm::Triple::x86:
241 case llvm::Triple::x86_64:
242 this->MCountName = ".mcount";
243 break;
244 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246};
247
248// FreeBSD Target
249template<typename Target>
250class FreeBSDTargetInfo : public OSTargetInfo<Target> {
251protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000252 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000253 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254 // FreeBSD defines; list based off of gcc output
255
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000256 unsigned Release = Triple.getOSMajorVersion();
257 if (Release == 0U)
258 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000260 Builder.defineMacro("__FreeBSD__", Twine(Release));
261 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000262 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
263 DefineStd(Builder, "unix", Opts);
264 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000265
266 // On FreeBSD, wchar_t contains the number of the code point as
267 // used by the character set of the locale. These character sets are
268 // not necessarily a superset of ASCII.
269 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000270 }
271public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000272 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
273 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000274
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000275 switch (Triple.getArch()) {
276 default:
277 case llvm::Triple::x86:
278 case llvm::Triple::x86_64:
279 this->MCountName = ".mcount";
280 break;
281 case llvm::Triple::mips:
282 case llvm::Triple::mipsel:
283 case llvm::Triple::ppc:
284 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000285 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000286 this->MCountName = "_mcount";
287 break;
288 case llvm::Triple::arm:
289 this->MCountName = "__mcount";
290 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000291 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000292 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293};
294
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000295// GNU/kFreeBSD Target
296template<typename Target>
297class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
298protected:
299 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
300 MacroBuilder &Builder) const {
301 // GNU/kFreeBSD defines; list based off of gcc output
302
303 DefineStd(Builder, "unix", Opts);
304 Builder.defineMacro("__FreeBSD_kernel__");
305 Builder.defineMacro("__GLIBC__");
306 Builder.defineMacro("__ELF__");
307 if (Opts.POSIXThreads)
308 Builder.defineMacro("_REENTRANT");
309 if (Opts.CPlusPlus)
310 Builder.defineMacro("_GNU_SOURCE");
311 }
312public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000313 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000314 this->UserLabelPrefix = "";
315 }
316};
317
Chris Lattner3e2ee142010-07-07 16:01:42 +0000318// Minix Target
319template<typename Target>
320class MinixTargetInfo : public OSTargetInfo<Target> {
321protected:
322 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
323 MacroBuilder &Builder) const {
324 // Minix defines
325
326 Builder.defineMacro("__minix", "3");
327 Builder.defineMacro("_EM_WSIZE", "4");
328 Builder.defineMacro("_EM_PSIZE", "4");
329 Builder.defineMacro("_EM_SSIZE", "2");
330 Builder.defineMacro("_EM_LSIZE", "4");
331 Builder.defineMacro("_EM_FSIZE", "4");
332 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000333 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000334 DefineStd(Builder, "unix", Opts);
335 }
336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000337 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
338 this->UserLabelPrefix = "";
339 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000340};
341
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342// Linux target
343template<typename Target>
344class LinuxTargetInfo : public OSTargetInfo<Target> {
345protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000346 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000348 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000349 DefineStd(Builder, "unix", Opts);
350 DefineStd(Builder, "linux", Opts);
351 Builder.defineMacro("__gnu_linux__");
352 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000353 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000354 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000355 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000356 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000357 if (Opts.CPlusPlus)
358 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000362 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000363 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000364 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000365
366 virtual const char *getStaticInitSectionSpecifier() const {
367 return ".text.startup";
368 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000369};
370
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000371// NetBSD Target
372template<typename Target>
373class NetBSDTargetInfo : public OSTargetInfo<Target> {
374protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000377 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000378 Builder.defineMacro("__NetBSD__");
379 Builder.defineMacro("__unix__");
380 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000381 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000383 }
384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000385 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
386 this->UserLabelPrefix = "";
387 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000388};
389
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390// OpenBSD Target
391template<typename Target>
392class OpenBSDTargetInfo : public OSTargetInfo<Target> {
393protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000396 // OpenBSD defines; list based off of gcc output
397
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("__OpenBSD__");
399 DefineStd(Builder, "unix", Opts);
400 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000401 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000402 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 }
404public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000405 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
406 this->UserLabelPrefix = "";
407 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000408
Eli Friedman3715d1f2011-12-15 02:15:56 +0000409 switch (Triple.getArch()) {
410 default:
411 case llvm::Triple::x86:
412 case llvm::Triple::x86_64:
413 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000414 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000415 this->MCountName = "__mcount";
416 break;
417 case llvm::Triple::mips64:
418 case llvm::Triple::mips64el:
419 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000420 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000421 this->MCountName = "_mcount";
422 break;
423 }
424 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425};
426
Eli Friedman9fa28852012-08-08 23:57:20 +0000427// Bitrig Target
428template<typename Target>
429class BitrigTargetInfo : public OSTargetInfo<Target> {
430protected:
431 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
432 MacroBuilder &Builder) const {
433 // Bitrig defines; list based off of gcc output
434
435 Builder.defineMacro("__Bitrig__");
436 DefineStd(Builder, "unix", Opts);
437 Builder.defineMacro("__ELF__");
438 if (Opts.POSIXThreads)
439 Builder.defineMacro("_REENTRANT");
440 }
441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000442 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
443 this->UserLabelPrefix = "";
444 this->TLSSupported = false;
445 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000446 }
447};
448
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000449// PSP Target
450template<typename Target>
451class PSPTargetInfo : public OSTargetInfo<Target> {
452protected:
453 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000454 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000455 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000456 Builder.defineMacro("PSP");
457 Builder.defineMacro("_PSP");
458 Builder.defineMacro("__psp__");
459 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000460 }
461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000462 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463 this->UserLabelPrefix = "";
464 }
465};
466
John Thompsone467e192009-11-19 17:18:50 +0000467// PS3 PPU Target
468template<typename Target>
469class PS3PPUTargetInfo : public OSTargetInfo<Target> {
470protected:
471 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000473 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000474 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000475 Builder.defineMacro("__PPU__");
476 Builder.defineMacro("__CELLOS_LV2__");
477 Builder.defineMacro("__ELF__");
478 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000479 Builder.defineMacro("_ARCH_PPC64");
480 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000481 }
482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000483 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000484 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000485 this->LongWidth = this->LongAlign = 32;
486 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000487 this->IntMaxType = TargetInfo::SignedLongLong;
488 this->UIntMaxType = TargetInfo::UnsignedLongLong;
489 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000490 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000491 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000492 }
493};
494
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000495// AuroraUX target
496template<typename Target>
497class AuroraUXTargetInfo : public OSTargetInfo<Target> {
498protected:
499 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 MacroBuilder &Builder) const {
501 DefineStd(Builder, "sun", Opts);
502 DefineStd(Builder, "unix", Opts);
503 Builder.defineMacro("__ELF__");
504 Builder.defineMacro("__svr4__");
505 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000506 }
507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000508 AuroraUXTargetInfo(const llvm::Triple &Triple)
509 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000510 this->UserLabelPrefix = "";
511 this->WCharType = this->SignedLong;
512 // FIXME: WIntType should be SignedLong
513 }
514};
515
Torok Edwinb2b37c62009-06-30 17:10:35 +0000516// Solaris target
517template<typename Target>
518class SolarisTargetInfo : public OSTargetInfo<Target> {
519protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000520 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000521 MacroBuilder &Builder) const {
522 DefineStd(Builder, "sun", Opts);
523 DefineStd(Builder, "unix", Opts);
524 Builder.defineMacro("__ELF__");
525 Builder.defineMacro("__svr4__");
526 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000527 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
528 // newer, but to 500 for everything else. feature_test.h has a check to
529 // ensure that you are not using C99 with an old version of X/Open or C89
530 // with a new version.
531 if (Opts.C99 || Opts.C11)
532 Builder.defineMacro("_XOPEN_SOURCE", "600");
533 else
534 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000535 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000536 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000537 Builder.defineMacro("_LARGEFILE_SOURCE");
538 Builder.defineMacro("_LARGEFILE64_SOURCE");
539 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000540 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 }
542public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000543 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000544 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000545 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 // FIXME: WIntType should be SignedLong
547 }
548};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000549
550// Windows target
551template<typename Target>
552class WindowsTargetInfo : public OSTargetInfo<Target> {
553protected:
554 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
555 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000556 Builder.defineMacro("_WIN32");
557 }
558 void getVisualStudioDefines(const LangOptions &Opts,
559 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000560 if (Opts.CPlusPlus) {
561 if (Opts.RTTI)
562 Builder.defineMacro("_CPPRTTI");
563
564 if (Opts.Exceptions)
565 Builder.defineMacro("_CPPUNWIND");
566 }
567
568 if (!Opts.CharIsSigned)
569 Builder.defineMacro("_CHAR_UNSIGNED");
570
571 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
572 // but it works for now.
573 if (Opts.POSIXThreads)
574 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000575
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000576 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000577 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000578
Francois Pichet0706d202011-09-17 17:15:52 +0000579 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000580 Builder.defineMacro("_MSC_EXTENSIONS");
581
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000582 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000583 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
584 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
585 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
586 }
587 }
588
589 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000590 }
591
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000593 WindowsTargetInfo(const llvm::Triple &Triple)
594 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000595};
596
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000597template <typename Target>
598class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000599protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000600 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
601 MacroBuilder &Builder) const {
602 if (Opts.POSIXThreads)
603 Builder.defineMacro("_REENTRANT");
604 if (Opts.CPlusPlus)
605 Builder.defineMacro("_GNU_SOURCE");
606
607 DefineStd(Builder, "unix", Opts);
608 Builder.defineMacro("__ELF__");
609 Builder.defineMacro("__native_client__");
610 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000611
612public:
613 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000614 this->UserLabelPrefix = "";
615 this->LongAlign = 32;
616 this->LongWidth = 32;
617 this->PointerAlign = 32;
618 this->PointerWidth = 32;
619 this->IntMaxType = TargetInfo::SignedLongLong;
620 this->UIntMaxType = TargetInfo::UnsignedLongLong;
621 this->Int64Type = TargetInfo::SignedLongLong;
622 this->DoubleAlign = 64;
623 this->LongDoubleWidth = 64;
624 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000625 this->LongLongWidth = 64;
626 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000627 this->SizeType = TargetInfo::UnsignedInt;
628 this->PtrDiffType = TargetInfo::SignedInt;
629 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000630 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000631 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000632 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000633 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000634 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000635 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000636 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000637 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000638 } else if (Triple.getArch() == llvm::Triple::mipsel) {
639 // Handled on mips' setDescriptionString.
640 } else {
641 assert(Triple.getArch() == llvm::Triple::le32);
642 this->DescriptionString = "e-p:32:32-i64:64";
643 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000644 }
Derek Schuffa2020962012-10-16 22:30:41 +0000645 virtual typename Target::CallingConvCheckResult checkCallingConvention(
646 CallingConv CC) const {
647 return CC == CC_PnaclCall ? Target::CCCR_OK :
648 Target::checkCallingConvention(CC);
649 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000650};
Mike Stump11289f42009-09-09 15:08:12 +0000651} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000652
Chris Lattner09d98f52008-10-05 21:50:58 +0000653//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000654// Specific target implementations.
655//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000656
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000657namespace {
658// PPC abstract base class
659class PPCTargetInfo : public TargetInfo {
660 static const Builtin::Info BuiltinInfo[];
661 static const char * const GCCRegNames[];
662 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000663 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000664
665 // Target cpu features.
666 bool HasVSX;
667
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000668public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000669 PPCTargetInfo(const llvm::Triple &Triple)
670 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000671 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000672 LongDoubleWidth = LongDoubleAlign = 128;
673 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
674 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000675
Hal Finkel6b984f02012-07-03 16:51:04 +0000676 /// \brief Flags for architecture specific defines.
677 typedef enum {
678 ArchDefineNone = 0,
679 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
680 ArchDefinePpcgr = 1 << 1,
681 ArchDefinePpcsq = 1 << 2,
682 ArchDefine440 = 1 << 3,
683 ArchDefine603 = 1 << 4,
684 ArchDefine604 = 1 << 5,
685 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000686 ArchDefinePwr5 = 1 << 7,
687 ArchDefinePwr5x = 1 << 8,
688 ArchDefinePwr6 = 1 << 9,
689 ArchDefinePwr6x = 1 << 10,
690 ArchDefinePwr7 = 1 << 11,
691 ArchDefineA2 = 1 << 12,
692 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000693 } ArchDefineTypes;
694
Bill Schmidt38378a02013-02-01 20:23:10 +0000695 // Note: GCC recognizes the following additional cpus:
696 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
697 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
698 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000699 virtual bool setCPU(const std::string &Name) {
700 bool CPUKnown = llvm::StringSwitch<bool>(Name)
701 .Case("generic", true)
702 .Case("440", true)
703 .Case("450", true)
704 .Case("601", true)
705 .Case("602", true)
706 .Case("603", true)
707 .Case("603e", true)
708 .Case("603ev", true)
709 .Case("604", true)
710 .Case("604e", true)
711 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000712 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000713 .Case("g3", true)
714 .Case("7400", true)
715 .Case("g4", true)
716 .Case("7450", true)
717 .Case("g4+", true)
718 .Case("750", true)
719 .Case("970", true)
720 .Case("g5", true)
721 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000722 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000723 .Case("e500mc", true)
724 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000725 .Case("power3", true)
726 .Case("pwr3", true)
727 .Case("power4", true)
728 .Case("pwr4", true)
729 .Case("power5", true)
730 .Case("pwr5", true)
731 .Case("power5x", true)
732 .Case("pwr5x", true)
733 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000734 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000735 .Case("power6x", true)
736 .Case("pwr6x", true)
737 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000738 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000739 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000741 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000742 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000743 .Case("powerpc64le", true)
744 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000745 .Default(false);
746
747 if (CPUKnown)
748 CPU = Name;
749
750 return CPUKnown;
751 }
752
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000753 virtual void getTargetBuiltins(const Builtin::Info *&Records,
754 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000755 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000756 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000757 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000758
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000759 virtual bool isCLZForZeroUndef() const { return false; }
760
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000761 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000762 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000763
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000764 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
765
Eric Christopher3ff21b32013-10-16 21:26:26 +0000766 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000767 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000768 virtual bool hasFeature(StringRef Feature) const;
769
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000770 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000771 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000772 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000774 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000775 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000776 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000777 default: return false;
778 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000779 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000780 case 'b': // Base register
781 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000782 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000783 break;
784 // FIXME: The following are added to allow parsing.
785 // I just took a guess at what the actions should be.
786 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000787 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000788 case 'v': // Altivec vector register
789 Info.setAllowsRegister();
790 break;
791 case 'w':
792 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000793 case 'd':// VSX vector register to hold vector double data
794 case 'f':// VSX vector register to hold vector float data
795 case 's':// VSX vector register to hold scalar float data
796 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000797 break;
798 default:
799 return false;
800 }
801 Info.setAllowsRegister();
802 Name++; // Skip over 'w'.
803 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000804 case 'h': // `MQ', `CTR', or `LINK' register
805 case 'q': // `MQ' register
806 case 'c': // `CTR' register
807 case 'l': // `LINK' register
808 case 'x': // `CR' register (condition register) number 0
809 case 'y': // `CR' register (condition register)
810 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000811 Info.setAllowsRegister();
812 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000813 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000814 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000815 // (use `L' instead for SImode constants)
816 case 'K': // Unsigned 16-bit constant
817 case 'L': // Signed 16-bit constant shifted left 16 bits
818 case 'M': // Constant larger than 31
819 case 'N': // Exact power of 2
820 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000821 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000822 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000823 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000824 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000825 break;
826 case 'm': // Memory operand. Note that on PowerPC targets, m can
827 // include addresses that update the base register. It
828 // is therefore only safe to use `m' in an asm statement
829 // if that asm statement accesses the operand exactly once.
830 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000831 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000833 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000834 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000835 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
836 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000837 // register to be updated.
838 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000839 if (Name[1] != 's')
840 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000841 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000842 // include any automodification of the base register. Unlike
843 // `m', this constraint can be used in asm statements that
844 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000845 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000846 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000847 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000848 break;
849 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000850 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000851 case 'Z': // Memory operand that is an indexed or indirect from a
852 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000854 Info.setAllowsMemory();
855 Info.setAllowsRegister();
856 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000857 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000858 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // register (`p' is preferable for asm statements)
860 case 'S': // Constant suitable as a 64-bit mask operand
861 case 'T': // Constant suitable as a 32-bit mask operand
862 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000863 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000864 // instructions
865 case 'W': // Vector constant that does not require memory
866 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000867 break;
868 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000869 }
John Thompson07a61a42010-06-24 22:44:13 +0000870 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000871 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000872 virtual const char *getClobbers() const {
873 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000874 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000875 int getEHDataRegisterNumber(unsigned RegNo) const {
876 if (RegNo == 0) return 3;
877 if (RegNo == 1) return 4;
878 return -1;
879 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000880};
Anders Carlssonf511f642007-11-27 04:11:28 +0000881
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000883#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000884#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000885 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000886#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000887};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000888
Eric Christopher3ff21b32013-10-16 21:26:26 +0000889 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000890/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000891bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000892 DiagnosticsEngine &Diags) {
893 // Remember the maximum enabled sselevel.
894 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
895 // Ignore disabled features.
896 if (Features[i][0] == '-')
897 continue;
898
899 StringRef Feature = StringRef(Features[i]).substr(1);
900
901 if (Feature == "vsx") {
902 HasVSX = true;
903 continue;
904 }
905
906 // TODO: Finish this list and add an assert that we've handled them
907 // all.
908 }
909
910 return true;
911}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000912
Chris Lattnerecd49032009-03-02 22:27:17 +0000913/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
914/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000915void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000916 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000917 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000918 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000919 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000920 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000921 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000922 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000923 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000924 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000925 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000926 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000927 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000928 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000929
Chris Lattnerecd49032009-03-02 22:27:17 +0000930 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000931 if (getTriple().getArch() == llvm::Triple::ppc64le) {
932 Builder.defineMacro("_LITTLE_ENDIAN");
933 Builder.defineMacro("__LITTLE_ENDIAN__");
934 } else {
935 if (getTriple().getOS() != llvm::Triple::NetBSD &&
936 getTriple().getOS() != llvm::Triple::OpenBSD)
937 Builder.defineMacro("_BIG_ENDIAN");
938 Builder.defineMacro("__BIG_ENDIAN__");
939 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000940
Chris Lattnerecd49032009-03-02 22:27:17 +0000941 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000942 Builder.defineMacro("__NATURAL_ALIGNMENT__");
943 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000944
Chris Lattnerecd49032009-03-02 22:27:17 +0000945 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000946 if (LongDoubleWidth == 128)
947 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948
John Thompsone467e192009-11-19 17:18:50 +0000949 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000950 Builder.defineMacro("__VEC__", "10206");
951 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000952 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000953
954 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000955 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
956 .Case("440", ArchDefineName)
957 .Case("450", ArchDefineName | ArchDefine440)
958 .Case("601", ArchDefineName)
959 .Case("602", ArchDefineName | ArchDefinePpcgr)
960 .Case("603", ArchDefineName | ArchDefinePpcgr)
961 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
962 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
963 .Case("604", ArchDefineName | ArchDefinePpcgr)
964 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
965 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000966 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000967 .Case("7400", ArchDefineName | ArchDefinePpcgr)
968 .Case("7450", ArchDefineName | ArchDefinePpcgr)
969 .Case("750", ArchDefineName | ArchDefinePpcgr)
970 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
971 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000972 .Case("a2", ArchDefineA2)
973 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000974 .Case("pwr3", ArchDefinePpcgr)
975 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
976 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
977 | ArchDefinePpcsq)
978 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
979 | ArchDefinePpcgr | ArchDefinePpcsq)
980 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
981 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
982 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
983 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
984 | ArchDefinePpcsq)
985 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
986 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
987 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
988 .Case("power3", ArchDefinePpcgr)
989 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
990 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
991 | ArchDefinePpcsq)
992 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
993 | ArchDefinePpcgr | ArchDefinePpcsq)
994 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
995 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
996 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
997 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
998 | ArchDefinePpcsq)
999 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1000 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1001 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001002 .Default(ArchDefineNone);
1003
1004 if (defs & ArchDefineName)
1005 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1006 if (defs & ArchDefinePpcgr)
1007 Builder.defineMacro("_ARCH_PPCGR");
1008 if (defs & ArchDefinePpcsq)
1009 Builder.defineMacro("_ARCH_PPCSQ");
1010 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001011 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001012 if (defs & ArchDefine603)
1013 Builder.defineMacro("_ARCH_603");
1014 if (defs & ArchDefine604)
1015 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001016 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001017 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001018 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001019 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001020 if (defs & ArchDefinePwr5x)
1021 Builder.defineMacro("_ARCH_PWR5X");
1022 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001023 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001024 if (defs & ArchDefinePwr6x)
1025 Builder.defineMacro("_ARCH_PWR6X");
1026 if (defs & ArchDefinePwr7)
1027 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001028 if (defs & ArchDefineA2)
1029 Builder.defineMacro("_ARCH_A2");
1030 if (defs & ArchDefineA2q) {
1031 Builder.defineMacro("_ARCH_A2Q");
1032 Builder.defineMacro("_ARCH_QP");
1033 }
1034
1035 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1036 Builder.defineMacro("__bg__");
1037 Builder.defineMacro("__THW_BLUEGENE__");
1038 Builder.defineMacro("__bgq__");
1039 Builder.defineMacro("__TOS_BGQ__");
1040 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001041
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001042 if (HasVSX)
1043 Builder.defineMacro("__VSX__");
1044
Bill Schmidt38378a02013-02-01 20:23:10 +00001045 // FIXME: The following are not yet generated here by Clang, but are
1046 // generated by GCC:
1047 //
1048 // _SOFT_FLOAT_
1049 // __RECIP_PRECISION__
1050 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001051 // __RECIP__
1052 // __RECIPF__
1053 // __RSQRTE__
1054 // __RSQRTEF__
1055 // _SOFT_DOUBLE_
1056 // __NO_LWSYNC__
1057 // __HAVE_BSWAP__
1058 // __LONGDOUBLE128
1059 // __CMODEL_MEDIUM__
1060 // __CMODEL_LARGE__
1061 // _CALL_SYSV
1062 // _CALL_DARWIN
1063 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001064}
1065
1066void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1067 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1068 .Case("7400", true)
1069 .Case("g4", true)
1070 .Case("7450", true)
1071 .Case("g4+", true)
1072 .Case("970", true)
1073 .Case("g5", true)
1074 .Case("pwr6", true)
1075 .Case("pwr7", true)
1076 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001077 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001078 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001079
1080 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001081}
1082
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001083bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1084 return Feature == "powerpc";
1085}
Chris Lattner17df24e2008-04-21 18:56:49 +00001086
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001087
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001088const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001089 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1090 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1091 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1092 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1093 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1094 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1095 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1096 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001097 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001098 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001099 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001100 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1101 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1102 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1103 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001104 "vrsave", "vscr",
1105 "spe_acc", "spefscr",
1106 "sfp"
1107};
Chris Lattner10a5b382007-01-29 05:24:35 +00001108
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001109void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110 unsigned &NumNames) const {
1111 Names = GCCRegNames;
1112 NumNames = llvm::array_lengthof(GCCRegNames);
1113}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001114
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001115const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1116 // While some of these aliases do map to different registers
1117 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001118 { { "0" }, "r0" },
1119 { { "1"}, "r1" },
1120 { { "2" }, "r2" },
1121 { { "3" }, "r3" },
1122 { { "4" }, "r4" },
1123 { { "5" }, "r5" },
1124 { { "6" }, "r6" },
1125 { { "7" }, "r7" },
1126 { { "8" }, "r8" },
1127 { { "9" }, "r9" },
1128 { { "10" }, "r10" },
1129 { { "11" }, "r11" },
1130 { { "12" }, "r12" },
1131 { { "13" }, "r13" },
1132 { { "14" }, "r14" },
1133 { { "15" }, "r15" },
1134 { { "16" }, "r16" },
1135 { { "17" }, "r17" },
1136 { { "18" }, "r18" },
1137 { { "19" }, "r19" },
1138 { { "20" }, "r20" },
1139 { { "21" }, "r21" },
1140 { { "22" }, "r22" },
1141 { { "23" }, "r23" },
1142 { { "24" }, "r24" },
1143 { { "25" }, "r25" },
1144 { { "26" }, "r26" },
1145 { { "27" }, "r27" },
1146 { { "28" }, "r28" },
1147 { { "29" }, "r29" },
1148 { { "30" }, "r30" },
1149 { { "31" }, "r31" },
1150 { { "fr0" }, "f0" },
1151 { { "fr1" }, "f1" },
1152 { { "fr2" }, "f2" },
1153 { { "fr3" }, "f3" },
1154 { { "fr4" }, "f4" },
1155 { { "fr5" }, "f5" },
1156 { { "fr6" }, "f6" },
1157 { { "fr7" }, "f7" },
1158 { { "fr8" }, "f8" },
1159 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001160 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001161 { { "fr11" }, "f11" },
1162 { { "fr12" }, "f12" },
1163 { { "fr13" }, "f13" },
1164 { { "fr14" }, "f14" },
1165 { { "fr15" }, "f15" },
1166 { { "fr16" }, "f16" },
1167 { { "fr17" }, "f17" },
1168 { { "fr18" }, "f18" },
1169 { { "fr19" }, "f19" },
1170 { { "fr20" }, "f20" },
1171 { { "fr21" }, "f21" },
1172 { { "fr22" }, "f22" },
1173 { { "fr23" }, "f23" },
1174 { { "fr24" }, "f24" },
1175 { { "fr25" }, "f25" },
1176 { { "fr26" }, "f26" },
1177 { { "fr27" }, "f27" },
1178 { { "fr28" }, "f28" },
1179 { { "fr29" }, "f29" },
1180 { { "fr30" }, "f30" },
1181 { { "fr31" }, "f31" },
1182 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001183};
1184
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001185void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001186 unsigned &NumAliases) const {
1187 Aliases = GCCRegAliases;
1188 NumAliases = llvm::array_lengthof(GCCRegAliases);
1189}
1190} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001191
Chris Lattner5ba61f02006-10-14 07:39:34 +00001192namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001193class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001195 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001196 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001197
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001198 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001199 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001200 case llvm::Triple::FreeBSD:
1201 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001202 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001203 PtrDiffType = SignedInt;
1204 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001205 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001206 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001207 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001208 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001209
Roman Divacky3ffe7462012-03-13 19:20:17 +00001210 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1211 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001212 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001213 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001214
1215 // PPC32 supports atomics up to 4 bytes.
1216 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001217 }
1218
Meador Inge5d3fb222012-06-16 03:34:49 +00001219 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001220 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001221 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001222 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001223};
1224} // end anonymous namespace.
1225
Bill Schmidt778d3872013-07-26 01:36:11 +00001226// Note: ABI differences may eventually require us to have a separate
1227// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001228namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001229class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001230public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001231 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001232 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001233 IntMaxType = SignedLong;
1234 UIntMaxType = UnsignedLong;
1235 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001236
Roman Divacky3ffe7462012-03-13 19:20:17 +00001237 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1238 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001239 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001240 DescriptionString = "E-m:e-i64:64-n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001241 } else
Rafael Espindolac418ae92014-01-03 19:22:05 +00001242 DescriptionString = "E-m:e-i64:64-n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001243
1244 // PPC64 supports atomics up to 8 bytes.
1245 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001246 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001247 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1248 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001249 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250};
1251} // end anonymous namespace.
1252
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001253
1254namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001255class DarwinPPC32TargetInfo :
1256 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001257public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001258 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1259 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001260 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001261 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001262 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001263 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001264 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001265 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001266 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001267 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1268 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001269 }
1270};
1271
1272class DarwinPPC64TargetInfo :
1273 public DarwinTargetInfo<PPC64TargetInfo> {
1274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001275 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1276 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001277 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001278 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001279 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001280 }
1281};
1282} // end anonymous namespace.
1283
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001285 static const unsigned NVPTXAddrSpaceMap[] = {
1286 1, // opencl_global
1287 3, // opencl_local
1288 4, // opencl_constant
1289 1, // cuda_device
1290 4, // cuda_constant
1291 3, // cuda_shared
1292 };
1293 class NVPTXTargetInfo : public TargetInfo {
1294 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001295 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001296 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001297 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001298 BigEndian = false;
1299 TLSSupported = false;
1300 LongWidth = LongAlign = 64;
1301 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001302 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001303 // Define available target features
1304 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001305 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001306 }
1307 virtual void getTargetDefines(const LangOptions &Opts,
1308 MacroBuilder &Builder) const {
1309 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001310 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001311 }
1312 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1313 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001314 Records = BuiltinInfo;
1315 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001316 }
1317 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001318 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001319 }
1320
1321 virtual void getGCCRegNames(const char * const *&Names,
1322 unsigned &NumNames) const;
1323 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1324 unsigned &NumAliases) const {
1325 // No aliases.
1326 Aliases = 0;
1327 NumAliases = 0;
1328 }
1329 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001330 TargetInfo::ConstraintInfo &Info) const {
1331 switch (*Name) {
1332 default: return false;
1333 case 'c':
1334 case 'h':
1335 case 'r':
1336 case 'l':
1337 case 'f':
1338 case 'd':
1339 Info.setAllowsRegister();
1340 return true;
1341 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001342 }
1343 virtual const char *getClobbers() const {
1344 // FIXME: Is this really right?
1345 return "";
1346 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001347 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001348 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001349 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001350 }
1351 virtual bool setCPU(const std::string &Name) {
Justin Holewinski91203e82013-03-30 14:38:26 +00001352 bool Valid = llvm::StringSwitch<bool>(Name)
1353 .Case("sm_20", true)
1354 .Case("sm_21", true)
1355 .Case("sm_30", true)
1356 .Case("sm_35", true)
1357 .Default(false);
1358
1359 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001360 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001361 };
1362
1363 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1364#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1365#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1366 ALL_LANGUAGES },
1367#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001368 };
1369
1370 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1371 "r0"
1372 };
1373
1374 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1375 unsigned &NumNames) const {
1376 Names = GCCRegNames;
1377 NumNames = llvm::array_lengthof(GCCRegNames);
1378 }
1379
1380 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1381 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001382 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001383 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001384 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001385 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001386 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 };
1388
1389 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001393 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001394 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001395 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001396 };
1397}
1398
1399namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001400
1401static const unsigned R600AddrSpaceMap[] = {
1402 1, // opencl_global
1403 3, // opencl_local
1404 2, // opencl_constant
1405 1, // cuda_device
1406 2, // cuda_constant
1407 3 // cuda_shared
1408};
1409
Tom Stellardc74b1e02013-03-04 17:40:53 +00001410static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001411 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1412 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001413
1414static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001415 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1416 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001417
1418static const char *DescriptionStringSI =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001419 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
1420 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1421 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001422
Eli Friedmand13b41e2012-10-12 23:32:00 +00001423class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001424 /// \brief The GPU profiles supported by the R600 target.
1425 enum GPUKind {
1426 GK_NONE,
1427 GK_R600,
1428 GK_R600_DOUBLE_OPS,
1429 GK_R700,
1430 GK_R700_DOUBLE_OPS,
1431 GK_EVERGREEN,
1432 GK_EVERGREEN_DOUBLE_OPS,
1433 GK_NORTHERN_ISLANDS,
1434 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001435 GK_SOUTHERN_ISLANDS,
1436 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001437 } GPU;
1438
Eli Friedmand13b41e2012-10-12 23:32:00 +00001439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001440 R600TargetInfo(const llvm::Triple &Triple)
1441 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001442 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001443 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001444 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001445 }
1446
1447 virtual const char * getClobbers() const {
1448 return "";
1449 }
1450
1451 virtual void getGCCRegNames(const char * const *&Names,
1452 unsigned &numNames) const {
1453 Names = NULL;
1454 numNames = 0;
1455 }
1456
1457 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1458 unsigned &NumAliases) const {
1459 Aliases = NULL;
1460 NumAliases = 0;
1461 }
1462
1463 virtual bool validateAsmConstraint(const char *&Name,
1464 TargetInfo::ConstraintInfo &info) const {
1465 return true;
1466 }
1467
1468 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1469 unsigned &NumRecords) const {
1470 Records = NULL;
1471 NumRecords = 0;
1472 }
1473
1474
1475 virtual void getTargetDefines(const LangOptions &Opts,
1476 MacroBuilder &Builder) const {
1477 Builder.defineMacro("__R600__");
1478 }
1479
1480 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1481 return TargetInfo::CharPtrBuiltinVaList;
1482 }
1483
Tom Stellardc74b1e02013-03-04 17:40:53 +00001484 virtual bool setCPU(const std::string &Name) {
1485 GPU = llvm::StringSwitch<GPUKind>(Name)
1486 .Case("r600" , GK_R600)
1487 .Case("rv610", GK_R600)
1488 .Case("rv620", GK_R600)
1489 .Case("rv630", GK_R600)
1490 .Case("rv635", GK_R600)
1491 .Case("rs780", GK_R600)
1492 .Case("rs880", GK_R600)
1493 .Case("rv670", GK_R600_DOUBLE_OPS)
1494 .Case("rv710", GK_R700)
1495 .Case("rv730", GK_R700)
1496 .Case("rv740", GK_R700_DOUBLE_OPS)
1497 .Case("rv770", GK_R700_DOUBLE_OPS)
1498 .Case("palm", GK_EVERGREEN)
1499 .Case("cedar", GK_EVERGREEN)
1500 .Case("sumo", GK_EVERGREEN)
1501 .Case("sumo2", GK_EVERGREEN)
1502 .Case("redwood", GK_EVERGREEN)
1503 .Case("juniper", GK_EVERGREEN)
1504 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1505 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1506 .Case("barts", GK_NORTHERN_ISLANDS)
1507 .Case("turks", GK_NORTHERN_ISLANDS)
1508 .Case("caicos", GK_NORTHERN_ISLANDS)
1509 .Case("cayman", GK_CAYMAN)
1510 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001511 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001512 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1513 .Case("verde", GK_SOUTHERN_ISLANDS)
1514 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001515 .Case("bonaire", GK_SEA_ISLANDS)
1516 .Case("kabini", GK_SEA_ISLANDS)
1517 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001518 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001519 .Default(GK_NONE);
1520
1521 if (GPU == GK_NONE) {
1522 return false;
1523 }
1524
1525 // Set the correct data layout
1526 switch (GPU) {
1527 case GK_NONE:
1528 case GK_R600:
1529 case GK_R700:
1530 case GK_EVERGREEN:
1531 case GK_NORTHERN_ISLANDS:
1532 DescriptionString = DescriptionStringR600;
1533 break;
1534 case GK_R600_DOUBLE_OPS:
1535 case GK_R700_DOUBLE_OPS:
1536 case GK_EVERGREEN_DOUBLE_OPS:
1537 case GK_CAYMAN:
1538 DescriptionString = DescriptionStringR600DoubleOps;
1539 break;
1540 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001541 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001542 DescriptionString = DescriptionStringSI;
1543 break;
1544 }
1545
1546 return true;
1547 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001548};
1549
1550} // end anonymous namespace
1551
1552namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001553// Namespace for x86 abstract base class
1554const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001555#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001556#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001557 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001558#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001559};
Eli Friedmanb5366062008-05-20 14:21:01 +00001560
Nuno Lopescfca1f02009-12-23 17:49:57 +00001561static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001562 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1563 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001564 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001565 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1566 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1567 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001568 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001569 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1570 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001571};
1572
Eric Christophercdd36352011-06-21 00:05:20 +00001573const TargetInfo::AddlRegName AddlRegNames[] = {
1574 { { "al", "ah", "eax", "rax" }, 0 },
1575 { { "bl", "bh", "ebx", "rbx" }, 3 },
1576 { { "cl", "ch", "ecx", "rcx" }, 2 },
1577 { { "dl", "dh", "edx", "rdx" }, 1 },
1578 { { "esi", "rsi" }, 4 },
1579 { { "edi", "rdi" }, 5 },
1580 { { "esp", "rsp" }, 7 },
1581 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001582};
1583
1584// X86 target abstract base class; x86-32 and x86-64 are very close, so
1585// most of the implementation can be shared.
1586class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001587 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001588 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001589 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001590 enum MMX3DNowEnum {
1591 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1592 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001593 enum XOPEnum {
1594 NoXOP,
1595 SSE4A,
1596 FMA4,
1597 XOP
1598 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001599
Eric Christophere1ddaf92010-04-02 23:50:19 +00001600 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001601 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001602 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001603 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001604 bool HasBMI;
1605 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001606 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001607 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001608 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001609 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001610 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001611 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001612 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001613 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001614 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001615 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001616
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001617 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1618 ///
1619 /// Each enumeration represents a particular CPU supported by Clang. These
1620 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1621 enum CPUKind {
1622 CK_Generic,
1623
1624 /// \name i386
1625 /// i386-generation processors.
1626 //@{
1627 CK_i386,
1628 //@}
1629
1630 /// \name i486
1631 /// i486-generation processors.
1632 //@{
1633 CK_i486,
1634 CK_WinChipC6,
1635 CK_WinChip2,
1636 CK_C3,
1637 //@}
1638
1639 /// \name i586
1640 /// i586-generation processors, P5 microarchitecture based.
1641 //@{
1642 CK_i586,
1643 CK_Pentium,
1644 CK_PentiumMMX,
1645 //@}
1646
1647 /// \name i686
1648 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1649 //@{
1650 CK_i686,
1651 CK_PentiumPro,
1652 CK_Pentium2,
1653 CK_Pentium3,
1654 CK_Pentium3M,
1655 CK_PentiumM,
1656 CK_C3_2,
1657
1658 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1659 /// Clang however has some logic to suport this.
1660 // FIXME: Warn, deprecate, and potentially remove this.
1661 CK_Yonah,
1662 //@}
1663
1664 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001665 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001666 //@{
1667 CK_Pentium4,
1668 CK_Pentium4M,
1669 CK_Prescott,
1670 CK_Nocona,
1671 //@}
1672
1673 /// \name Core
1674 /// Core microarchitecture based processors.
1675 //@{
1676 CK_Core2,
1677
1678 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1679 /// codename which GCC no longer accepts as an option to -march, but Clang
1680 /// has some logic for recognizing it.
1681 // FIXME: Warn, deprecate, and potentially remove this.
1682 CK_Penryn,
1683 //@}
1684
1685 /// \name Atom
1686 /// Atom processors
1687 //@{
1688 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001689 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001690 //@}
1691
1692 /// \name Nehalem
1693 /// Nehalem microarchitecture based processors.
1694 //@{
1695 CK_Corei7,
1696 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001697 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001698 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001699 //@}
1700
Craig Topper449314e2013-08-20 07:09:39 +00001701 /// \name Knights Landing
1702 /// Knights Landing processor.
1703 CK_KNL,
1704
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001705 /// \name K6
1706 /// K6 architecture processors.
1707 //@{
1708 CK_K6,
1709 CK_K6_2,
1710 CK_K6_3,
1711 //@}
1712
1713 /// \name K7
1714 /// K7 architecture processors.
1715 //@{
1716 CK_Athlon,
1717 CK_AthlonThunderbird,
1718 CK_Athlon4,
1719 CK_AthlonXP,
1720 CK_AthlonMP,
1721 //@}
1722
1723 /// \name K8
1724 /// K8 architecture processors.
1725 //@{
1726 CK_Athlon64,
1727 CK_Athlon64SSE3,
1728 CK_AthlonFX,
1729 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001730 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001731 CK_Opteron,
1732 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001733 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001734 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001735
Benjamin Kramer569f2152012-01-10 11:50:18 +00001736 /// \name Bobcat
1737 /// Bobcat architecture processors.
1738 //@{
1739 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001740 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001741 //@}
1742
1743 /// \name Bulldozer
1744 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001745 //@{
1746 CK_BDVER1,
1747 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001748 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001749 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001750
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001751 /// This specification is deprecated and will be removed in the future.
1752 /// Users should prefer \see CK_K8.
1753 // FIXME: Warn on this when the CPU is set to it.
1754 CK_x86_64,
1755 //@}
1756
1757 /// \name Geode
1758 /// Geode processors.
1759 //@{
1760 CK_Geode
1761 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001762 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001763
Rafael Espindolaeb265472013-08-21 21:59:03 +00001764 enum FPMathKind {
1765 FP_Default,
1766 FP_SSE,
1767 FP_387
1768 } FPMath;
1769
Eli Friedman3fd920a2008-08-20 02:34:37 +00001770public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001771 X86TargetInfo(const llvm::Triple &Triple)
1772 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001773 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1774 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001775 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1776 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001777 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1778 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001779 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001780 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001781 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001782 virtual unsigned getFloatEvalMethod() const {
1783 // X87 evaluates with 80 bits "long double" precision.
1784 return SSELevel == NoSSE ? 2 : 0;
1785 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001786 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1787 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001788 Records = BuiltinInfo;
1789 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001790 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001791 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001792 unsigned &NumNames) const {
1793 Names = GCCRegNames;
1794 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001795 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001796 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001797 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001798 Aliases = 0;
1799 NumAliases = 0;
1800 }
1801 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001802 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001803 Names = AddlRegNames;
1804 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001805 }
Anders Carlsson58436352009-02-28 17:11:49 +00001806 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001807 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001808 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001809 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001810 return "~{dirflag},~{fpsr},~{flags}";
1811 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001812 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001813 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001814 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1815 bool Enabled);
1816 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1817 bool Enabled);
1818 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1819 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001820 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001821 StringRef Name, bool Enabled) const {
1822 setFeatureEnabledImpl(Features, Name, Enabled);
1823 }
1824 // This exists purely to cut down on the number of virtual calls in
1825 // getDefaultFeatures which calls this repeatedly.
1826 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1827 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001828 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001829 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001830 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001831 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001832 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001833 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001834 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001835 else if (getTriple().getArch() == llvm::Triple::x86 &&
1836 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001837 return "no-mmx";
1838 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001839 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001840 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001841 CPU = llvm::StringSwitch<CPUKind>(Name)
1842 .Case("i386", CK_i386)
1843 .Case("i486", CK_i486)
1844 .Case("winchip-c6", CK_WinChipC6)
1845 .Case("winchip2", CK_WinChip2)
1846 .Case("c3", CK_C3)
1847 .Case("i586", CK_i586)
1848 .Case("pentium", CK_Pentium)
1849 .Case("pentium-mmx", CK_PentiumMMX)
1850 .Case("i686", CK_i686)
1851 .Case("pentiumpro", CK_PentiumPro)
1852 .Case("pentium2", CK_Pentium2)
1853 .Case("pentium3", CK_Pentium3)
1854 .Case("pentium3m", CK_Pentium3M)
1855 .Case("pentium-m", CK_PentiumM)
1856 .Case("c3-2", CK_C3_2)
1857 .Case("yonah", CK_Yonah)
1858 .Case("pentium4", CK_Pentium4)
1859 .Case("pentium4m", CK_Pentium4M)
1860 .Case("prescott", CK_Prescott)
1861 .Case("nocona", CK_Nocona)
1862 .Case("core2", CK_Core2)
1863 .Case("penryn", CK_Penryn)
1864 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001865 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001866 .Case("corei7", CK_Corei7)
1867 .Case("corei7-avx", CK_Corei7AVX)
1868 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001869 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001870 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001871 .Case("k6", CK_K6)
1872 .Case("k6-2", CK_K6_2)
1873 .Case("k6-3", CK_K6_3)
1874 .Case("athlon", CK_Athlon)
1875 .Case("athlon-tbird", CK_AthlonThunderbird)
1876 .Case("athlon-4", CK_Athlon4)
1877 .Case("athlon-xp", CK_AthlonXP)
1878 .Case("athlon-mp", CK_AthlonMP)
1879 .Case("athlon64", CK_Athlon64)
1880 .Case("athlon64-sse3", CK_Athlon64SSE3)
1881 .Case("athlon-fx", CK_AthlonFX)
1882 .Case("k8", CK_K8)
1883 .Case("k8-sse3", CK_K8SSE3)
1884 .Case("opteron", CK_Opteron)
1885 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001886 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001887 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001888 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001889 .Case("bdver1", CK_BDVER1)
1890 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001891 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001892 .Case("x86-64", CK_x86_64)
1893 .Case("geode", CK_Geode)
1894 .Default(CK_Generic);
1895
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001896 // Perform any per-CPU checks necessary to determine if this CPU is
1897 // acceptable.
1898 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1899 // invalid without explaining *why*.
1900 switch (CPU) {
1901 case CK_Generic:
1902 // No processor selected!
1903 return false;
1904
1905 case CK_i386:
1906 case CK_i486:
1907 case CK_WinChipC6:
1908 case CK_WinChip2:
1909 case CK_C3:
1910 case CK_i586:
1911 case CK_Pentium:
1912 case CK_PentiumMMX:
1913 case CK_i686:
1914 case CK_PentiumPro:
1915 case CK_Pentium2:
1916 case CK_Pentium3:
1917 case CK_Pentium3M:
1918 case CK_PentiumM:
1919 case CK_Yonah:
1920 case CK_C3_2:
1921 case CK_Pentium4:
1922 case CK_Pentium4M:
1923 case CK_Prescott:
1924 case CK_K6:
1925 case CK_K6_2:
1926 case CK_K6_3:
1927 case CK_Athlon:
1928 case CK_AthlonThunderbird:
1929 case CK_Athlon4:
1930 case CK_AthlonXP:
1931 case CK_AthlonMP:
1932 case CK_Geode:
1933 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001934 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001935 return false;
1936
1937 // Fallthrough
1938 case CK_Nocona:
1939 case CK_Core2:
1940 case CK_Penryn:
1941 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001942 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001943 case CK_Corei7:
1944 case CK_Corei7AVX:
1945 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001946 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001947 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001948 case CK_Athlon64:
1949 case CK_Athlon64SSE3:
1950 case CK_AthlonFX:
1951 case CK_K8:
1952 case CK_K8SSE3:
1953 case CK_Opteron:
1954 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001955 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001956 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001957 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001958 case CK_BDVER1:
1959 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001960 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001961 case CK_x86_64:
1962 return true;
1963 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001964 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001965 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001966
Rafael Espindolaeb265472013-08-21 21:59:03 +00001967 virtual bool setFPMath(StringRef Name);
1968
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001969 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1970 // We accept all non-ARM calling conventions
1971 return (CC == CC_X86ThisCall ||
1972 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001973 CC == CC_X86StdCall ||
1974 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001975 CC == CC_X86Pascal ||
1976 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001977 }
1978
Aaron Ballman02df2e02012-12-09 17:45:41 +00001979 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1980 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001981 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001982};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001983
Rafael Espindolaeb265472013-08-21 21:59:03 +00001984bool X86TargetInfo::setFPMath(StringRef Name) {
1985 if (Name == "387") {
1986 FPMath = FP_387;
1987 return true;
1988 }
1989 if (Name == "sse") {
1990 FPMath = FP_SSE;
1991 return true;
1992 }
1993 return false;
1994}
1995
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001996void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001997 // FIXME: This *really* should not be here.
1998
1999 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002000 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002001 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002002
Chandler Carruth212334f2011-09-28 08:55:37 +00002003 switch (CPU) {
2004 case CK_Generic:
2005 case CK_i386:
2006 case CK_i486:
2007 case CK_i586:
2008 case CK_Pentium:
2009 case CK_i686:
2010 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002011 break;
2012 case CK_PentiumMMX:
2013 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002014 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002015 break;
2016 case CK_Pentium3:
2017 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002018 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002019 break;
2020 case CK_PentiumM:
2021 case CK_Pentium4:
2022 case CK_Pentium4M:
2023 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002024 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002025 break;
2026 case CK_Yonah:
2027 case CK_Prescott:
2028 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002029 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002030 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002031 break;
2032 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002033 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002034 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002035 break;
2036 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002037 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002038 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002039 break;
2040 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002041 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002042 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002043 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002044 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002045 setFeatureEnabledImpl(Features, "sse4.2", true);
2046 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002047 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002048 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002049 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002050 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002051 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002052 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002053 break;
2054 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "avx", true);
2056 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002057 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002059 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002061 setFeatureEnabledImpl(Features, "avx", true);
2062 setFeatureEnabledImpl(Features, "aes", true);
2063 setFeatureEnabledImpl(Features, "pclmul", true);
2064 setFeatureEnabledImpl(Features, "rdrnd", true);
2065 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002066 break;
Craig Topper865fff52011-12-17 19:55:21 +00002067 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "avx2", true);
2069 setFeatureEnabledImpl(Features, "aes", true);
2070 setFeatureEnabledImpl(Features, "pclmul", true);
2071 setFeatureEnabledImpl(Features, "lzcnt", true);
2072 setFeatureEnabledImpl(Features, "rdrnd", true);
2073 setFeatureEnabledImpl(Features, "f16c", true);
2074 setFeatureEnabledImpl(Features, "bmi", true);
2075 setFeatureEnabledImpl(Features, "bmi2", true);
2076 setFeatureEnabledImpl(Features, "rtm", true);
2077 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002078 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002079 break;
Craig Topper449314e2013-08-20 07:09:39 +00002080 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002081 setFeatureEnabledImpl(Features, "avx512f", true);
2082 setFeatureEnabledImpl(Features, "avx512cd", true);
2083 setFeatureEnabledImpl(Features, "avx512er", true);
2084 setFeatureEnabledImpl(Features, "avx512pf", true);
2085 setFeatureEnabledImpl(Features, "aes", true);
2086 setFeatureEnabledImpl(Features, "pclmul", true);
2087 setFeatureEnabledImpl(Features, "lzcnt", true);
2088 setFeatureEnabledImpl(Features, "rdrnd", true);
2089 setFeatureEnabledImpl(Features, "f16c", true);
2090 setFeatureEnabledImpl(Features, "bmi", true);
2091 setFeatureEnabledImpl(Features, "bmi2", true);
2092 setFeatureEnabledImpl(Features, "rtm", true);
2093 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002094 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002095 case CK_K6:
2096 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002097 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002098 break;
2099 case CK_K6_2:
2100 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002101 case CK_WinChip2:
2102 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002103 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002104 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002105 case CK_Athlon:
2106 case CK_AthlonThunderbird:
2107 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002108 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002109 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002110 case CK_Athlon4:
2111 case CK_AthlonXP:
2112 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002113 setFeatureEnabledImpl(Features, "sse", true);
2114 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 break;
2116 case CK_K8:
2117 case CK_Opteron:
2118 case CK_Athlon64:
2119 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "sse2", true);
2121 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002122 break;
2123 case CK_K8SSE3:
2124 case CK_OpteronSSE3:
2125 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "sse3", true);
2127 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002128 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002129 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "sse3", true);
2131 setFeatureEnabledImpl(Features, "sse4a", true);
2132 setFeatureEnabledImpl(Features, "3dnowa", true);
2133 setFeatureEnabledImpl(Features, "lzcnt", true);
2134 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002135 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002136 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "ssse3", true);
2138 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002139 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002140 setFeatureEnabledImpl(Features, "lzcnt", true);
2141 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002142 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002143 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002144 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002145 setFeatureEnabledImpl(Features, "avx", true);
2146 setFeatureEnabledImpl(Features, "sse4a", true);
2147 setFeatureEnabledImpl(Features, "lzcnt", true);
2148 setFeatureEnabledImpl(Features, "aes", true);
2149 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002150 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002151 setFeatureEnabledImpl(Features, "bmi", true);
2152 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002153 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002154 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002155 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "xop", true);
2157 setFeatureEnabledImpl(Features, "lzcnt", true);
2158 setFeatureEnabledImpl(Features, "aes", true);
2159 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002160 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002161 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002162 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002163 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002164 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002165 setFeatureEnabledImpl(Features, "xop", true);
2166 setFeatureEnabledImpl(Features, "lzcnt", true);
2167 setFeatureEnabledImpl(Features, "aes", true);
2168 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002169 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002170 setFeatureEnabledImpl(Features, "bmi", true);
2171 setFeatureEnabledImpl(Features, "fma", true);
2172 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002173 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002174 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002175 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002176 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002178 break;
Eli Friedman33465822011-07-08 23:31:17 +00002179 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002180}
2181
Rafael Espindolae62e2792013-08-20 13:44:29 +00002182void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002183 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002184 if (Enabled) {
2185 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002186 case AVX512F:
2187 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002188 case AVX2:
2189 Features["avx2"] = true;
2190 case AVX:
2191 Features["avx"] = true;
2192 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002193 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002194 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002195 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002196 case SSSE3:
2197 Features["ssse3"] = true;
2198 case SSE3:
2199 Features["sse3"] = true;
2200 case SSE2:
2201 Features["sse2"] = true;
2202 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002203 Features["sse"] = true;
2204 case NoSSE:
2205 break;
2206 }
2207 return;
2208 }
2209
2210 switch (Level) {
2211 case NoSSE:
2212 case SSE1:
2213 Features["sse"] = false;
2214 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002215 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2216 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002217 case SSE3:
2218 Features["sse3"] = false;
2219 setXOPLevel(Features, NoXOP, false);
2220 case SSSE3:
2221 Features["ssse3"] = false;
2222 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002223 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002224 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002225 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002226 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002227 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002228 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002229 case AVX2:
2230 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002231 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002232 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2233 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002234 }
2235}
2236
2237void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002238 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002239 if (Enabled) {
2240 switch (Level) {
2241 case AMD3DNowAthlon:
2242 Features["3dnowa"] = true;
2243 case AMD3DNow:
2244 Features["3dnow"] = true;
2245 case MMX:
2246 Features["mmx"] = true;
2247 case NoMMX3DNow:
2248 break;
2249 }
2250 return;
2251 }
2252
2253 switch (Level) {
2254 case NoMMX3DNow:
2255 case MMX:
2256 Features["mmx"] = false;
2257 case AMD3DNow:
2258 Features["3dnow"] = false;
2259 case AMD3DNowAthlon:
2260 Features["3dnowa"] = false;
2261 }
2262}
2263
2264void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002265 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002266 if (Enabled) {
2267 switch (Level) {
2268 case XOP:
2269 Features["xop"] = true;
2270 case FMA4:
2271 Features["fma4"] = true;
2272 setSSELevel(Features, AVX, true);
2273 case SSE4A:
2274 Features["sse4a"] = true;
2275 setSSELevel(Features, SSE3, true);
2276 case NoXOP:
2277 break;
2278 }
2279 return;
2280 }
2281
2282 switch (Level) {
2283 case NoXOP:
2284 case SSE4A:
2285 Features["sse4a"] = false;
2286 case FMA4:
2287 Features["fma4"] = false;
2288 case XOP:
2289 Features["xop"] = false;
2290 }
2291}
2292
Craig Topper86d79ef2013-09-17 04:51:29 +00002293void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2294 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002295 // FIXME: This *really* should not be here. We need some way of translating
2296 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002297 if (Name == "sse4")
2298 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002299
Rafael Espindolae62e2792013-08-20 13:44:29 +00002300 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002301
Craig Topper29561122013-09-19 01:13:07 +00002302 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002303 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002304 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002305 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002306 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002307 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002308 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002309 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002310 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002311 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002312 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002313 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002314 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002315 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002316 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002317 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002318 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002319 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002320 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002321 if (Enabled)
2322 setSSELevel(Features, SSE2, Enabled);
2323 } else if (Name == "pclmul") {
2324 if (Enabled)
2325 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002326 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002328 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002330 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002331 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002332 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002333 if (Enabled)
2334 setSSELevel(Features, AVX512F, Enabled);
2335 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 if (Enabled)
2337 setSSELevel(Features, AVX, Enabled);
2338 } else if (Name == "fma4") {
2339 setXOPLevel(Features, FMA4, Enabled);
2340 } else if (Name == "xop") {
2341 setXOPLevel(Features, XOP, Enabled);
2342 } else if (Name == "sse4a") {
2343 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002344 } else if (Name == "f16c") {
2345 if (Enabled)
2346 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002347 } else if (Name == "sha") {
2348 if (Enabled)
2349 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002350 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002351}
2352
Eric Christopher3ff21b32013-10-16 21:26:26 +00002353/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002354/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002355bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002356 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002357 // Remember the maximum enabled sselevel.
2358 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2359 // Ignore disabled features.
2360 if (Features[i][0] == '-')
2361 continue;
2362
Benjamin Kramer27402c62012-03-05 15:10:44 +00002363 StringRef Feature = StringRef(Features[i]).substr(1);
2364
2365 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002366 HasAES = true;
2367 continue;
2368 }
2369
Craig Topper3f122a72012-05-31 05:18:48 +00002370 if (Feature == "pclmul") {
2371 HasPCLMUL = true;
2372 continue;
2373 }
2374
Benjamin Kramer27402c62012-03-05 15:10:44 +00002375 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002376 HasLZCNT = true;
2377 continue;
2378 }
2379
Rafael Espindola89049822013-08-23 20:21:37 +00002380 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002381 HasRDRND = true;
2382 continue;
2383 }
2384
Benjamin Kramer27402c62012-03-05 15:10:44 +00002385 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002386 HasBMI = true;
2387 continue;
2388 }
2389
Benjamin Kramer27402c62012-03-05 15:10:44 +00002390 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002391 HasBMI2 = true;
2392 continue;
2393 }
2394
Benjamin Kramer27402c62012-03-05 15:10:44 +00002395 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002396 HasPOPCNT = true;
2397 continue;
2398 }
2399
Michael Liao625a8752012-11-10 05:17:46 +00002400 if (Feature == "rtm") {
2401 HasRTM = true;
2402 continue;
2403 }
2404
Michael Liao74f4eaf2013-03-26 17:52:08 +00002405 if (Feature == "prfchw") {
2406 HasPRFCHW = true;
2407 continue;
2408 }
2409
Michael Liaoffaae352013-03-29 05:17:55 +00002410 if (Feature == "rdseed") {
2411 HasRDSEED = true;
2412 continue;
2413 }
2414
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002415 if (Feature == "tbm") {
2416 HasTBM = true;
2417 continue;
2418 }
2419
Craig Topperbba778b2012-06-03 21:46:30 +00002420 if (Feature == "fma") {
2421 HasFMA = true;
2422 continue;
2423 }
2424
Manman Rena45358c2012-10-11 00:59:55 +00002425 if (Feature == "f16c") {
2426 HasF16C = true;
2427 continue;
2428 }
2429
Craig Topper679b53a2013-08-21 05:29:10 +00002430 if (Feature == "avx512cd") {
2431 HasAVX512CD = true;
2432 continue;
2433 }
2434
2435 if (Feature == "avx512er") {
2436 HasAVX512ER = true;
2437 continue;
2438 }
2439
2440 if (Feature == "avx512pf") {
2441 HasAVX512PF = true;
2442 continue;
2443 }
2444
Ben Langmuir58078d02013-09-19 13:22:04 +00002445 if (Feature == "sha") {
2446 HasSHA = true;
2447 continue;
2448 }
2449
Nick Lewycky50e8f482013-10-05 20:14:27 +00002450 if (Feature == "cx16") {
2451 HasCX16 = true;
2452 continue;
2453 }
2454
Daniel Dunbar979586e2009-11-11 09:38:56 +00002455 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002456 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002457 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002458 .Case("avx2", AVX2)
2459 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002460 .Case("sse4.2", SSE42)
2461 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002462 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002463 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002464 .Case("sse2", SSE2)
2465 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002466 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002467 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002468
Eli Friedman33465822011-07-08 23:31:17 +00002469 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002470 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002471 .Case("3dnowa", AMD3DNowAthlon)
2472 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002473 .Case("mmx", MMX)
2474 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002475 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002476
2477 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2478 .Case("xop", XOP)
2479 .Case("fma4", FMA4)
2480 .Case("sse4a", SSE4A)
2481 .Default(NoXOP);
2482 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002483 }
Eli Friedman33465822011-07-08 23:31:17 +00002484
Craig Topper7481d8a2013-09-10 06:55:47 +00002485 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2486 // Can't do this earlier because we need to be able to explicitly enable
2487 // popcnt and still disable sse4.2.
2488 if (!HasPOPCNT && SSELevel >= SSE42 &&
2489 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2490 HasPOPCNT = true;
2491 Features.push_back("+popcnt");
2492 }
2493
Yunzhong Gao61089362013-10-16 19:07:02 +00002494 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2495 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2496 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2497 HasPRFCHW = true;
2498 Features.push_back("+prfchw");
2499 }
2500
Rafael Espindolaeb265472013-08-21 21:59:03 +00002501 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2502 // matches the selected sse level.
2503 if (FPMath == FP_SSE && SSELevel < SSE1) {
2504 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2505 return false;
2506 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2507 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2508 return false;
2509 }
2510
Eli Friedman33465822011-07-08 23:31:17 +00002511 // Don't tell the backend if we're turning off mmx; it will end up disabling
2512 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002513 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2514 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002515 std::vector<std::string>::iterator it;
2516 it = std::find(Features.begin(), Features.end(), "-mmx");
2517 if (it != Features.end())
2518 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002519 else if (SSELevel > NoSSE)
2520 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002521 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002522}
Chris Lattnerecd49032009-03-02 22:27:17 +00002523
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002524/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2525/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002526void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002527 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002528 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002529 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002530 Builder.defineMacro("__amd64__");
2531 Builder.defineMacro("__amd64");
2532 Builder.defineMacro("__x86_64");
2533 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002534 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002535 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002536 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002537
Chris Lattnerecd49032009-03-02 22:27:17 +00002538 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002539 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2540 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002541 switch (CPU) {
2542 case CK_Generic:
2543 break;
2544 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002545 // The rest are coming from the i386 define above.
2546 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 break;
2548 case CK_i486:
2549 case CK_WinChipC6:
2550 case CK_WinChip2:
2551 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002552 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002554 case CK_PentiumMMX:
2555 Builder.defineMacro("__pentium_mmx__");
2556 Builder.defineMacro("__tune_pentium_mmx__");
2557 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 case CK_i586:
2559 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002560 defineCPUMacros(Builder, "i586");
2561 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002562 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002563 case CK_Pentium3:
2564 case CK_Pentium3M:
2565 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002566 Builder.defineMacro("__tune_pentium3__");
2567 // Fallthrough
2568 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002570 Builder.defineMacro("__tune_pentium2__");
2571 // Fallthrough
2572 case CK_PentiumPro:
2573 Builder.defineMacro("__tune_i686__");
2574 Builder.defineMacro("__tune_pentiumpro__");
2575 // Fallthrough
2576 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002577 Builder.defineMacro("__i686");
2578 Builder.defineMacro("__i686__");
2579 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2580 Builder.defineMacro("__pentiumpro");
2581 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002582 break;
2583 case CK_Pentium4:
2584 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002585 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002586 break;
2587 case CK_Yonah:
2588 case CK_Prescott:
2589 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002590 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 break;
2592 case CK_Core2:
2593 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002594 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002595 break;
2596 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002597 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002598 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002599 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002600 defineCPUMacros(Builder, "slm");
2601 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 case CK_Corei7:
2603 case CK_Corei7AVX:
2604 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002605 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002606 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002607 break;
Craig Topper449314e2013-08-20 07:09:39 +00002608 case CK_KNL:
2609 defineCPUMacros(Builder, "knl");
2610 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002612 Builder.defineMacro("__k6_2__");
2613 Builder.defineMacro("__tune_k6_2__");
2614 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002616 if (CPU != CK_K6_2) { // In case of fallthrough
2617 // FIXME: GCC may be enabling these in cases where some other k6
2618 // architecture is specified but -m3dnow is explicitly provided. The
2619 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002620 Builder.defineMacro("__k6_3__");
2621 Builder.defineMacro("__tune_k6_3__");
2622 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002623 // Fallthrough
2624 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002625 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 break;
2627 case CK_Athlon:
2628 case CK_AthlonThunderbird:
2629 case CK_Athlon4:
2630 case CK_AthlonXP:
2631 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002632 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002633 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002634 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002635 Builder.defineMacro("__tune_athlon_sse__");
2636 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 break;
2638 case CK_K8:
2639 case CK_K8SSE3:
2640 case CK_x86_64:
2641 case CK_Opteron:
2642 case CK_OpteronSSE3:
2643 case CK_Athlon64:
2644 case CK_Athlon64SSE3:
2645 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002646 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002647 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002648 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002649 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002650 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002651 case CK_BTVER1:
2652 defineCPUMacros(Builder, "btver1");
2653 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002654 case CK_BTVER2:
2655 defineCPUMacros(Builder, "btver2");
2656 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002657 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002658 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002659 break;
2660 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002661 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002662 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002663 case CK_BDVER3:
2664 defineCPUMacros(Builder, "bdver3");
2665 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002667 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002668 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002669 }
Chris Lattner96e43572009-03-02 22:40:39 +00002670
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002671 // Target properties.
2672 Builder.defineMacro("__LITTLE_ENDIAN__");
2673 Builder.defineMacro("__REGISTER_PREFIX__", "");
2674
Chris Lattner6df41af2009-04-19 17:32:33 +00002675 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2676 // functions in glibc header files that use FP Stack inline asm which the
2677 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002678 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002679
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002680 if (HasAES)
2681 Builder.defineMacro("__AES__");
2682
Craig Topper3f122a72012-05-31 05:18:48 +00002683 if (HasPCLMUL)
2684 Builder.defineMacro("__PCLMUL__");
2685
Craig Topper22967d42011-12-25 05:06:45 +00002686 if (HasLZCNT)
2687 Builder.defineMacro("__LZCNT__");
2688
Benjamin Kramer1e250392012-07-07 09:39:18 +00002689 if (HasRDRND)
2690 Builder.defineMacro("__RDRND__");
2691
Craig Topper22967d42011-12-25 05:06:45 +00002692 if (HasBMI)
2693 Builder.defineMacro("__BMI__");
2694
2695 if (HasBMI2)
2696 Builder.defineMacro("__BMI2__");
2697
Craig Topper1de83482011-12-29 16:10:46 +00002698 if (HasPOPCNT)
2699 Builder.defineMacro("__POPCNT__");
2700
Michael Liao625a8752012-11-10 05:17:46 +00002701 if (HasRTM)
2702 Builder.defineMacro("__RTM__");
2703
Michael Liao74f4eaf2013-03-26 17:52:08 +00002704 if (HasPRFCHW)
2705 Builder.defineMacro("__PRFCHW__");
2706
Michael Liaoffaae352013-03-29 05:17:55 +00002707 if (HasRDSEED)
2708 Builder.defineMacro("__RDSEED__");
2709
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002710 if (HasTBM)
2711 Builder.defineMacro("__TBM__");
2712
Rafael Espindolae62e2792013-08-20 13:44:29 +00002713 switch (XOPLevel) {
2714 case XOP:
2715 Builder.defineMacro("__XOP__");
2716 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002717 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002718 case SSE4A:
2719 Builder.defineMacro("__SSE4A__");
2720 case NoXOP:
2721 break;
2722 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002723
Craig Topperbba778b2012-06-03 21:46:30 +00002724 if (HasFMA)
2725 Builder.defineMacro("__FMA__");
2726
Manman Rena45358c2012-10-11 00:59:55 +00002727 if (HasF16C)
2728 Builder.defineMacro("__F16C__");
2729
Craig Topper679b53a2013-08-21 05:29:10 +00002730 if (HasAVX512CD)
2731 Builder.defineMacro("__AVX512CD__");
2732 if (HasAVX512ER)
2733 Builder.defineMacro("__AVX512ER__");
2734 if (HasAVX512PF)
2735 Builder.defineMacro("__AVX512PF__");
2736
Ben Langmuir58078d02013-09-19 13:22:04 +00002737 if (HasSHA)
2738 Builder.defineMacro("__SHA__");
2739
Nick Lewycky50e8f482013-10-05 20:14:27 +00002740 if (HasCX16)
2741 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2742
Chris Lattner96e43572009-03-02 22:40:39 +00002743 // Each case falls through to the previous one here.
2744 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002745 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002746 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002747 case AVX2:
2748 Builder.defineMacro("__AVX2__");
2749 case AVX:
2750 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002751 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002752 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002753 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002754 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002755 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002756 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002757 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002758 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002759 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002760 Builder.defineMacro("__SSE2__");
2761 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002762 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002763 Builder.defineMacro("__SSE__");
2764 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002765 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002766 break;
2767 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002768
Derek Schuffc7dd7222012-10-11 15:52:22 +00002769 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002770 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002771 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002772 case AVX2:
2773 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002774 case SSE42:
2775 case SSE41:
2776 case SSSE3:
2777 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002778 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002779 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002780 break;
2781 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002782 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002783 break;
2784 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002785 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002786 }
2787 }
2788
Anders Carlssone437c682010-01-27 03:47:49 +00002789 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002790 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002791 case AMD3DNowAthlon:
2792 Builder.defineMacro("__3dNOW_A__");
2793 case AMD3DNow:
2794 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002795 case MMX:
2796 Builder.defineMacro("__MMX__");
2797 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002798 break;
2799 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002800
2801 if (CPU >= CK_i486) {
2802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2804 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2805 }
2806 if (CPU >= CK_i586)
2807 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002808}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002809
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002810bool X86TargetInfo::hasFeature(StringRef Feature) const {
2811 return llvm::StringSwitch<bool>(Feature)
2812 .Case("aes", HasAES)
2813 .Case("avx", SSELevel >= AVX)
2814 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002815 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002816 .Case("avx512cd", HasAVX512CD)
2817 .Case("avx512er", HasAVX512ER)
2818 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002819 .Case("bmi", HasBMI)
2820 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002821 .Case("cx16", HasCX16)
2822 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002823 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002824 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002825 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002826 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002827 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002828 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2829 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2830 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002831 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002832 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002833 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002834 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002835 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002836 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002837 .Case("sse", SSELevel >= SSE1)
2838 .Case("sse2", SSELevel >= SSE2)
2839 .Case("sse3", SSELevel >= SSE3)
2840 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002841 .Case("sse4.1", SSELevel >= SSE41)
2842 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002843 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002844 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002845 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2846 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002847 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002848 .Default(false);
2849}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002850
Eli Friedman3fd920a2008-08-20 02:34:37 +00002851bool
Anders Carlsson58436352009-02-28 17:11:49 +00002852X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002853 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002854 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002855 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002856 case 'Y': // first letter of a pair:
2857 switch (*(Name+1)) {
2858 default: return false;
2859 case '0': // First SSE register.
2860 case 't': // Any SSE register, when SSE2 is enabled.
2861 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2862 case 'm': // any MMX register, when inter-unit moves enabled.
2863 break; // falls through to setAllowsRegister.
2864 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002865 case 'a': // eax.
2866 case 'b': // ebx.
2867 case 'c': // ecx.
2868 case 'd': // edx.
2869 case 'S': // esi.
2870 case 'D': // edi.
2871 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002872 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002873 case 't': // top of floating point stack.
2874 case 'u': // second from top of floating point stack.
2875 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002876 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002877 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002878 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002879 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2880 case 'l': // "Index" registers: any general register that can be used as an
2881 // index in a base+index memory access.
2882 Info.setAllowsRegister();
2883 return true;
2884 case 'C': // SSE floating point constant.
2885 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002886 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002887 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002888 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002889 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002890 return true;
2891 }
2892}
2893
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002894
Eli Friedman3fd920a2008-08-20 02:34:37 +00002895std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002896X86TargetInfo::convertConstraint(const char *&Constraint) const {
2897 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002898 case 'a': return std::string("{ax}");
2899 case 'b': return std::string("{bx}");
2900 case 'c': return std::string("{cx}");
2901 case 'd': return std::string("{dx}");
2902 case 'S': return std::string("{si}");
2903 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002904 case 'p': // address
2905 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002906 case 't': // top of floating point stack.
2907 return std::string("{st}");
2908 case 'u': // second from top of floating point stack.
2909 return std::string("{st(1)}"); // second from top of floating point stack.
2910 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002911 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002912 }
2913}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002914} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002915
2916namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002917// X86-32 generic target
2918class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002919public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002920 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002921 DoubleAlign = LongLongAlign = 32;
2922 LongDoubleWidth = 96;
2923 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002924 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002925 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002926 SizeType = UnsignedInt;
2927 PtrDiffType = SignedInt;
2928 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002929 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002930
2931 // Use fpret for all types.
2932 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2933 (1 << TargetInfo::Double) |
2934 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002935
2936 // x86-32 has atomics up to 8 bytes
2937 // FIXME: Check that we actually have cmpxchg8b before setting
2938 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2939 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002940 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002941 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2942 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002943 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002944
Chris Lattnerd545ad12009-09-23 06:06:36 +00002945 int getEHDataRegisterNumber(unsigned RegNo) const {
2946 if (RegNo == 0) return 0;
2947 if (RegNo == 1) return 2;
2948 return -1;
2949 }
Bill Wendling887b4852012-11-12 06:42:51 +00002950 virtual bool validateInputSize(StringRef Constraint,
2951 unsigned Size) const {
2952 switch (Constraint[0]) {
2953 default: break;
2954 case 'a':
2955 case 'b':
2956 case 'c':
2957 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002958 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002959 }
2960
2961 return true;
2962 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002963};
2964} // end anonymous namespace
2965
2966namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002967class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2968public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002969 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2970 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002971
2972 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002973 unsigned Major, Minor, Micro;
2974 getTriple().getOSVersion(Major, Minor, Micro);
2975 // New NetBSD uses the default rounding mode.
2976 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2977 return X86_32TargetInfo::getFloatEvalMethod();
2978 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002979 return 1;
2980 }
2981};
2982} // end anonymous namespace
2983
2984namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002985class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2986public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002987 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2988 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002989 SizeType = UnsignedLong;
2990 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002991 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002992 }
2993};
2994} // end anonymous namespace
2995
2996namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00002997class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2998public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002999 BitrigI386TargetInfo(const llvm::Triple &Triple)
3000 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003001 SizeType = UnsignedLong;
3002 IntPtrType = SignedLong;
3003 PtrDiffType = SignedLong;
3004 }
3005};
3006} // end anonymous namespace
3007
3008namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003009class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003011 DarwinI386TargetInfo(const llvm::Triple &Triple)
3012 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003013 LongDoubleWidth = 128;
3014 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003015 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003016 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003017 SizeType = UnsignedLong;
3018 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003019 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003020 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003021 }
3022
Eli Friedman3fd920a2008-08-20 02:34:37 +00003023};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003024} // end anonymous namespace
3025
3026namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003027// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003028class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003030 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3031 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003032 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003033 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003034 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003035 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003036 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003037 virtual void getTargetDefines(const LangOptions &Opts,
3038 MacroBuilder &Builder) const {
3039 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3040 }
3041};
3042} // end anonymous namespace
3043
3044namespace {
3045
3046// x86-32 Windows Visual Studio target
3047class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3048public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003049 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3050 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003051 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003052 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3053 }
3054 virtual void getTargetDefines(const LangOptions &Opts,
3055 MacroBuilder &Builder) const {
3056 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3057 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3058 // The value of the following reflects processor type.
3059 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3060 // We lost the original triple, so we use the default.
3061 Builder.defineMacro("_M_IX86", "600");
3062 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003063};
3064} // end anonymous namespace
3065
3066namespace {
3067// x86-32 MinGW target
3068class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3069public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003070 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3071 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003072 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003073 MacroBuilder &Builder) const {
3074 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003075 DefineStd(Builder, "WIN32", Opts);
3076 DefineStd(Builder, "WINNT", Opts);
3077 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003078 Builder.defineMacro("__MSVCRT__");
3079 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003080
3081 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3082 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003083 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003084 // Provide "as-is" __declspec.
3085 Builder.defineMacro("__declspec", "__declspec");
3086 else
3087 // Provide alias of __attribute__ like mingw32-gcc.
3088 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003089 }
3090};
3091} // end anonymous namespace
3092
3093namespace {
3094// x86-32 Cygwin target
3095class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3096public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003097 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3098 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003099 TLSSupported = false;
3100 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003101 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003102 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003103 }
3104 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003105 MacroBuilder &Builder) const {
3106 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003107 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003108 Builder.defineMacro("__CYGWIN__");
3109 Builder.defineMacro("__CYGWIN32__");
3110 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003111 if (Opts.CPlusPlus)
3112 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003113 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003114};
3115} // end anonymous namespace
3116
3117namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003118// x86-32 Haiku target
3119class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3120public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003121 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003122 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003123 IntPtrType = SignedLong;
3124 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003125 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003126 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003127 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003128 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003129 virtual void getTargetDefines(const LangOptions &Opts,
3130 MacroBuilder &Builder) const {
3131 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3132 Builder.defineMacro("__INTEL__");
3133 Builder.defineMacro("__HAIKU__");
3134 }
3135};
3136} // end anonymous namespace
3137
Douglas Gregor9fabd852011-07-01 22:41:14 +00003138// RTEMS Target
3139template<typename Target>
3140class RTEMSTargetInfo : public OSTargetInfo<Target> {
3141protected:
3142 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3143 MacroBuilder &Builder) const {
3144 // RTEMS defines; list based off of gcc output
3145
Douglas Gregor9fabd852011-07-01 22:41:14 +00003146 Builder.defineMacro("__rtems__");
3147 Builder.defineMacro("__ELF__");
3148 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003149
Douglas Gregor9fabd852011-07-01 22:41:14 +00003150public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003151 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3152 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003153
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003154 switch (Triple.getArch()) {
3155 default:
3156 case llvm::Triple::x86:
3157 // this->MCountName = ".mcount";
3158 break;
3159 case llvm::Triple::mips:
3160 case llvm::Triple::mipsel:
3161 case llvm::Triple::ppc:
3162 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003163 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003164 // this->MCountName = "_mcount";
3165 break;
3166 case llvm::Triple::arm:
3167 // this->MCountName = "__mcount";
3168 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003169 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003170 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003171};
3172
3173namespace {
3174// x86-32 RTEMS target
3175class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3176public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003177 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003178 SizeType = UnsignedLong;
3179 IntPtrType = SignedLong;
3180 PtrDiffType = SignedLong;
3181 this->UserLabelPrefix = "";
3182 }
3183 virtual void getTargetDefines(const LangOptions &Opts,
3184 MacroBuilder &Builder) const {
3185 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3186 Builder.defineMacro("__INTEL__");
3187 Builder.defineMacro("__rtems__");
3188 }
3189};
3190} // end anonymous namespace
3191
Chris Lattnerb986aba2010-04-11 19:29:39 +00003192namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003193// x86-64 generic target
3194class X86_64TargetInfo : public X86TargetInfo {
3195public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003196 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003197 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003198 LongDoubleWidth = 128;
3199 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003200 LargeArrayMinWidth = 128;
3201 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003202 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003203 IntMaxType = SignedLong;
3204 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003205 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003206 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003207
Rafael Espindolac418ae92014-01-03 19:22:05 +00003208 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003209
3210 // Use fpret only for long double.
3211 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003212
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003213 // Use fp2ret for _Complex long double.
3214 ComplexLongDoubleUsesFP2Ret = true;
3215
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003216 // x86-64 has atomics up to 16 bytes.
3217 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3218 // on CPUs with cmpxchg16b
3219 MaxAtomicPromoteWidth = 128;
3220 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003221 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003222 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3223 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003224 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003225
Chris Lattnerd545ad12009-09-23 06:06:36 +00003226 int getEHDataRegisterNumber(unsigned RegNo) const {
3227 if (RegNo == 0) return 0;
3228 if (RegNo == 1) return 1;
3229 return -1;
3230 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003231
3232 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003233 return (CC == CC_C ||
3234 CC == CC_IntelOclBicc ||
3235 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003236 }
3237
Aaron Ballman02df2e02012-12-09 17:45:41 +00003238 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3239 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003240 }
3241
Eli Friedman3fd920a2008-08-20 02:34:37 +00003242};
3243} // end anonymous namespace
3244
3245namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003246// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003247class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003249 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3250 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003251 TLSSupported = false;
3252 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003253 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003254 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003255 IntMaxType = SignedLongLong;
3256 UIntMaxType = UnsignedLongLong;
3257 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003258 SizeType = UnsignedLongLong;
3259 PtrDiffType = SignedLongLong;
3260 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003261 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003262 }
3263 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003264 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003265 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003266 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003267 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003268 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3269 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003270 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003271 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3272 return (CC == CC_C ||
3273 CC == CC_IntelOclBicc ||
3274 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3275 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003276};
3277} // end anonymous namespace
3278
3279namespace {
3280// x86-64 Windows Visual Studio target
3281class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3282public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003283 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3284 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003285 LongDoubleWidth = LongDoubleAlign = 64;
3286 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003287 }
3288 virtual void getTargetDefines(const LangOptions &Opts,
3289 MacroBuilder &Builder) const {
3290 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3291 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003292 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003293 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003294 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003295};
3296} // end anonymous namespace
3297
3298namespace {
3299// x86-64 MinGW target
3300class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3301public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003302 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3303 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003304 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003305 MacroBuilder &Builder) const {
3306 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003307 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003308 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003309 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003310 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003311
3312 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3313 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003314 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003315 // Provide "as-is" __declspec.
3316 Builder.defineMacro("__declspec", "__declspec");
3317 else
3318 // Provide alias of __attribute__ like mingw32-gcc.
3319 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003320 }
3321};
3322} // end anonymous namespace
3323
3324namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003325class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003327 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3328 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003329 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003330 MaxVectorAlign = 256;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003331 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003332 }
3333};
3334} // end anonymous namespace
3335
3336namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003337class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003339 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3340 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003341 IntMaxType = SignedLongLong;
3342 UIntMaxType = UnsignedLongLong;
3343 Int64Type = SignedLongLong;
3344 }
3345};
3346} // end anonymous namespace
3347
3348namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003349class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003351 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3352 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3353 IntMaxType = SignedLongLong;
3354 UIntMaxType = UnsignedLongLong;
3355 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003356 }
3357};
Tim Northover9bb857a2013-01-31 12:13:10 +00003358}
3359
3360namespace {
3361class AArch64TargetInfo : public TargetInfo {
3362 static const char * const GCCRegNames[];
3363 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003364
Tim Northover2fe823a2013-08-01 09:23:19 +00003365 enum FPUModeEnum {
3366 FPUMode,
3367 NeonMode
3368 };
3369
3370 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003371 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003372 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003373
Tim Northover9bb857a2013-01-31 12:13:10 +00003374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003375 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003376 BigEndian = false;
3377 LongWidth = LongAlign = 64;
3378 LongDoubleWidth = LongDoubleAlign = 128;
3379 PointerWidth = PointerAlign = 64;
3380 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003381 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003382
3383 WCharType = UnsignedInt;
3384 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3385
Tim Northover847d2d42013-02-18 12:11:32 +00003386 // AArch64 backend supports 64-bit operations at the moment. In principle
3387 // 128-bit is possible if register-pairs are used.
3388 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3389
Tim Northover9bb857a2013-01-31 12:13:10 +00003390 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3391 }
3392 virtual void getTargetDefines(const LangOptions &Opts,
3393 MacroBuilder &Builder) const {
3394 // GCC defines theses currently
3395 Builder.defineMacro("__aarch64__");
3396 Builder.defineMacro("__AARCH64EL__");
3397
3398 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003399 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003400 Builder.defineMacro("__ARM_ARCH", "8");
3401 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003402
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003403 Builder.defineMacro("__ARM_64BIT_STATE");
3404 Builder.defineMacro("__ARM_PCS_AAPCS64");
3405 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3406
Tim Northoverb85654d2013-04-05 14:08:55 +00003407 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3408 Builder.defineMacro("__ARM_FEATURE_CLZ");
3409 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003410 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003411
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003412 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003413
3414 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003415 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003416
3417 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003418 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3419 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003420
3421 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003422 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003423
3424 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003425 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003426
Tim Northoverb85654d2013-04-05 14:08:55 +00003427 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003428 Opts.ShortWChar ? "2" : "4");
3429
Tim Northoverb85654d2013-04-05 14:08:55 +00003430 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003431 Opts.ShortEnums ? "1" : "4");
3432
3433 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003434 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3435
3436 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003437 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003438 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003439 Builder.defineMacro("__ARM_NEON_FP", "7");
3440 }
3441
3442 if (Crypto) {
3443 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003444 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003445 }
3446 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3447 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003448 Records = BuiltinInfo;
3449 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003450 }
3451 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003452 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003453 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003454
Amara Emerson703da2e2013-10-31 09:32:33 +00003455 virtual bool setCPU(const std::string &Name) {
3456 return llvm::StringSwitch<bool>(Name)
3457 .Case("generic", true)
3458 .Cases("cortex-a53", "cortex-a57", true)
3459 .Default(false);
3460 }
3461
Eric Christopher3ff21b32013-10-16 21:26:26 +00003462 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003463 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003464 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003465 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003466 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3467 if (Features[i] == "+neon")
3468 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003469 if (Features[i] == "+crypto")
3470 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003471 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003472 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003473 }
3474
3475 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003476 unsigned &NumNames) const;
3477 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3478 unsigned &NumAliases) const;
3479
3480 virtual bool isCLZForZeroUndef() const { return false; }
3481
3482 virtual bool validateAsmConstraint(const char *&Name,
3483 TargetInfo::ConstraintInfo &Info) const {
3484 switch (*Name) {
3485 default: return false;
3486 case 'w': // An FP/SIMD vector register
3487 Info.setAllowsRegister();
3488 return true;
3489 case 'I': // Constant that can be used with an ADD instruction
3490 case 'J': // Constant that can be used with a SUB instruction
3491 case 'K': // Constant that can be used with a 32-bit logical instruction
3492 case 'L': // Constant that can be used with a 64-bit logical instruction
3493 case 'M': // Constant that can be used as a 32-bit MOV immediate
3494 case 'N': // Constant that can be used as a 64-bit MOV immediate
3495 case 'Y': // Floating point constant zero
3496 case 'Z': // Integer constant zero
3497 return true;
3498 case 'Q': // A memory reference with base register and no offset
3499 Info.setAllowsMemory();
3500 return true;
3501 case 'S': // A symbolic address
3502 Info.setAllowsRegister();
3503 return true;
3504 case 'U':
3505 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3506 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3507 // Usa: An absolute symbolic address
3508 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3509 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3510 }
3511 }
3512
3513 virtual const char *getClobbers() const {
3514 // There are no AArch64 clobbers shared by all asm statements.
3515 return "";
3516 }
3517
3518 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3519 return TargetInfo::AArch64ABIBuiltinVaList;
3520 }
3521};
3522
3523const char * const AArch64TargetInfo::GCCRegNames[] = {
3524 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3525 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3526 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3527 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3528
3529 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3530 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3531 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3532 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3533
3534 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3535 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3536 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3537 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3538
3539 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3540 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3541 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3542 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3543
3544 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3545 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3546 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3547 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3548
3549 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3550 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3551 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3552 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3553
3554 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3555 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3556 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3557 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3558};
3559
3560void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3561 unsigned &NumNames) const {
3562 Names = GCCRegNames;
3563 NumNames = llvm::array_lengthof(GCCRegNames);
3564}
3565
3566const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3567 { { "x16" }, "ip0"},
3568 { { "x17" }, "ip1"},
3569 { { "x29" }, "fp" },
3570 { { "x30" }, "lr" }
3571};
3572
3573void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3574 unsigned &NumAliases) const {
3575 Aliases = GCCRegAliases;
3576 NumAliases = llvm::array_lengthof(GCCRegAliases);
3577
3578}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003579
3580const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3581#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3582#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3583 ALL_LANGUAGES },
3584#include "clang/Basic/BuiltinsAArch64.def"
3585};
3586
Eli Friedman9fa28852012-08-08 23:57:20 +00003587} // end anonymous namespace
3588
3589namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003590class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003591 // Possible FPU choices.
3592 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003593 VFP2FPU = (1 << 0),
3594 VFP3FPU = (1 << 1),
3595 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003596 NeonFPU = (1 << 3),
3597 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003598 };
3599
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003600 // Possible HWDiv features.
3601 enum HWDivMode {
3602 HWDivThumb = (1 << 0),
3603 HWDivARM = (1 << 1)
3604 };
3605
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003606 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003607 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003608 }
3609
3610 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3611 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003612
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003613 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003614
Rafael Espindolaeb265472013-08-21 21:59:03 +00003615 enum {
3616 FP_Default,
3617 FP_VFP,
3618 FP_Neon
3619 } FPMath;
3620
Bernard Ogdenda13af32013-10-24 18:32:51 +00003621 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003622
Logan Chien57086ce2012-10-10 06:56:20 +00003623 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003624 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003625 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003626
3627 // Initialized via features.
3628 unsigned SoftFloat : 1;
3629 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003630
Bernard Ogden18b57012013-10-29 09:47:51 +00003631 unsigned CRC : 1;
3632
Chris Lattner5cc15e02010-03-03 19:03:45 +00003633 static const Builtin::Info BuiltinInfo[];
3634
Rafael Espindola101d5b92013-05-13 20:09:47 +00003635 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3636 // On linux, binaries targeting old cpus call functions in libgcc to
3637 // perform atomic operations. The implementation in libgcc then calls into
3638 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3639 // is that if we assume the kernel is at least as recent as the hardware,
3640 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003641 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003642 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003643 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003644 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003645 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003646 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003647 if (T.getArch() == llvm::Triple::arm) {
3648 if (!ArchName.startswith("armv"))
3649 return false;
3650 StringRef VersionStr = ArchName.substr(4);
3651 unsigned Version;
3652 if (VersionStr.getAsInteger(10, Version))
3653 return false;
3654 return Version >= 6;
3655 }
3656 assert(T.getArch() == llvm::Triple::thumb);
3657 if (!ArchName.startswith("thumbv"))
3658 return false;
3659 StringRef VersionStr = ArchName.substr(6);
3660 unsigned Version;
3661 if (VersionStr.getAsInteger(10, Version))
3662 return false;
3663 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003664 }
3665
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003666 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003667 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003668
3669 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003670 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003671
3672 // size_t is unsigned long on Darwin and netbsd.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003673 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003674 SizeType = UnsignedLong;
3675 else
3676 SizeType = UnsignedInt;
3677
Rafael Espindolac418ae92014-01-03 19:22:05 +00003678 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003679 WCharType = SignedInt;
3680 } else {
3681 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3682 WCharType = UnsignedInt;
3683 }
3684
3685 UseBitFieldTypeAlignment = true;
3686
3687 ZeroLengthBitfieldBoundary = 0;
3688
3689 if (IsThumb) {
3690 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3691 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003692 if (T.isOSBinFormatMachO())
3693 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3694 "v128:64:128-a:0:32-n32-S64";
3695 else
3696 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3697 "v128:64:128-a:0:32-n32-S64";
3698
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003699 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003700 if (T.isOSBinFormatMachO())
3701 DescriptionString = "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3702 else
3703 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003704 }
3705
3706 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003707 }
3708
3709 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003710 const llvm::Triple &T = getTriple();
3711
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003712 IsAAPCS = false;
3713
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003714 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003715
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003716 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003717 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003718 SizeType = UnsignedInt;
3719 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003720 SizeType = UnsignedLong;
3721
3722 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3723 WCharType = SignedInt;
3724
3725 // Do not respect the alignment of bit-field types when laying out
3726 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3727 UseBitFieldTypeAlignment = false;
3728
3729 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3730 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3731 /// gcc.
3732 ZeroLengthBitfieldBoundary = 32;
3733
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003734 if (IsThumb) {
3735 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3736 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003737 if (T.isOSBinFormatMachO())
3738 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3739 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3740 else
3741 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3742 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003743 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003744 if (T.isOSBinFormatMachO())
3745 DescriptionString =
3746 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3747 else
3748 DescriptionString =
3749 "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003750 }
3751
3752 // FIXME: Override "preferred align" for double and long long.
3753 }
3754
Chris Lattner17df24e2008-04-21 18:56:49 +00003755public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003756 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003757 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3758 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003759 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003760 switch (getTriple().getOS()) {
3761 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003762 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003763 break;
3764 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003765 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003766 break;
3767 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003768
Chris Lattner1a8f3942010-04-23 16:29:58 +00003769 // {} in inline assembly are neon specifiers, not assembly variant
3770 // specifiers.
3771 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003772
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003773 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003774 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003775
3776 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003777
3778 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003779 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003780
3781 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003782 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003783 if (shouldUseInlineAtomic(getTriple()))
3784 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003785
3786 // Do force alignment of members that follow zero length bitfields. If
3787 // the alignment of the zero-length bitfield is greater than the member
3788 // that follows it, `bar', `bar' will be aligned as the type of the
3789 // zero length bitfield.
3790 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003791 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003792 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003793 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003794 ABI = Name;
3795
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003796 // The defaults (above) are for AAPCS, check if we need to change them.
3797 //
3798 // FIXME: We need support for -meabi... we could just mangle it into the
3799 // name.
3800 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003801 setABIAPCS();
3802 return true;
3803 }
3804 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3805 setABIAAPCS();
3806 return true;
3807 }
3808 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003809 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003810
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003811 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003812 if (IsAAPCS)
3813 Features["aapcs"] = true;
3814 else
3815 Features["apcs"] = true;
3816
Silviu Barangae5690462013-10-21 10:59:33 +00003817 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003818 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3819 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003820 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3821 CPU == "cortex-a9-mp") {
3822 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003823 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003824 }
3825 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003826 Features["vfp4"] = true;
3827 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003828 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3829 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3830 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003831 Features["vfp4"] = true;
3832 Features["neon"] = true;
3833 Features["hwdiv"] = true;
3834 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003835 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3836 Features["fp-armv8"] = true;
3837 Features["neon"] = true;
3838 Features["hwdiv"] = true;
3839 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003840 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003841 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003842 CPU == "cortex-m4" ||
3843 // Enable the hwdiv extension for all v8a AArch32 cores by
3844 // default.
3845 ArchName == "armv8a" || ArchName == "armv8" ||
3846 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3847 Features["hwdiv"] = true;
3848 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003849 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003850 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003851
Eric Christopher3ff21b32013-10-16 21:26:26 +00003852 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003853 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003854 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003855 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003856 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003857 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003858 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3859 if (Features[i] == "+soft-float")
3860 SoftFloat = true;
3861 else if (Features[i] == "+soft-float-abi")
3862 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003863 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003864 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003865 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003866 FPU |= VFP3FPU;
3867 else if (Features[i] == "+vfp4")
3868 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003869 else if (Features[i] == "+fp-armv8")
3870 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003871 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003872 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003873 else if (Features[i] == "+hwdiv")
3874 HWDiv |= HWDivThumb;
3875 else if (Features[i] == "+hwdiv-arm")
3876 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003877 else if (Features[i] == "+crc")
3878 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003879 }
3880
Rafael Espindolaeb265472013-08-21 21:59:03 +00003881 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3882 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3883 return false;
3884 }
3885
3886 if (FPMath == FP_Neon)
3887 Features.push_back("+neonfp");
3888 else if (FPMath == FP_VFP)
3889 Features.push_back("-neonfp");
3890
Daniel Dunbar893d4752009-12-19 04:15:38 +00003891 // Remove front-end specific options which the backend handles differently.
3892 std::vector<std::string>::iterator it;
3893 it = std::find(Features.begin(), Features.end(), "+soft-float");
3894 if (it != Features.end())
3895 Features.erase(it);
3896 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3897 if (it != Features.end())
3898 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003899 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003900 }
3901
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003902 virtual bool hasFeature(StringRef Feature) const {
3903 return llvm::StringSwitch<bool>(Feature)
3904 .Case("arm", true)
3905 .Case("softfloat", SoftFloat)
3906 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003907 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003908 .Case("hwdiv", HWDiv & HWDivThumb)
3909 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003910 .Default(false);
3911 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003912 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003913 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003914 return llvm::StringSwitch<const char*>(Name)
3915 .Cases("arm8", "arm810", "4")
3916 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3917 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3918 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3919 .Case("ep9312", "4T")
3920 .Cases("arm10tdmi", "arm1020t", "5T")
3921 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3922 .Case("arm926ej-s", "5TEJ")
3923 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3924 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003925 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003927 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003928 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003929 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003930 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003931 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003932 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003933 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003934 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003935 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003936 .Default(0);
3937 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003938 static const char *getCPUProfile(StringRef Name) {
3939 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003940 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003941 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003942 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003943 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003944 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003945 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003946 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003947 virtual bool setCPU(const std::string &Name) {
3948 if (!getCPUDefineSuffix(Name))
3949 return false;
3950
3951 CPU = Name;
3952 return true;
3953 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003954 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003955 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003956 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003957 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 Builder.defineMacro("__arm");
3959 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003960
Chris Lattnerecd49032009-03-02 22:27:17 +00003961 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003962 Builder.defineMacro("__ARMEL__");
3963 Builder.defineMacro("__LITTLE_ENDIAN__");
3964 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003965
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003967 unsigned int CPUArchVer;
3968 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3969 llvm_unreachable("Invalid char for architecture version number");
3970 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003971 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003972 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3973 StringRef CPUProfile = getCPUProfile(CPU);
3974 if (!CPUProfile.empty())
3975 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3976
Mike Stump9d54bd72009-04-08 02:07:04 +00003977 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003978
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003979 // FIXME: It's more complicated than this and we don't really support
3980 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003981 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003982 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003983
David Tweed8f676532012-10-25 13:33:01 +00003984 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003985 // Embedded targets on Darwin follow AAPCS, but not EABI.
3986 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003987 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003988 Builder.defineMacro("__ARM_PCS", "1");
3989
David Tweed8f676532012-10-25 13:33:01 +00003990 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003991 Builder.defineMacro("__ARM_PCS_VFP", "1");
3992 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003993
Daniel Dunbar893d4752009-12-19 04:15:38 +00003994 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003995 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003996
3997 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003998 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003999
4000 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004001 Builder.defineMacro("__THUMBEL__");
4002 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004003 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004004 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004005 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004006 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4007 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004008
4009 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004010 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004011
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004012 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004013 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004014 if (FPU & VFP2FPU)
4015 Builder.defineMacro("__ARM_VFPV2__");
4016 if (FPU & VFP3FPU)
4017 Builder.defineMacro("__ARM_VFPV3__");
4018 if (FPU & VFP4FPU)
4019 Builder.defineMacro("__ARM_VFPV4__");
4020 }
4021
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004022 // This only gets set when Neon instructions are actually available, unlike
4023 // the VFP define, hence the soft float and arch check. This is subtly
4024 // different from gcc, we follow the intent which was that it should be set
4025 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004026 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4027 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004029 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004030
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004031 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4032 Opts.ShortWChar ? "2" : "4");
4033
4034 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4035 Opts.ShortEnums ? "1" : "4");
4036
Bernard Ogden18b57012013-10-29 09:47:51 +00004037 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004038 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004039
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004040 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004041 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4042 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4043 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4044 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4045 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004046 }
4047 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4048 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004049 Records = BuiltinInfo;
4050 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004051 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004052 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004053 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004054 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004055 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004056 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004057 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004058 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004059 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004060 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004061 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004062 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004063 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004064 case 'l': // r0-r7
4065 case 'h': // r8-r15
4066 case 'w': // VFP Floating point register single precision
4067 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004068 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004069 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004070 case 'Q': // A memory address that is a single base register.
4071 Info.setAllowsMemory();
4072 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004073 case 'U': // a memory reference...
4074 switch (Name[1]) {
4075 case 'q': // ...ARMV4 ldrsb
4076 case 'v': // ...VFP load/store (reg+constant offset)
4077 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004078 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004079 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004080 case 'n': // valid address for Neon doubleword vector load/store
4081 case 'm': // valid address for Neon element and structure load/store
4082 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004083 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004084 Info.setAllowsMemory();
4085 Name++;
4086 return true;
4087 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004088 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004089 return false;
4090 }
Evan Chengd863adb2011-06-16 19:13:15 +00004091 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004092 std::string R;
4093 switch (*Constraint) {
4094 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004095 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004096 Constraint++;
4097 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004098 case 'p': // 'p' should be translated to 'r' by default.
4099 R = std::string("r");
4100 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004101 default:
4102 return std::string(1, *Constraint);
4103 }
4104 return R;
4105 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004106 virtual bool validateConstraintModifier(StringRef Constraint,
4107 const char Modifier,
4108 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004109 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004110 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004111
Bill Wendling9d1ee112012-10-25 23:28:48 +00004112 // Strip off constraint modifiers.
4113 while (Constraint[0] == '=' ||
4114 Constraint[0] == '+' ||
4115 Constraint[0] == '&')
4116 Constraint = Constraint.substr(1);
4117
4118 switch (Constraint[0]) {
4119 default: break;
4120 case 'r': {
4121 switch (Modifier) {
4122 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004123 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004124 case 'q':
4125 // A register of size 32 cannot fit a vector type.
4126 return false;
4127 }
4128 }
4129 }
4130
4131 return true;
4132 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004133 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004134 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004135 return "";
4136 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004137
4138 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4139 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4140 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004141
4142 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4143 if (RegNo == 0) return 0;
4144 if (RegNo == 1) return 1;
4145 return -1;
4146 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004147};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004148
Rafael Espindolaeb265472013-08-21 21:59:03 +00004149bool ARMTargetInfo::setFPMath(StringRef Name) {
4150 if (Name == "neon") {
4151 FPMath = FP_Neon;
4152 return true;
4153 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4154 Name == "vfp4") {
4155 FPMath = FP_VFP;
4156 return true;
4157 }
4158 return false;
4159}
4160
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004161const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004162 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004163 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004164 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4165
4166 // Float registers
4167 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4168 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4169 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004170 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004171
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004172 // Double registers
4173 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4174 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004175 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4176 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004177
4178 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004179 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4180 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004181};
4182
4183void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004184 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004185 Names = GCCRegNames;
4186 NumNames = llvm::array_lengthof(GCCRegNames);
4187}
4188
4189const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004190 { { "a1" }, "r0" },
4191 { { "a2" }, "r1" },
4192 { { "a3" }, "r2" },
4193 { { "a4" }, "r3" },
4194 { { "v1" }, "r4" },
4195 { { "v2" }, "r5" },
4196 { { "v3" }, "r6" },
4197 { { "v4" }, "r7" },
4198 { { "v5" }, "r8" },
4199 { { "v6", "rfp" }, "r9" },
4200 { { "sl" }, "r10" },
4201 { { "fp" }, "r11" },
4202 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004203 { { "r13" }, "sp" },
4204 { { "r14" }, "lr" },
4205 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004206 // The S, D and Q registers overlap, but aren't really aliases; we
4207 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004208};
4209
4210void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4211 unsigned &NumAliases) const {
4212 Aliases = GCCRegAliases;
4213 NumAliases = llvm::array_lengthof(GCCRegAliases);
4214}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004215
4216const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004217#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004218#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004219 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004220#include "clang/Basic/BuiltinsARM.def"
4221};
Chris Lattner17df24e2008-04-21 18:56:49 +00004222} // end anonymous namespace.
4223
Eli Friedmanf05b7722008-08-20 07:44:10 +00004224namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004225class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004226 public DarwinTargetInfo<ARMTargetInfo> {
4227protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004228 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004229 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004230 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004231 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004232
Torok Edwinb2b37c62009-06-30 17:10:35 +00004233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004234 DarwinARMTargetInfo(const llvm::Triple &Triple)
4235 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004236 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004237 // iOS always has 64-bit atomic instructions.
4238 // FIXME: This should be based off of the target features in ARMTargetInfo.
4239 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004240
4241 // Darwin on iOS uses a variant of the ARM C++ ABI.
4242 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004243 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004244};
4245} // end anonymous namespace.
4246
Tony Linthicum76329bf2011-12-12 21:14:55 +00004247
4248namespace {
4249// Hexagon abstract base class
4250class HexagonTargetInfo : public TargetInfo {
4251 static const Builtin::Info BuiltinInfo[];
4252 static const char * const GCCRegNames[];
4253 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4254 std::string CPU;
4255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004256 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004257 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004258 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004259
4260 // {} in inline assembly are packet specifiers, not assembly variant
4261 // specifiers.
4262 NoAsmVariants = true;
4263 }
4264
4265 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4266 unsigned &NumRecords) const {
4267 Records = BuiltinInfo;
4268 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4269 }
4270
4271 virtual bool validateAsmConstraint(const char *&Name,
4272 TargetInfo::ConstraintInfo &Info) const {
4273 return true;
4274 }
4275
4276 virtual void getTargetDefines(const LangOptions &Opts,
4277 MacroBuilder &Builder) const;
4278
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004279 virtual bool hasFeature(StringRef Feature) const {
4280 return Feature == "hexagon";
4281 }
4282
Meador Inge5d3fb222012-06-16 03:34:49 +00004283 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4284 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004285 }
4286 virtual void getGCCRegNames(const char * const *&Names,
4287 unsigned &NumNames) const;
4288 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4289 unsigned &NumAliases) const;
4290 virtual const char *getClobbers() const {
4291 return "";
4292 }
Sebastian Pop86500282012-01-13 20:37:10 +00004293
4294 static const char *getHexagonCPUSuffix(StringRef Name) {
4295 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004296 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004297 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004298 .Default(0);
4299 }
4300
Tony Linthicum76329bf2011-12-12 21:14:55 +00004301 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004302 if (!getHexagonCPUSuffix(Name))
4303 return false;
4304
Tony Linthicum76329bf2011-12-12 21:14:55 +00004305 CPU = Name;
4306 return true;
4307 }
4308};
4309
4310void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4311 MacroBuilder &Builder) const {
4312 Builder.defineMacro("qdsp6");
4313 Builder.defineMacro("__qdsp6", "1");
4314 Builder.defineMacro("__qdsp6__", "1");
4315
4316 Builder.defineMacro("hexagon");
4317 Builder.defineMacro("__hexagon", "1");
4318 Builder.defineMacro("__hexagon__", "1");
4319
4320 if(CPU == "hexagonv1") {
4321 Builder.defineMacro("__HEXAGON_V1__");
4322 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4323 if(Opts.HexagonQdsp6Compat) {
4324 Builder.defineMacro("__QDSP6_V1__");
4325 Builder.defineMacro("__QDSP6_ARCH__", "1");
4326 }
4327 }
4328 else if(CPU == "hexagonv2") {
4329 Builder.defineMacro("__HEXAGON_V2__");
4330 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4331 if(Opts.HexagonQdsp6Compat) {
4332 Builder.defineMacro("__QDSP6_V2__");
4333 Builder.defineMacro("__QDSP6_ARCH__", "2");
4334 }
4335 }
4336 else if(CPU == "hexagonv3") {
4337 Builder.defineMacro("__HEXAGON_V3__");
4338 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4339 if(Opts.HexagonQdsp6Compat) {
4340 Builder.defineMacro("__QDSP6_V3__");
4341 Builder.defineMacro("__QDSP6_ARCH__", "3");
4342 }
4343 }
4344 else if(CPU == "hexagonv4") {
4345 Builder.defineMacro("__HEXAGON_V4__");
4346 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4347 if(Opts.HexagonQdsp6Compat) {
4348 Builder.defineMacro("__QDSP6_V4__");
4349 Builder.defineMacro("__QDSP6_ARCH__", "4");
4350 }
4351 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004352 else if(CPU == "hexagonv5") {
4353 Builder.defineMacro("__HEXAGON_V5__");
4354 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4355 if(Opts.HexagonQdsp6Compat) {
4356 Builder.defineMacro("__QDSP6_V5__");
4357 Builder.defineMacro("__QDSP6_ARCH__", "5");
4358 }
4359 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004360}
4361
4362const char * const HexagonTargetInfo::GCCRegNames[] = {
4363 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4364 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4365 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4366 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4367 "p0", "p1", "p2", "p3",
4368 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4369};
4370
4371void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4372 unsigned &NumNames) const {
4373 Names = GCCRegNames;
4374 NumNames = llvm::array_lengthof(GCCRegNames);
4375}
4376
4377
4378const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4379 { { "sp" }, "r29" },
4380 { { "fp" }, "r30" },
4381 { { "lr" }, "r31" },
4382 };
4383
4384void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4385 unsigned &NumAliases) const {
4386 Aliases = GCCRegAliases;
4387 NumAliases = llvm::array_lengthof(GCCRegAliases);
4388}
4389
4390
4391const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4392#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4393#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4394 ALL_LANGUAGES },
4395#include "clang/Basic/BuiltinsHexagon.def"
4396};
4397}
4398
4399
Chris Lattner5ba61f02006-10-14 07:39:34 +00004400namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004401// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4402class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004403 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4404 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004405 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004406public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004407 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004408
Eric Christopher3ff21b32013-10-16 21:26:26 +00004409 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004410 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004411 SoftFloat = false;
4412 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4413 if (Features[i] == "+soft-float")
4414 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004415 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004416 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004417 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004418 MacroBuilder &Builder) const {
4419 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004420 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004421
4422 if (SoftFloat)
4423 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004424 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004425
4426 virtual bool hasFeature(StringRef Feature) const {
4427 return llvm::StringSwitch<bool>(Feature)
4428 .Case("softfloat", SoftFloat)
4429 .Case("sparc", true)
4430 .Default(false);
4431 }
4432
Gabor Greif49991682008-02-21 16:29:08 +00004433 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4434 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004435 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004436 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004437 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4438 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004439 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004440 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004441 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004442 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004443 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004444 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004445 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004446 // FIXME: Implement!
4447 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004448 }
4449 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004450 // FIXME: Implement!
4451 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004452 }
4453};
4454
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004455const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004456 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4457 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4458 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4459 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4460};
4461
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004462void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4463 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004464 Names = GCCRegNames;
4465 NumNames = llvm::array_lengthof(GCCRegNames);
4466}
4467
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004468const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004469 { { "g0" }, "r0" },
4470 { { "g1" }, "r1" },
4471 { { "g2" }, "r2" },
4472 { { "g3" }, "r3" },
4473 { { "g4" }, "r4" },
4474 { { "g5" }, "r5" },
4475 { { "g6" }, "r6" },
4476 { { "g7" }, "r7" },
4477 { { "o0" }, "r8" },
4478 { { "o1" }, "r9" },
4479 { { "o2" }, "r10" },
4480 { { "o3" }, "r11" },
4481 { { "o4" }, "r12" },
4482 { { "o5" }, "r13" },
4483 { { "o6", "sp" }, "r14" },
4484 { { "o7" }, "r15" },
4485 { { "l0" }, "r16" },
4486 { { "l1" }, "r17" },
4487 { { "l2" }, "r18" },
4488 { { "l3" }, "r19" },
4489 { { "l4" }, "r20" },
4490 { { "l5" }, "r21" },
4491 { { "l6" }, "r22" },
4492 { { "l7" }, "r23" },
4493 { { "i0" }, "r24" },
4494 { { "i1" }, "r25" },
4495 { { "i2" }, "r26" },
4496 { { "i3" }, "r27" },
4497 { { "i4" }, "r28" },
4498 { { "i5" }, "r29" },
4499 { { "i6", "fp" }, "r30" },
4500 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004501};
4502
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004503void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4504 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004505 Aliases = GCCRegAliases;
4506 NumAliases = llvm::array_lengthof(GCCRegAliases);
4507}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004508
4509// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4510class SparcV8TargetInfo : public SparcTargetInfo {
4511public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004512 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004513 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004514 }
4515
4516 virtual void getTargetDefines(const LangOptions &Opts,
4517 MacroBuilder &Builder) const {
4518 SparcTargetInfo::getTargetDefines(Opts, Builder);
4519 Builder.defineMacro("__sparcv8");
4520 }
4521};
4522
4523// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4524class SparcV9TargetInfo : public SparcTargetInfo {
4525public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004526 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004527 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004528 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004529 // This is an LP64 platform.
4530 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004531
4532 // OpenBSD uses long long for int64_t and intmax_t.
4533 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4534 IntMaxType = SignedLongLong;
4535 UIntMaxType = UnsignedLongLong;
4536 } else {
4537 IntMaxType = SignedLong;
4538 UIntMaxType = UnsignedLong;
4539 }
4540 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004541
4542 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4543 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4544 LongDoubleWidth = 128;
4545 LongDoubleAlign = 128;
4546 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004547 }
4548
4549 virtual void getTargetDefines(const LangOptions &Opts,
4550 MacroBuilder &Builder) const {
4551 SparcTargetInfo::getTargetDefines(Opts, Builder);
4552 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004553 Builder.defineMacro("__arch64__");
4554 // Solaris and its derivative AuroraUX don't need these variants, but the
4555 // BSDs do.
4556 if (getTriple().getOS() != llvm::Triple::Solaris &&
4557 getTriple().getOS() != llvm::Triple::AuroraUX) {
4558 Builder.defineMacro("__sparc64__");
4559 Builder.defineMacro("__sparc_v9__");
4560 Builder.defineMacro("__sparcv9__");
4561 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004562 }
4563};
4564
Gabor Greif49991682008-02-21 16:29:08 +00004565} // end anonymous namespace.
4566
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004567namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004568class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4569public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004570 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4571 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004572 SizeType = UnsignedInt;
4573 PtrDiffType = SignedInt;
4574 }
4575};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004576class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004577public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004578 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4579 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004580 SizeType = UnsignedInt;
4581 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004582 }
4583};
4584} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004585
Chris Lattnerb781dc792008-05-08 05:58:21 +00004586namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004587 class SystemZTargetInfo : public TargetInfo {
4588 static const char *const GCCRegNames[];
4589
4590 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004591 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004592 TLSSupported = true;
4593 IntWidth = IntAlign = 32;
4594 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4595 PointerWidth = PointerAlign = 64;
4596 LongDoubleWidth = 128;
4597 LongDoubleAlign = 64;
4598 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4599 MinGlobalAlign = 16;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004600 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004601 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4602 }
4603 virtual void getTargetDefines(const LangOptions &Opts,
4604 MacroBuilder &Builder) const {
4605 Builder.defineMacro("__s390__");
4606 Builder.defineMacro("__s390x__");
4607 Builder.defineMacro("__zarch__");
4608 Builder.defineMacro("__LONG_DOUBLE_128__");
4609 }
4610 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4611 unsigned &NumRecords) const {
4612 // FIXME: Implement.
4613 Records = 0;
4614 NumRecords = 0;
4615 }
4616
4617 virtual void getGCCRegNames(const char *const *&Names,
4618 unsigned &NumNames) const;
4619 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4620 unsigned &NumAliases) const {
4621 // No aliases.
4622 Aliases = 0;
4623 NumAliases = 0;
4624 }
4625 virtual bool validateAsmConstraint(const char *&Name,
4626 TargetInfo::ConstraintInfo &info) const;
4627 virtual const char *getClobbers() const {
4628 // FIXME: Is this really right?
4629 return "";
4630 }
4631 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4632 return TargetInfo::SystemZBuiltinVaList;
4633 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004634 virtual bool setCPU(const std::string &Name) {
4635 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4636 .Case("z10", true)
4637 .Case("z196", true)
4638 .Case("zEC12", true)
4639 .Default(false);
4640
4641 // No need to store the CPU yet. There aren't any CPU-specific
4642 // macros to define.
4643 return CPUKnown;
4644 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004645 };
4646
4647 const char *const SystemZTargetInfo::GCCRegNames[] = {
4648 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4649 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4650 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4651 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4652 };
4653
4654 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4655 unsigned &NumNames) const {
4656 Names = GCCRegNames;
4657 NumNames = llvm::array_lengthof(GCCRegNames);
4658 }
4659
4660 bool SystemZTargetInfo::
4661 validateAsmConstraint(const char *&Name,
4662 TargetInfo::ConstraintInfo &Info) const {
4663 switch (*Name) {
4664 default:
4665 return false;
4666
4667 case 'a': // Address register
4668 case 'd': // Data register (equivalent to 'r')
4669 case 'f': // Floating-point register
4670 Info.setAllowsRegister();
4671 return true;
4672
4673 case 'I': // Unsigned 8-bit constant
4674 case 'J': // Unsigned 12-bit constant
4675 case 'K': // Signed 16-bit constant
4676 case 'L': // Signed 20-bit displacement (on all targets we support)
4677 case 'M': // 0x7fffffff
4678 return true;
4679
4680 case 'Q': // Memory with base and unsigned 12-bit displacement
4681 case 'R': // Likewise, plus an index
4682 case 'S': // Memory with base and signed 20-bit displacement
4683 case 'T': // Likewise, plus an index
4684 Info.setAllowsMemory();
4685 return true;
4686 }
4687 }
4688}
4689
4690namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004691 class MSP430TargetInfo : public TargetInfo {
4692 static const char * const GCCRegNames[];
4693 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004694 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004695 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004696 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004697 IntWidth = 16; IntAlign = 16;
4698 LongWidth = 32; LongLongWidth = 64;
4699 LongAlign = LongLongAlign = 16;
4700 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004701 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004702 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004703 IntMaxType = SignedLongLong;
4704 UIntMaxType = UnsignedLongLong;
4705 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004706 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004707 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004708 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004709 }
4710 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004711 MacroBuilder &Builder) const {
4712 Builder.defineMacro("MSP430");
4713 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004714 // FIXME: defines for different 'flavours' of MCU
4715 }
4716 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4717 unsigned &NumRecords) const {
4718 // FIXME: Implement.
4719 Records = 0;
4720 NumRecords = 0;
4721 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004722 virtual bool hasFeature(StringRef Feature) const {
4723 return Feature == "msp430";
4724 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004725 virtual void getGCCRegNames(const char * const *&Names,
4726 unsigned &NumNames) const;
4727 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4728 unsigned &NumAliases) const {
4729 // No aliases.
4730 Aliases = 0;
4731 NumAliases = 0;
4732 }
4733 virtual bool validateAsmConstraint(const char *&Name,
4734 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004735 // No target constraints for now.
4736 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004737 }
4738 virtual const char *getClobbers() const {
4739 // FIXME: Is this really right?
4740 return "";
4741 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004742 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004743 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004744 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004745 }
4746 };
4747
4748 const char * const MSP430TargetInfo::GCCRegNames[] = {
4749 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4750 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4751 };
4752
4753 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4754 unsigned &NumNames) const {
4755 Names = GCCRegNames;
4756 NumNames = llvm::array_lengthof(GCCRegNames);
4757 }
4758}
4759
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004760namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004761
Mike Stump11289f42009-09-09 15:08:12 +00004762 // LLVM and Clang cannot be used directly to output native binaries for
4763 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004764 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004765 //
4766 // TCE uses the llvm bitcode as input and uses it for generating customized
4767 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004768 // publicly available in http://tce.cs.tut.fi
4769
Eli Friedman1f191002011-10-07 19:51:42 +00004770 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4771 3, // opencl_global
4772 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004773 5, // opencl_constant
4774 0, // cuda_device
4775 0, // cuda_constant
4776 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004777 };
4778
Eli Friedmana9c3d712009-08-19 20:47:07 +00004779 class TCETargetInfo : public TargetInfo{
4780 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004781 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004782 TLSSupported = false;
4783 IntWidth = 32;
4784 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004785 PointerWidth = 32;
4786 IntAlign = 32;
4787 LongAlign = LongLongAlign = 32;
4788 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004789 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004790 SizeType = UnsignedInt;
4791 IntMaxType = SignedLong;
4792 UIntMaxType = UnsignedLong;
4793 IntPtrType = SignedInt;
4794 PtrDiffType = SignedInt;
4795 FloatWidth = 32;
4796 FloatAlign = 32;
4797 DoubleWidth = 32;
4798 DoubleAlign = 32;
4799 LongDoubleWidth = 32;
4800 LongDoubleAlign = 32;
4801 FloatFormat = &llvm::APFloat::IEEEsingle;
4802 DoubleFormat = &llvm::APFloat::IEEEsingle;
4803 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00004804 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
4805 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004806 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004807 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004808 }
4809
4810 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004811 MacroBuilder &Builder) const {
4812 DefineStd(Builder, "tce", Opts);
4813 Builder.defineMacro("__TCE__");
4814 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004815 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004816 virtual bool hasFeature(StringRef Feature) const {
4817 return Feature == "tce";
4818 }
4819
Eli Friedmana9c3d712009-08-19 20:47:07 +00004820 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4821 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004822 virtual const char *getClobbers() const {
4823 return "";
4824 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004825 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4826 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004827 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004828 virtual void getGCCRegNames(const char * const *&Names,
4829 unsigned &NumNames) const {}
4830 virtual bool validateAsmConstraint(const char *&Name,
4831 TargetInfo::ConstraintInfo &info) const {
4832 return true;
4833 }
4834 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4835 unsigned &NumAliases) const {}
4836 };
4837}
4838
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004839namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004840class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004841 virtual void setDescriptionString() = 0;
4842
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004843 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004844 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004845 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004846 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004847 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004848 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004849 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004850 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004851 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004852 enum DspRevEnum {
4853 NoDSP, DSP1, DSP2
4854 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004855 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004856
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004857protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004858 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004859 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004860
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004861public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004862 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4863 const std::string &CPUStr)
4864 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004865 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004866 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004867
Eric Christopher0b26a612010-03-02 02:41:08 +00004868 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004869 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004870 virtual bool setCPU(const std::string &Name) {
4871 CPU = Name;
4872 return true;
4873 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004874 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004875 Features[ABI] = true;
4876 Features[CPU] = true;
4877 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004878
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004879 virtual void getTargetDefines(const LangOptions &Opts,
4880 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004881 DefineStd(Builder, "mips", Opts);
4882 Builder.defineMacro("_mips");
4883 Builder.defineMacro("__REGISTER_PREFIX__", "");
4884
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004885 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004886 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004887 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004888 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004889 case SoftFloat:
4890 Builder.defineMacro("__mips_soft_float", Twine(1));
4891 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004892 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004893
Simon Atanasyan16071912013-04-14 14:07:30 +00004894 if (IsSingleFloat)
4895 Builder.defineMacro("__mips_single_float", Twine(1));
4896
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004897 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4898 Builder.defineMacro("_MIPS_FPSET",
4899 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4900
Simon Atanasyan72244b62012-07-05 16:06:06 +00004901 if (IsMips16)
4902 Builder.defineMacro("__mips16", Twine(1));
4903
Simon Atanasyan60777612013-04-14 14:07:51 +00004904 if (IsMicromips)
4905 Builder.defineMacro("__mips_micromips", Twine(1));
4906
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004907 if (IsNan2008)
4908 Builder.defineMacro("__mips_nan2008", Twine(1));
4909
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004910 switch (DspRev) {
4911 default:
4912 break;
4913 case DSP1:
4914 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4915 Builder.defineMacro("__mips_dsp", Twine(1));
4916 break;
4917 case DSP2:
4918 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4919 Builder.defineMacro("__mips_dspr2", Twine(1));
4920 Builder.defineMacro("__mips_dsp", Twine(1));
4921 break;
4922 }
4923
Jack Carter44ff1e52013-08-12 17:20:29 +00004924 if (HasMSA)
4925 Builder.defineMacro("__mips_msa", Twine(1));
4926
Simon Atanasyan26f19672012-04-05 19:28:31 +00004927 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4928 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4929 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004930
4931 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4932 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004933 }
4934
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004935 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4936 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004937 Records = BuiltinInfo;
4938 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004939 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004940 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004941 return llvm::StringSwitch<bool>(Feature)
4942 .Case("mips", true)
4943 .Case("fp64", HasFP64)
4944 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004945 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004946 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4947 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004948 }
4949 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004950 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004951 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004952 // CPU register names
4953 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004954 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4955 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4956 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004957 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4958 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004959 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4960 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4961 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4962 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004963 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004964 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004965 "$fcc5","$fcc6","$fcc7",
4966 // MSA register names
4967 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4968 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4969 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4970 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4971 // MSA control register names
4972 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4973 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004974 };
4975 Names = GCCRegNames;
4976 NumNames = llvm::array_lengthof(GCCRegNames);
4977 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004978 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004979 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004980 virtual bool validateAsmConstraint(const char *&Name,
4981 TargetInfo::ConstraintInfo &Info) const {
4982 switch (*Name) {
4983 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004984 return false;
4985
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004986 case 'r': // CPU registers.
4987 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4988 case 'y': // Equivalent to "r", backwards compatibility only.
4989 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004990 case 'c': // $25 for indirect jumps
4991 case 'l': // lo register
4992 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004993 Info.setAllowsRegister();
4994 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004995 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004996 Info.setAllowsMemory();
4997 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004998 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004999 }
5000
5001 virtual const char *getClobbers() const {
5002 // FIXME: Implement!
5003 return "";
5004 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005005
Eric Christopher3ff21b32013-10-16 21:26:26 +00005006 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00005007 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005008 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005009 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005010 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005011 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005012 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005013 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005014 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005015
5016 for (std::vector<std::string>::iterator it = Features.begin(),
5017 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005018 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005019 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005020 else if (*it == "+soft-float")
5021 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005022 else if (*it == "+mips16")
5023 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005024 else if (*it == "+micromips")
5025 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005026 else if (*it == "+dsp")
5027 DspRev = std::max(DspRev, DSP1);
5028 else if (*it == "+dspr2")
5029 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005030 else if (*it == "+msa")
5031 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005032 else if (*it == "+fp64")
5033 HasFP64 = true;
5034 else if (*it == "-fp64")
5035 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005036 else if (*it == "+nan2008")
5037 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005038 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005039
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005040 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005041 std::vector<std::string>::iterator it =
5042 std::find(Features.begin(), Features.end(), "+soft-float");
5043 if (it != Features.end())
5044 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005045 it = std::find(Features.begin(), Features.end(), "+nan2008");
5046 if (it != Features.end())
5047 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005048
Akira Hatanaka9064e362013-10-29 18:30:33 +00005049 setDescriptionString();
5050
Rafael Espindolaeb265472013-08-21 21:59:03 +00005051 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005052 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005053
5054 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5055 if (RegNo == 0) return 4;
5056 if (RegNo == 1) return 5;
5057 return -1;
5058 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005059};
5060
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005061const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5062#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5063#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5064 ALL_LANGUAGES },
5065#include "clang/Basic/BuiltinsMips.def"
5066};
5067
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005068class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005069public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005070 Mips32TargetInfoBase(const llvm::Triple &Triple)
5071 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005072 SizeType = UnsignedInt;
5073 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005074 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005075 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005076 virtual bool setABI(const std::string &Name) {
5077 if ((Name == "o32") || (Name == "eabi")) {
5078 ABI = Name;
5079 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005080 } else if (Name == "32") {
5081 ABI = "o32";
5082 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005083 } else
5084 return false;
5085 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005086 virtual void getTargetDefines(const LangOptions &Opts,
5087 MacroBuilder &Builder) const {
5088 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005089
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005090 if (ABI == "o32") {
5091 Builder.defineMacro("__mips_o32");
5092 Builder.defineMacro("_ABIO32", "1");
5093 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5094 }
5095 else if (ABI == "eabi")
5096 Builder.defineMacro("__mips_eabi");
5097 else
David Blaikie83d382b2011-09-23 05:06:16 +00005098 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005099 }
5100 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5101 unsigned &NumAliases) const {
5102 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5103 { { "at" }, "$1" },
5104 { { "v0" }, "$2" },
5105 { { "v1" }, "$3" },
5106 { { "a0" }, "$4" },
5107 { { "a1" }, "$5" },
5108 { { "a2" }, "$6" },
5109 { { "a3" }, "$7" },
5110 { { "t0" }, "$8" },
5111 { { "t1" }, "$9" },
5112 { { "t2" }, "$10" },
5113 { { "t3" }, "$11" },
5114 { { "t4" }, "$12" },
5115 { { "t5" }, "$13" },
5116 { { "t6" }, "$14" },
5117 { { "t7" }, "$15" },
5118 { { "s0" }, "$16" },
5119 { { "s1" }, "$17" },
5120 { { "s2" }, "$18" },
5121 { { "s3" }, "$19" },
5122 { { "s4" }, "$20" },
5123 { { "s5" }, "$21" },
5124 { { "s6" }, "$22" },
5125 { { "s7" }, "$23" },
5126 { { "t8" }, "$24" },
5127 { { "t9" }, "$25" },
5128 { { "k0" }, "$26" },
5129 { { "k1" }, "$27" },
5130 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005131 { { "sp","$sp" }, "$29" },
5132 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005133 { { "ra" }, "$31" }
5134 };
5135 Aliases = GCCRegAliases;
5136 NumAliases = llvm::array_lengthof(GCCRegAliases);
5137 }
5138};
5139
5140class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005141 virtual void setDescriptionString() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005142 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005143 }
5144
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005145public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005146 Mips32EBTargetInfo(const llvm::Triple &Triple)
5147 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005148 }
5149 virtual void getTargetDefines(const LangOptions &Opts,
5150 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005151 DefineStd(Builder, "MIPSEB", Opts);
5152 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005153 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005154 }
5155};
5156
5157class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005158 virtual void setDescriptionString() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005159 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005160 }
5161
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005162public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005163 Mips32ELTargetInfo(const llvm::Triple &Triple)
5164 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005165 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005166 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005167 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005168 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005169 DefineStd(Builder, "MIPSEL", Opts);
5170 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005171 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005172 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005173};
Akira Hatanakabef17452011-09-20 19:21:49 +00005174
5175class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005176public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005177 Mips64TargetInfoBase(const llvm::Triple &Triple)
5178 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005179 LongWidth = LongAlign = 64;
5180 PointerWidth = PointerAlign = 64;
5181 LongDoubleWidth = LongDoubleAlign = 128;
5182 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005183 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5184 LongDoubleWidth = LongDoubleAlign = 64;
5185 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5186 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005187 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005188 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005189 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005190 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005191 if (Name == "n32") {
5192 LongWidth = LongAlign = 32;
5193 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005194 ABI = Name;
5195 return true;
5196 } else if (Name == "n64") {
5197 ABI = Name;
5198 return true;
5199 } else if (Name == "64") {
5200 ABI = "n64";
5201 return true;
5202 } else
5203 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005204 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005205 virtual void getTargetDefines(const LangOptions &Opts,
5206 MacroBuilder &Builder) const {
5207 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005208
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005209 Builder.defineMacro("__mips64");
5210 Builder.defineMacro("__mips64__");
5211
Akira Hatanakabef17452011-09-20 19:21:49 +00005212 if (ABI == "n32") {
5213 Builder.defineMacro("__mips_n32");
5214 Builder.defineMacro("_ABIN32", "2");
5215 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5216 }
5217 else if (ABI == "n64") {
5218 Builder.defineMacro("__mips_n64");
5219 Builder.defineMacro("_ABI64", "3");
5220 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5221 }
5222 else
David Blaikie83d382b2011-09-23 05:06:16 +00005223 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005224 }
5225 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5226 unsigned &NumAliases) const {
5227 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5228 { { "at" }, "$1" },
5229 { { "v0" }, "$2" },
5230 { { "v1" }, "$3" },
5231 { { "a0" }, "$4" },
5232 { { "a1" }, "$5" },
5233 { { "a2" }, "$6" },
5234 { { "a3" }, "$7" },
5235 { { "a4" }, "$8" },
5236 { { "a5" }, "$9" },
5237 { { "a6" }, "$10" },
5238 { { "a7" }, "$11" },
5239 { { "t0" }, "$12" },
5240 { { "t1" }, "$13" },
5241 { { "t2" }, "$14" },
5242 { { "t3" }, "$15" },
5243 { { "s0" }, "$16" },
5244 { { "s1" }, "$17" },
5245 { { "s2" }, "$18" },
5246 { { "s3" }, "$19" },
5247 { { "s4" }, "$20" },
5248 { { "s5" }, "$21" },
5249 { { "s6" }, "$22" },
5250 { { "s7" }, "$23" },
5251 { { "t8" }, "$24" },
5252 { { "t9" }, "$25" },
5253 { { "k0" }, "$26" },
5254 { { "k1" }, "$27" },
5255 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005256 { { "sp","$sp" }, "$29" },
5257 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005258 { { "ra" }, "$31" }
5259 };
5260 Aliases = GCCRegAliases;
5261 NumAliases = llvm::array_lengthof(GCCRegAliases);
5262 }
5263};
5264
5265class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005266 virtual void setDescriptionString() {
5267 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005268 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005269 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005270 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005271
Akira Hatanakabef17452011-09-20 19:21:49 +00005272 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005273
Akira Hatanakabef17452011-09-20 19:21:49 +00005274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005275 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005276 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005277 virtual void getTargetDefines(const LangOptions &Opts,
5278 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005279 DefineStd(Builder, "MIPSEB", Opts);
5280 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005281 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005282 }
5283};
5284
5285class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005286 virtual void setDescriptionString() {
5287 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005288 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005289 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005290 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005291 }
5292public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005293 Mips64ELTargetInfo(const llvm::Triple &Triple)
5294 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005295 // Default ABI is n64.
5296 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005297 }
5298 virtual void getTargetDefines(const LangOptions &Opts,
5299 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005300 DefineStd(Builder, "MIPSEL", Opts);
5301 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005302 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005303 }
5304};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005305} // end anonymous namespace.
5306
Ivan Krasindd7403e2011-08-24 20:22:22 +00005307namespace {
5308class PNaClTargetInfo : public TargetInfo {
5309public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005310 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005311 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005312 this->UserLabelPrefix = "";
5313 this->LongAlign = 32;
5314 this->LongWidth = 32;
5315 this->PointerAlign = 32;
5316 this->PointerWidth = 32;
5317 this->IntMaxType = TargetInfo::SignedLongLong;
5318 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5319 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005320 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005321 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005322 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005323 this->SizeType = TargetInfo::UnsignedInt;
5324 this->PtrDiffType = TargetInfo::SignedInt;
5325 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005326 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005327 }
5328
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005329 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005330 }
5331 virtual void getArchDefines(const LangOptions &Opts,
5332 MacroBuilder &Builder) const {
5333 Builder.defineMacro("__le32__");
5334 Builder.defineMacro("__pnacl__");
5335 }
5336 virtual void getTargetDefines(const LangOptions &Opts,
5337 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005338 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005339 getArchDefines(Opts, Builder);
5340 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005341 virtual bool hasFeature(StringRef Feature) const {
5342 return Feature == "pnacl";
5343 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005344 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5345 unsigned &NumRecords) const {
5346 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005347 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5348 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005349 }
5350 virtual void getGCCRegNames(const char * const *&Names,
5351 unsigned &NumNames) const;
5352 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5353 unsigned &NumAliases) const;
5354 virtual bool validateAsmConstraint(const char *&Name,
5355 TargetInfo::ConstraintInfo &Info) const {
5356 return false;
5357 }
5358
5359 virtual const char *getClobbers() const {
5360 return "";
5361 }
5362};
5363
5364void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5365 unsigned &NumNames) const {
5366 Names = NULL;
5367 NumNames = 0;
5368}
5369
5370void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5371 unsigned &NumAliases) const {
5372 Aliases = NULL;
5373 NumAliases = 0;
5374}
5375} // end anonymous namespace.
5376
Guy Benyeib798fc92012-12-11 21:38:14 +00005377namespace {
5378 static const unsigned SPIRAddrSpaceMap[] = {
5379 1, // opencl_global
5380 3, // opencl_local
5381 2, // opencl_constant
5382 0, // cuda_device
5383 0, // cuda_constant
5384 0 // cuda_shared
5385 };
5386 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005387 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005388 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005389 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5390 "SPIR target must use unknown OS");
5391 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5392 "SPIR target must use unknown environment type");
5393 BigEndian = false;
5394 TLSSupported = false;
5395 LongWidth = LongAlign = 64;
5396 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005397 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005398 // Define available target features
5399 // These must be defined in sorted order!
5400 NoAsmVariants = true;
5401 }
5402 virtual void getTargetDefines(const LangOptions &Opts,
5403 MacroBuilder &Builder) const {
5404 DefineStd(Builder, "SPIR", Opts);
5405 }
5406 virtual bool hasFeature(StringRef Feature) const {
5407 return Feature == "spir";
5408 }
5409
5410 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5411 unsigned &NumRecords) const {}
5412 virtual const char *getClobbers() const {
5413 return "";
5414 }
5415 virtual void getGCCRegNames(const char * const *&Names,
5416 unsigned &NumNames) const {}
5417 virtual bool validateAsmConstraint(const char *&Name,
5418 TargetInfo::ConstraintInfo &info) const {
5419 return true;
5420 }
5421 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5422 unsigned &NumAliases) const {}
5423 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5424 return TargetInfo::VoidPtrBuiltinVaList;
5425 }
5426 };
5427
5428
5429 class SPIR32TargetInfo : public SPIRTargetInfo {
5430 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005431 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005432 PointerWidth = PointerAlign = 32;
5433 SizeType = TargetInfo::UnsignedInt;
5434 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5435 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005436 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5437 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005438 }
5439 virtual void getTargetDefines(const LangOptions &Opts,
5440 MacroBuilder &Builder) const {
5441 DefineStd(Builder, "SPIR32", Opts);
5442 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005443 };
5444
5445 class SPIR64TargetInfo : public SPIRTargetInfo {
5446 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005447 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005448 PointerWidth = PointerAlign = 64;
5449 SizeType = TargetInfo::UnsignedLong;
5450 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005451 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5452 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005453 }
5454 virtual void getTargetDefines(const LangOptions &Opts,
5455 MacroBuilder &Builder) const {
5456 DefineStd(Builder, "SPIR64", Opts);
5457 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005458 };
5459}
5460
Robert Lytton0e076492013-08-13 09:43:10 +00005461namespace {
5462class XCoreTargetInfo : public TargetInfo {
5463 static const Builtin::Info BuiltinInfo[];
5464public:
5465 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5466 BigEndian = false;
5467 NoAsmVariants = true;
5468 LongLongAlign = 32;
5469 SuitableAlign = 32;
5470 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005471 SizeType = UnsignedInt;
5472 PtrDiffType = SignedInt;
5473 IntPtrType = SignedInt;
5474 WCharType = UnsignedChar;
5475 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005476 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005477 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005478 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005479 }
5480 virtual void getTargetDefines(const LangOptions &Opts,
5481 MacroBuilder &Builder) const {
5482 Builder.defineMacro("__XS1B__");
5483 }
5484 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5485 unsigned &NumRecords) const {
5486 Records = BuiltinInfo;
5487 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5488 }
5489 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5490 return TargetInfo::VoidPtrBuiltinVaList;
5491 }
5492 virtual const char *getClobbers() const {
5493 return "";
5494 }
5495 virtual void getGCCRegNames(const char * const *&Names,
5496 unsigned &NumNames) const {
5497 static const char * const GCCRegNames[] = {
5498 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5499 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5500 };
5501 Names = GCCRegNames;
5502 NumNames = llvm::array_lengthof(GCCRegNames);
5503 }
5504 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5505 unsigned &NumAliases) const {
5506 Aliases = NULL;
5507 NumAliases = 0;
5508 }
5509 virtual bool validateAsmConstraint(const char *&Name,
5510 TargetInfo::ConstraintInfo &Info) const {
5511 return false;
5512 }
5513};
5514
5515const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5516#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5517#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5518 ALL_LANGUAGES },
5519#include "clang/Basic/BuiltinsXCore.def"
5520};
5521} // end anonymous namespace.
5522
Ivan Krasindd7403e2011-08-24 20:22:22 +00005523
Chris Lattner5ba61f02006-10-14 07:39:34 +00005524//===----------------------------------------------------------------------===//
5525// Driver code
5526//===----------------------------------------------------------------------===//
5527
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005528static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005529 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005530
Daniel Dunbar52322032009-08-18 05:47:58 +00005531 switch (Triple.getArch()) {
5532 default:
5533 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005534
Robert Lytton0e076492013-08-13 09:43:10 +00005535 case llvm::Triple::xcore:
5536 return new XCoreTargetInfo(Triple);
5537
Tony Linthicum76329bf2011-12-12 21:14:55 +00005538 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005539 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005540
Tim Northover9bb857a2013-01-31 12:13:10 +00005541 case llvm::Triple::aarch64:
5542 switch (os) {
5543 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005544 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00005545 case llvm::Triple::NetBSD:
5546 return new NetBSDTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005547 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005548 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005549 }
5550
Daniel Dunbar52322032009-08-18 05:47:58 +00005551 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005552 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00005553 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005554 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005555
Daniel Dunbar52322032009-08-18 05:47:58 +00005556 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005557 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005558 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005559 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005560 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005561 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005562 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005563 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005564 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005565 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005566 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005567 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005568 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005569 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005570 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005571 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005572 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005573 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005574
Daniel Dunbar52322032009-08-18 05:47:58 +00005575 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005576 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005577
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005578 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005579 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005580 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005582 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005583 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005584 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005585 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005586 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005587 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005588 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005589 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005590 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005591
5592 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005593 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005594 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005595 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005596 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005597 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005598 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005599 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005600 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005601 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005602 case llvm::Triple::NaCl:
5603 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005604 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005605 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005606 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005607
Akira Hatanakabef17452011-09-20 19:21:49 +00005608 case llvm::Triple::mips64:
5609 switch (os) {
5610 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005611 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005612 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005613 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005614 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005615 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005616 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005617 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005618 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005619 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005620 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005621 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005622 }
5623
5624 case llvm::Triple::mips64el:
5625 switch (os) {
5626 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005627 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005628 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005629 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005630 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005631 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005632 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005633 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005634 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005635 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005636 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005637 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005638 }
5639
Ivan Krasindd7403e2011-08-24 20:22:22 +00005640 case llvm::Triple::le32:
5641 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005642 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005643 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005644 default:
5645 return NULL;
5646 }
5647
Daniel Dunbar52322032009-08-18 05:47:58 +00005648 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005649 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005650 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005651 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005652 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005653 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005654 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005655 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005656 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005657 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005658 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005659 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005660 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005662 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005663 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005664 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005665
5666 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005667 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005668 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005669 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005670 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005671 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005672 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005673 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005674 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005675 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005676 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005678 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005679 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005680 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005681
Bill Schmidt778d3872013-07-26 01:36:11 +00005682 case llvm::Triple::ppc64le:
5683 switch (os) {
5684 case llvm::Triple::Linux:
5685 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5686 default:
5687 return new PPC64TargetInfo(Triple);
5688 }
5689
Peter Collingbournec947aae2012-05-20 23:28:41 +00005690 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005691 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005692 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005693 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005694
Eli Friedmand13b41e2012-10-12 23:32:00 +00005695 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005696 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005697
Daniel Dunbar52322032009-08-18 05:47:58 +00005698 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005699 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005700 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005701 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005702 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005703 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005704 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005705 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005706 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005708 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005709 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005710 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005711 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005712 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005713 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005714 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005715
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005716 case llvm::Triple::sparcv9:
5717 switch (os) {
5718 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005719 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005720 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005721 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005722 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005723 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005724 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005725 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005726 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005727 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005728 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005729 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005730 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005731 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005732 }
5733
Ulrich Weigand47445072013-05-06 16:26:41 +00005734 case llvm::Triple::systemz:
5735 switch (os) {
5736 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005737 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005738 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005739 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005740 }
5741
Eli Friedmana9c3d712009-08-19 20:47:07 +00005742 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005743 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005744
Daniel Dunbar52322032009-08-18 05:47:58 +00005745 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005746 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005747 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005748
Daniel Dunbar52322032009-08-18 05:47:58 +00005749 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005750 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005751 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005752 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005753 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005754 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005755 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005756 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005757 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005758 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005759 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005760 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005761 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005762 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005763 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005764 case llvm::Triple::KFreeBSD:
5765 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005766 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005767 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005768 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005769 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005770 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005771 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005772 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005773 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005774 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005776 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005778 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005779 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005780 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005781 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005782 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005784 }
5785
5786 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005787 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005789
Daniel Dunbar52322032009-08-18 05:47:58 +00005790 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005791 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005793 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005794 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005795 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005796 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005797 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005798 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005799 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005800 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005801 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005803 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005804 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005805 case llvm::Triple::KFreeBSD:
5806 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005807 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005808 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005809 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005810 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005811 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005812 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005813 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005814 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005815 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005816 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005817 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005818
5819 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005820 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005821 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005822 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005824 }
5825 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005826 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005827 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005828 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005829 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005830 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005831 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005832}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005833
5834/// CreateTargetInfo - Return the target info object for the specified target
5835/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005836TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005837 TargetOptions *Opts) {
5838 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005839
5840 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005841 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005842 if (!Target) {
5843 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5844 return 0;
5845 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005846 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005847
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005848 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005849 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5850 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005851 return 0;
5852 }
5853
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005854 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005855 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5856 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005857 return 0;
5858 }
5859
Rafael Espindolaeb265472013-08-21 21:59:03 +00005860 // Set the fp math unit.
5861 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5862 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5863 return 0;
5864 }
5865
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005866 // Compute the default target features, we need the target to handle this
5867 // because features may have dependencies on one another.
5868 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005869 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005870
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005871 // Apply the user specified deltas.
5872 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5873 I < N; ++I) {
5874 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005875 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005876 bool Enabled = Name[0] == '+';
5877 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005878 }
5879
5880 // Add the features to the compile options.
5881 //
5882 // FIXME: If we are completely confident that we have the right set, we only
5883 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005884 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005885 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5886 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005887 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005888 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005889 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005890
5891 return Target.take();
5892}