blob: 0de37da809d598403cdf49ea90d10cf17bb60fc4 [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__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Jim Grosbache2bfac42013-11-19 20:18:39 +0000141 // If there's an environment specified in the triple, that means we're dealing
142 // with an embedded variant of some sort and don't want the platform
143 // version-min defines, so only add them if there's not one.
144 if (Triple.getEnvironmentName().empty()) {
145 // Set the appropriate OS version define.
146 if (Triple.isiOS()) {
147 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
148 char Str[6];
149 Str[0] = '0' + Maj;
150 Str[1] = '0' + (Min / 10);
151 Str[2] = '0' + (Min % 10);
152 Str[3] = '0' + (Rev / 10);
153 Str[4] = '0' + (Rev % 10);
154 Str[5] = '\0';
155 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
156 Str);
157 } else {
158 // Note that the Driver allows versions which aren't representable in the
159 // define (because we only get a single digit for the minor and micro
160 // revision numbers). So, we limit them to the maximum representable
161 // version.
162 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
163 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
164 char Str[5];
165 Str[0] = '0' + (Maj / 10);
166 Str[1] = '0' + (Maj % 10);
167 Str[2] = '0' + std::min(Min, 9U);
168 Str[3] = '0' + std::min(Rev, 9U);
169 Str[4] = '\0';
170 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
171 }
Daniel Dunbar497ff132009-04-10 19:52:24 +0000172 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000173
174 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000175}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000176
Chris Lattner30ba6742009-08-10 19:03:04 +0000177namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000178template<typename Target>
179class DarwinTargetInfo : public OSTargetInfo<Target> {
180protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000181 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000182 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000183 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000184 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000185 }
Mike Stump11289f42009-09-09 15:08:12 +0000186
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000188 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
189 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
190 this->MCountName = "\01mcount";
191 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000192
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000193 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000194 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000195 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000196 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000197 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000198 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000199 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000200 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000201
Anders Carlsson851318a2010-06-08 22:47:50 +0000202 virtual const char *getStaticInitSectionSpecifier() const {
203 // FIXME: We should return 0 when building kexts.
204 return "__TEXT,__StaticInit,regular,pure_instructions";
205 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000206
John McCalleed64c72012-01-29 01:20:30 +0000207 /// Darwin does not support protected visibility. Darwin's "default"
208 /// is very similar to ELF's "protected"; Darwin requires a "weak"
209 /// attribute on declarations that can be dynamically replaced.
210 virtual bool hasProtectedVisibility() const {
211 return false;
212 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213};
214
Chris Lattner30ba6742009-08-10 19:03:04 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216// DragonFlyBSD Target
217template<typename Target>
218class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
219protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000220 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000221 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000223 Builder.defineMacro("__DragonFly__");
224 Builder.defineMacro("__DragonFly_cc_version", "100001");
225 Builder.defineMacro("__ELF__");
226 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
227 Builder.defineMacro("__tune_i386__");
228 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000229 }
230public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000231 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
232 : OSTargetInfo<Target>(Triple) {
233 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000234
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000235 switch (Triple.getArch()) {
236 default:
237 case llvm::Triple::x86:
238 case llvm::Triple::x86_64:
239 this->MCountName = ".mcount";
240 break;
241 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000242 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243};
244
245// FreeBSD Target
246template<typename Target>
247class FreeBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000249 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000250 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // FreeBSD defines; list based off of gcc output
252
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000253 unsigned Release = Triple.getOSMajorVersion();
254 if (Release == 0U)
255 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000256
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000257 Builder.defineMacro("__FreeBSD__", Twine(Release));
258 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000259 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
260 DefineStd(Builder, "unix", Opts);
261 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000262
263 // On FreeBSD, wchar_t contains the number of the code point as
264 // used by the character set of the locale. These character sets are
265 // not necessarily a superset of ASCII.
266 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267 }
268public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
270 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000271
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000272 switch (Triple.getArch()) {
273 default:
274 case llvm::Triple::x86:
275 case llvm::Triple::x86_64:
276 this->MCountName = ".mcount";
277 break;
278 case llvm::Triple::mips:
279 case llvm::Triple::mipsel:
280 case llvm::Triple::ppc:
281 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000282 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000283 this->MCountName = "_mcount";
284 break;
285 case llvm::Triple::arm:
286 this->MCountName = "__mcount";
287 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000288 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000289 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290};
291
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000292// GNU/kFreeBSD Target
293template<typename Target>
294class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
295protected:
296 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
297 MacroBuilder &Builder) const {
298 // GNU/kFreeBSD defines; list based off of gcc output
299
300 DefineStd(Builder, "unix", Opts);
301 Builder.defineMacro("__FreeBSD_kernel__");
302 Builder.defineMacro("__GLIBC__");
303 Builder.defineMacro("__ELF__");
304 if (Opts.POSIXThreads)
305 Builder.defineMacro("_REENTRANT");
306 if (Opts.CPlusPlus)
307 Builder.defineMacro("_GNU_SOURCE");
308 }
309public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000310 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000311 this->UserLabelPrefix = "";
312 }
313};
314
Chris Lattner3e2ee142010-07-07 16:01:42 +0000315// Minix Target
316template<typename Target>
317class MinixTargetInfo : public OSTargetInfo<Target> {
318protected:
319 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const {
321 // Minix defines
322
323 Builder.defineMacro("__minix", "3");
324 Builder.defineMacro("_EM_WSIZE", "4");
325 Builder.defineMacro("_EM_PSIZE", "4");
326 Builder.defineMacro("_EM_SSIZE", "2");
327 Builder.defineMacro("_EM_LSIZE", "4");
328 Builder.defineMacro("_EM_FSIZE", "4");
329 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000330 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000331 DefineStd(Builder, "unix", Opts);
332 }
333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000334 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
335 this->UserLabelPrefix = "";
336 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000337};
338
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339// Linux target
340template<typename Target>
341class LinuxTargetInfo : public OSTargetInfo<Target> {
342protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000343 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000344 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000345 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000346 DefineStd(Builder, "unix", Opts);
347 DefineStd(Builder, "linux", Opts);
348 Builder.defineMacro("__gnu_linux__");
349 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000350 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000351 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000352 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000353 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000354 if (Opts.CPlusPlus)
355 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 }
357public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000358 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000360 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000362
363 virtual const char *getStaticInitSectionSpecifier() const {
364 return ".text.startup";
365 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000366};
367
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000368// NetBSD Target
369template<typename Target>
370class NetBSDTargetInfo : public OSTargetInfo<Target> {
371protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000372 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000373 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000374 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000375 Builder.defineMacro("__NetBSD__");
376 Builder.defineMacro("__unix__");
377 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000378 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000379 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000380 }
381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000382 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
383 this->UserLabelPrefix = "";
384 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000385};
386
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387// OpenBSD Target
388template<typename Target>
389class OpenBSDTargetInfo : public OSTargetInfo<Target> {
390protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000391 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000392 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393 // OpenBSD defines; list based off of gcc output
394
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 Builder.defineMacro("__OpenBSD__");
396 DefineStd(Builder, "unix", Opts);
397 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000398 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000399 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000402 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
403 this->UserLabelPrefix = "";
404 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000405
Eli Friedman3715d1f2011-12-15 02:15:56 +0000406 switch (Triple.getArch()) {
407 default:
408 case llvm::Triple::x86:
409 case llvm::Triple::x86_64:
410 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000411 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000412 this->MCountName = "__mcount";
413 break;
414 case llvm::Triple::mips64:
415 case llvm::Triple::mips64el:
416 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000417 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000418 this->MCountName = "_mcount";
419 break;
420 }
421 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422};
423
Eli Friedman9fa28852012-08-08 23:57:20 +0000424// Bitrig Target
425template<typename Target>
426class BitrigTargetInfo : public OSTargetInfo<Target> {
427protected:
428 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
429 MacroBuilder &Builder) const {
430 // Bitrig defines; list based off of gcc output
431
432 Builder.defineMacro("__Bitrig__");
433 DefineStd(Builder, "unix", Opts);
434 Builder.defineMacro("__ELF__");
435 if (Opts.POSIXThreads)
436 Builder.defineMacro("_REENTRANT");
437 }
438public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000439 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
440 this->UserLabelPrefix = "";
441 this->TLSSupported = false;
442 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000443 }
444};
445
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000446// PSP Target
447template<typename Target>
448class PSPTargetInfo : public OSTargetInfo<Target> {
449protected:
450 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000452 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000453 Builder.defineMacro("PSP");
454 Builder.defineMacro("_PSP");
455 Builder.defineMacro("__psp__");
456 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000457 }
458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000459 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000460 this->UserLabelPrefix = "";
461 }
462};
463
John Thompsone467e192009-11-19 17:18:50 +0000464// PS3 PPU Target
465template<typename Target>
466class PS3PPUTargetInfo : public OSTargetInfo<Target> {
467protected:
468 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000469 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000470 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000471 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("__PPU__");
473 Builder.defineMacro("__CELLOS_LV2__");
474 Builder.defineMacro("__ELF__");
475 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000476 Builder.defineMacro("_ARCH_PPC64");
477 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000478 }
479public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000480 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000481 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000482 this->LongWidth = this->LongAlign = 32;
483 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000484 this->IntMaxType = TargetInfo::SignedLongLong;
485 this->UIntMaxType = TargetInfo::UnsignedLongLong;
486 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000487 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindola12256302013-12-17 15:40:00 +0000488 this->DescriptionString = "E-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000489 }
490};
491
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000492// AuroraUX target
493template<typename Target>
494class AuroraUXTargetInfo : public OSTargetInfo<Target> {
495protected:
496 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000497 MacroBuilder &Builder) const {
498 DefineStd(Builder, "sun", Opts);
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
501 Builder.defineMacro("__svr4__");
502 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000503 }
504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000505 AuroraUXTargetInfo(const llvm::Triple &Triple)
506 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000507 this->UserLabelPrefix = "";
508 this->WCharType = this->SignedLong;
509 // FIXME: WIntType should be SignedLong
510 }
511};
512
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513// Solaris target
514template<typename Target>
515class SolarisTargetInfo : public OSTargetInfo<Target> {
516protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000517 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000518 MacroBuilder &Builder) const {
519 DefineStd(Builder, "sun", Opts);
520 DefineStd(Builder, "unix", Opts);
521 Builder.defineMacro("__ELF__");
522 Builder.defineMacro("__svr4__");
523 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000524 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
525 // newer, but to 500 for everything else. feature_test.h has a check to
526 // ensure that you are not using C99 with an old version of X/Open or C89
527 // with a new version.
528 if (Opts.C99 || Opts.C11)
529 Builder.defineMacro("_XOPEN_SOURCE", "600");
530 else
531 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000532 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000533 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000534 Builder.defineMacro("_LARGEFILE_SOURCE");
535 Builder.defineMacro("_LARGEFILE64_SOURCE");
536 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000537 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000538 }
539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000540 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000542 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000543 // FIXME: WIntType should be SignedLong
544 }
545};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000546
547// Windows target
548template<typename Target>
549class WindowsTargetInfo : public OSTargetInfo<Target> {
550protected:
551 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
552 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000553 Builder.defineMacro("_WIN32");
554 }
555 void getVisualStudioDefines(const LangOptions &Opts,
556 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000557 if (Opts.CPlusPlus) {
558 if (Opts.RTTI)
559 Builder.defineMacro("_CPPRTTI");
560
561 if (Opts.Exceptions)
562 Builder.defineMacro("_CPPUNWIND");
563 }
564
565 if (!Opts.CharIsSigned)
566 Builder.defineMacro("_CHAR_UNSIGNED");
567
568 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
569 // but it works for now.
570 if (Opts.POSIXThreads)
571 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000572
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000573 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000574 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000575
Francois Pichet0706d202011-09-17 17:15:52 +0000576 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000577 Builder.defineMacro("_MSC_EXTENSIONS");
578
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000579 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000580 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
581 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
582 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
583 }
584 }
585
586 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000587 }
588
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000589public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000590 WindowsTargetInfo(const llvm::Triple &Triple)
591 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592};
593
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000594template <typename Target>
595class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000596protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000597 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const {
599 if (Opts.POSIXThreads)
600 Builder.defineMacro("_REENTRANT");
601 if (Opts.CPlusPlus)
602 Builder.defineMacro("_GNU_SOURCE");
603
604 DefineStd(Builder, "unix", Opts);
605 Builder.defineMacro("__ELF__");
606 Builder.defineMacro("__native_client__");
607 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000608
609public:
610 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000611 this->UserLabelPrefix = "";
612 this->LongAlign = 32;
613 this->LongWidth = 32;
614 this->PointerAlign = 32;
615 this->PointerWidth = 32;
616 this->IntMaxType = TargetInfo::SignedLongLong;
617 this->UIntMaxType = TargetInfo::UnsignedLongLong;
618 this->Int64Type = TargetInfo::SignedLongLong;
619 this->DoubleAlign = 64;
620 this->LongDoubleWidth = 64;
621 this->LongDoubleAlign = 64;
622 this->SizeType = TargetInfo::UnsignedInt;
623 this->PtrDiffType = TargetInfo::SignedInt;
624 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000625 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000626 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000627 if (Triple.getArch() == llvm::Triple::arm) {
628 this->DescriptionString = "e-p:32:32-i64:64-v128:64:128-n32-S128";
629 } else if (Triple.getArch() == llvm::Triple::x86) {
630 this->DescriptionString = "e-p:32:32-i64:64-n8:16:32-S128";
631 } else if (Triple.getArch() == llvm::Triple::x86_64) {
632 this->DescriptionString = "e-p:32:32-i64:64-s:64-n8:16:32:64-S128";
633 } else if (Triple.getArch() == llvm::Triple::mipsel) {
634 // Handled on mips' setDescriptionString.
635 } else {
636 assert(Triple.getArch() == llvm::Triple::le32);
637 this->DescriptionString = "e-p:32:32-i64:64";
638 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000639 }
Derek Schuffa2020962012-10-16 22:30:41 +0000640 virtual typename Target::CallingConvCheckResult checkCallingConvention(
641 CallingConv CC) const {
642 return CC == CC_PnaclCall ? Target::CCCR_OK :
643 Target::checkCallingConvention(CC);
644 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000645};
Mike Stump11289f42009-09-09 15:08:12 +0000646} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000647
Chris Lattner09d98f52008-10-05 21:50:58 +0000648//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000649// Specific target implementations.
650//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000651
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000652namespace {
653// PPC abstract base class
654class PPCTargetInfo : public TargetInfo {
655 static const Builtin::Info BuiltinInfo[];
656 static const char * const GCCRegNames[];
657 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000658 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000659
660 // Target cpu features.
661 bool HasVSX;
662
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000663public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000664 PPCTargetInfo(const llvm::Triple &Triple)
665 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000666 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000667 LongDoubleWidth = LongDoubleAlign = 128;
668 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
669 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000670
Hal Finkel6b984f02012-07-03 16:51:04 +0000671 /// \brief Flags for architecture specific defines.
672 typedef enum {
673 ArchDefineNone = 0,
674 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
675 ArchDefinePpcgr = 1 << 1,
676 ArchDefinePpcsq = 1 << 2,
677 ArchDefine440 = 1 << 3,
678 ArchDefine603 = 1 << 4,
679 ArchDefine604 = 1 << 5,
680 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000681 ArchDefinePwr5 = 1 << 7,
682 ArchDefinePwr5x = 1 << 8,
683 ArchDefinePwr6 = 1 << 9,
684 ArchDefinePwr6x = 1 << 10,
685 ArchDefinePwr7 = 1 << 11,
686 ArchDefineA2 = 1 << 12,
687 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000688 } ArchDefineTypes;
689
Bill Schmidt38378a02013-02-01 20:23:10 +0000690 // Note: GCC recognizes the following additional cpus:
691 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
692 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
693 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000694 virtual bool setCPU(const std::string &Name) {
695 bool CPUKnown = llvm::StringSwitch<bool>(Name)
696 .Case("generic", true)
697 .Case("440", true)
698 .Case("450", true)
699 .Case("601", true)
700 .Case("602", true)
701 .Case("603", true)
702 .Case("603e", true)
703 .Case("603ev", true)
704 .Case("604", true)
705 .Case("604e", true)
706 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000707 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000708 .Case("g3", true)
709 .Case("7400", true)
710 .Case("g4", true)
711 .Case("7450", true)
712 .Case("g4+", true)
713 .Case("750", true)
714 .Case("970", true)
715 .Case("g5", true)
716 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000717 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000718 .Case("e500mc", true)
719 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000720 .Case("power3", true)
721 .Case("pwr3", true)
722 .Case("power4", true)
723 .Case("pwr4", true)
724 .Case("power5", true)
725 .Case("pwr5", true)
726 .Case("power5x", true)
727 .Case("pwr5x", true)
728 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000729 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000730 .Case("power6x", true)
731 .Case("pwr6x", true)
732 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000733 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000734 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000735 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000736 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000737 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000738 .Case("powerpc64le", true)
739 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 .Default(false);
741
742 if (CPUKnown)
743 CPU = Name;
744
745 return CPUKnown;
746 }
747
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000748 virtual void getTargetBuiltins(const Builtin::Info *&Records,
749 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000750 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000751 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000752 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000753
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000754 virtual bool isCLZForZeroUndef() const { return false; }
755
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000756 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000757 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000758
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000759 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
760
Eric Christopher3ff21b32013-10-16 21:26:26 +0000761 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000762 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000763 virtual bool hasFeature(StringRef Feature) const;
764
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000765 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000766 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000767 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000768 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000769 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000770 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000771 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000772 default: return false;
773 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000774 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000775 case 'b': // Base register
776 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000777 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000778 break;
779 // FIXME: The following are added to allow parsing.
780 // I just took a guess at what the actions should be.
781 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000782 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000783 case 'v': // Altivec vector register
784 Info.setAllowsRegister();
785 break;
786 case 'w':
787 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000788 case 'd':// VSX vector register to hold vector double data
789 case 'f':// VSX vector register to hold vector float data
790 case 's':// VSX vector register to hold scalar float data
791 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000792 break;
793 default:
794 return false;
795 }
796 Info.setAllowsRegister();
797 Name++; // Skip over 'w'.
798 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000799 case 'h': // `MQ', `CTR', or `LINK' register
800 case 'q': // `MQ' register
801 case 'c': // `CTR' register
802 case 'l': // `LINK' register
803 case 'x': // `CR' register (condition register) number 0
804 case 'y': // `CR' register (condition register)
805 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000806 Info.setAllowsRegister();
807 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 // (use `L' instead for SImode constants)
811 case 'K': // Unsigned 16-bit constant
812 case 'L': // Signed 16-bit constant shifted left 16 bits
813 case 'M': // Constant larger than 31
814 case 'N': // Exact power of 2
815 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000816 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000818 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000820 break;
821 case 'm': // Memory operand. Note that on PowerPC targets, m can
822 // include addresses that update the base register. It
823 // is therefore only safe to use `m' in an asm statement
824 // if that asm statement accesses the operand exactly once.
825 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000826 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000827 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000828 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000829 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000830 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
831 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // register to be updated.
833 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000834 if (Name[1] != 's')
835 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000836 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000837 // include any automodification of the base register. Unlike
838 // `m', this constraint can be used in asm statements that
839 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000840 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000841 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000842 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000843 break;
844 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000845 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000846 case 'Z': // Memory operand that is an indexed or indirect from a
847 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000848 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000849 Info.setAllowsMemory();
850 Info.setAllowsRegister();
851 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000853 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // register (`p' is preferable for asm statements)
855 case 'S': // Constant suitable as a 64-bit mask operand
856 case 'T': // Constant suitable as a 32-bit mask operand
857 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000858 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // instructions
860 case 'W': // Vector constant that does not require memory
861 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000862 break;
863 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000864 }
John Thompson07a61a42010-06-24 22:44:13 +0000865 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000866 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000867 virtual const char *getClobbers() const {
868 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000869 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000870 int getEHDataRegisterNumber(unsigned RegNo) const {
871 if (RegNo == 0) return 3;
872 if (RegNo == 1) return 4;
873 return -1;
874 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000875};
Anders Carlssonf511f642007-11-27 04:11:28 +0000876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000878#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000879#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000880 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000881#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000883
Eric Christopher3ff21b32013-10-16 21:26:26 +0000884 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000885/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000886bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887 DiagnosticsEngine &Diags) {
888 // Remember the maximum enabled sselevel.
889 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
890 // Ignore disabled features.
891 if (Features[i][0] == '-')
892 continue;
893
894 StringRef Feature = StringRef(Features[i]).substr(1);
895
896 if (Feature == "vsx") {
897 HasVSX = true;
898 continue;
899 }
900
901 // TODO: Finish this list and add an assert that we've handled them
902 // all.
903 }
904
905 return true;
906}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000907
Chris Lattnerecd49032009-03-02 22:27:17 +0000908/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
909/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000910void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000911 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000912 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000913 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000914 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000915 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000916 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000917 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000918 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000919 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000920 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000921 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000922 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000923 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000924
Chris Lattnerecd49032009-03-02 22:27:17 +0000925 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000926 if (getTriple().getArch() == llvm::Triple::ppc64le) {
927 Builder.defineMacro("_LITTLE_ENDIAN");
928 Builder.defineMacro("__LITTLE_ENDIAN__");
929 } else {
930 if (getTriple().getOS() != llvm::Triple::NetBSD &&
931 getTriple().getOS() != llvm::Triple::OpenBSD)
932 Builder.defineMacro("_BIG_ENDIAN");
933 Builder.defineMacro("__BIG_ENDIAN__");
934 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000935
Chris Lattnerecd49032009-03-02 22:27:17 +0000936 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000937 Builder.defineMacro("__NATURAL_ALIGNMENT__");
938 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000939
Chris Lattnerecd49032009-03-02 22:27:17 +0000940 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000941 if (LongDoubleWidth == 128)
942 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943
John Thompsone467e192009-11-19 17:18:50 +0000944 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000945 Builder.defineMacro("__VEC__", "10206");
946 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000947 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000948
949 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000950 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
951 .Case("440", ArchDefineName)
952 .Case("450", ArchDefineName | ArchDefine440)
953 .Case("601", ArchDefineName)
954 .Case("602", ArchDefineName | ArchDefinePpcgr)
955 .Case("603", ArchDefineName | ArchDefinePpcgr)
956 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
957 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
958 .Case("604", ArchDefineName | ArchDefinePpcgr)
959 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
960 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000962 .Case("7400", ArchDefineName | ArchDefinePpcgr)
963 .Case("7450", ArchDefineName | ArchDefinePpcgr)
964 .Case("750", ArchDefineName | ArchDefinePpcgr)
965 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
966 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000967 .Case("a2", ArchDefineA2)
968 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000969 .Case("pwr3", ArchDefinePpcgr)
970 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
971 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
972 | ArchDefinePpcsq)
973 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
974 | ArchDefinePpcgr | ArchDefinePpcsq)
975 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
976 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
977 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
978 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
979 | ArchDefinePpcsq)
980 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
981 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
982 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
983 .Case("power3", ArchDefinePpcgr)
984 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
985 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
986 | ArchDefinePpcsq)
987 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
988 | ArchDefinePpcgr | ArchDefinePpcsq)
989 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
990 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
991 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
992 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
993 | ArchDefinePpcsq)
994 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
995 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
996 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +0000997 .Default(ArchDefineNone);
998
999 if (defs & ArchDefineName)
1000 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1001 if (defs & ArchDefinePpcgr)
1002 Builder.defineMacro("_ARCH_PPCGR");
1003 if (defs & ArchDefinePpcsq)
1004 Builder.defineMacro("_ARCH_PPCSQ");
1005 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001006 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001007 if (defs & ArchDefine603)
1008 Builder.defineMacro("_ARCH_603");
1009 if (defs & ArchDefine604)
1010 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001011 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001012 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001013 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001014 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001015 if (defs & ArchDefinePwr5x)
1016 Builder.defineMacro("_ARCH_PWR5X");
1017 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001018 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001019 if (defs & ArchDefinePwr6x)
1020 Builder.defineMacro("_ARCH_PWR6X");
1021 if (defs & ArchDefinePwr7)
1022 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001023 if (defs & ArchDefineA2)
1024 Builder.defineMacro("_ARCH_A2");
1025 if (defs & ArchDefineA2q) {
1026 Builder.defineMacro("_ARCH_A2Q");
1027 Builder.defineMacro("_ARCH_QP");
1028 }
1029
1030 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1031 Builder.defineMacro("__bg__");
1032 Builder.defineMacro("__THW_BLUEGENE__");
1033 Builder.defineMacro("__bgq__");
1034 Builder.defineMacro("__TOS_BGQ__");
1035 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001036
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001037 if (HasVSX)
1038 Builder.defineMacro("__VSX__");
1039
Bill Schmidt38378a02013-02-01 20:23:10 +00001040 // FIXME: The following are not yet generated here by Clang, but are
1041 // generated by GCC:
1042 //
1043 // _SOFT_FLOAT_
1044 // __RECIP_PRECISION__
1045 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001046 // __RECIP__
1047 // __RECIPF__
1048 // __RSQRTE__
1049 // __RSQRTEF__
1050 // _SOFT_DOUBLE_
1051 // __NO_LWSYNC__
1052 // __HAVE_BSWAP__
1053 // __LONGDOUBLE128
1054 // __CMODEL_MEDIUM__
1055 // __CMODEL_LARGE__
1056 // _CALL_SYSV
1057 // _CALL_DARWIN
1058 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001059}
1060
1061void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1062 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1063 .Case("7400", true)
1064 .Case("g4", true)
1065 .Case("7450", true)
1066 .Case("g4+", true)
1067 .Case("970", true)
1068 .Case("g5", true)
1069 .Case("pwr6", true)
1070 .Case("pwr7", true)
1071 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001072 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001073 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001074
1075 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001076}
1077
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001078bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1079 return Feature == "powerpc";
1080}
Chris Lattner17df24e2008-04-21 18:56:49 +00001081
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001082
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001083const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001084 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1085 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1086 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1087 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1088 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1089 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1090 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1091 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001092 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001093 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001094 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001095 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1096 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1097 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1098 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001099 "vrsave", "vscr",
1100 "spe_acc", "spefscr",
1101 "sfp"
1102};
Chris Lattner10a5b382007-01-29 05:24:35 +00001103
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001104void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001105 unsigned &NumNames) const {
1106 Names = GCCRegNames;
1107 NumNames = llvm::array_lengthof(GCCRegNames);
1108}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001109
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1111 // While some of these aliases do map to different registers
1112 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001113 { { "0" }, "r0" },
1114 { { "1"}, "r1" },
1115 { { "2" }, "r2" },
1116 { { "3" }, "r3" },
1117 { { "4" }, "r4" },
1118 { { "5" }, "r5" },
1119 { { "6" }, "r6" },
1120 { { "7" }, "r7" },
1121 { { "8" }, "r8" },
1122 { { "9" }, "r9" },
1123 { { "10" }, "r10" },
1124 { { "11" }, "r11" },
1125 { { "12" }, "r12" },
1126 { { "13" }, "r13" },
1127 { { "14" }, "r14" },
1128 { { "15" }, "r15" },
1129 { { "16" }, "r16" },
1130 { { "17" }, "r17" },
1131 { { "18" }, "r18" },
1132 { { "19" }, "r19" },
1133 { { "20" }, "r20" },
1134 { { "21" }, "r21" },
1135 { { "22" }, "r22" },
1136 { { "23" }, "r23" },
1137 { { "24" }, "r24" },
1138 { { "25" }, "r25" },
1139 { { "26" }, "r26" },
1140 { { "27" }, "r27" },
1141 { { "28" }, "r28" },
1142 { { "29" }, "r29" },
1143 { { "30" }, "r30" },
1144 { { "31" }, "r31" },
1145 { { "fr0" }, "f0" },
1146 { { "fr1" }, "f1" },
1147 { { "fr2" }, "f2" },
1148 { { "fr3" }, "f3" },
1149 { { "fr4" }, "f4" },
1150 { { "fr5" }, "f5" },
1151 { { "fr6" }, "f6" },
1152 { { "fr7" }, "f7" },
1153 { { "fr8" }, "f8" },
1154 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001155 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001156 { { "fr11" }, "f11" },
1157 { { "fr12" }, "f12" },
1158 { { "fr13" }, "f13" },
1159 { { "fr14" }, "f14" },
1160 { { "fr15" }, "f15" },
1161 { { "fr16" }, "f16" },
1162 { { "fr17" }, "f17" },
1163 { { "fr18" }, "f18" },
1164 { { "fr19" }, "f19" },
1165 { { "fr20" }, "f20" },
1166 { { "fr21" }, "f21" },
1167 { { "fr22" }, "f22" },
1168 { { "fr23" }, "f23" },
1169 { { "fr24" }, "f24" },
1170 { { "fr25" }, "f25" },
1171 { { "fr26" }, "f26" },
1172 { { "fr27" }, "f27" },
1173 { { "fr28" }, "f28" },
1174 { { "fr29" }, "f29" },
1175 { { "fr30" }, "f30" },
1176 { { "fr31" }, "f31" },
1177 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001178};
1179
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001180void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001181 unsigned &NumAliases) const {
1182 Aliases = GCCRegAliases;
1183 NumAliases = llvm::array_lengthof(GCCRegAliases);
1184}
1185} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001186
Chris Lattner5ba61f02006-10-14 07:39:34 +00001187namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001188class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001189public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001190 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindola2da35322013-12-16 23:27:41 +00001191 DescriptionString = "E-p:32:32-"
1192 "i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001193
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001194 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001195 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001196 case llvm::Triple::FreeBSD:
1197 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001198 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001199 PtrDiffType = SignedInt;
1200 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001201 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001202 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001203 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001204 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001205
Roman Divacky3ffe7462012-03-13 19:20:17 +00001206 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1207 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001208 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001209 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001210
1211 // PPC32 supports atomics up to 4 bytes.
1212 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001213 }
1214
Meador Inge5d3fb222012-06-16 03:34:49 +00001215 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001216 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001217 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001218 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001219};
1220} // end anonymous namespace.
1221
Bill Schmidt778d3872013-07-26 01:36:11 +00001222// Note: ABI differences may eventually require us to have a separate
1223// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001224namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001225class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001226public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001227 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001228 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001229 IntMaxType = SignedLong;
1230 UIntMaxType = UnsignedLong;
1231 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001232
Roman Divacky3ffe7462012-03-13 19:20:17 +00001233 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1234 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001235 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola47debc02013-12-16 21:59:14 +00001236 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001237 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001238 "n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001239 } else
Rafael Espindola47debc02013-12-16 21:59:14 +00001240 DescriptionString = "E-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00001241 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001242 "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 Espindola0ea96eb2013-12-18 15:16:50 +00001265 DescriptionString = "E-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 Espindola0ea96eb2013-12-18 15:16:50 +00001279 DescriptionString = "E-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;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001385 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001386 = "e-p:32:32-i64:64"
1387 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001388 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001389 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 };
1391
1392 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1393 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001394 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001396 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001398 = "e-i64:64"
1399 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001400 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001401 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001402 };
1403}
1404
1405namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001406
1407static const unsigned R600AddrSpaceMap[] = {
1408 1, // opencl_global
1409 3, // opencl_local
1410 2, // opencl_constant
1411 1, // cuda_device
1412 2, // cuda_constant
1413 3 // cuda_shared
1414};
1415
Tom Stellardc74b1e02013-03-04 17:40:53 +00001416static const char *DescriptionStringR600 =
1417 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001418 "-p:32:32"
1419 "-i64:64"
1420 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1421 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001422 "-n32:64";
1423
1424static const char *DescriptionStringR600DoubleOps =
1425 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001426 "-p:32:32"
1427 "-i64:64"
1428 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1429 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001430 "-n32:64";
1431
1432static const char *DescriptionStringSI =
1433 "e"
Rafael Espindola47debc02013-12-16 21:59:14 +00001434 ""
Rafael Espindola2da35322013-12-16 23:27:41 +00001435 "-p3:32:32"
1436 "-i64:64"
1437 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1438 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001439 "-n32:64";
1440
Eli Friedmand13b41e2012-10-12 23:32:00 +00001441class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001442 /// \brief The GPU profiles supported by the R600 target.
1443 enum GPUKind {
1444 GK_NONE,
1445 GK_R600,
1446 GK_R600_DOUBLE_OPS,
1447 GK_R700,
1448 GK_R700_DOUBLE_OPS,
1449 GK_EVERGREEN,
1450 GK_EVERGREEN_DOUBLE_OPS,
1451 GK_NORTHERN_ISLANDS,
1452 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001453 GK_SOUTHERN_ISLANDS,
1454 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001455 } GPU;
1456
Eli Friedmand13b41e2012-10-12 23:32:00 +00001457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001458 R600TargetInfo(const llvm::Triple &Triple)
1459 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001460 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001461 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001462 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001463 }
1464
1465 virtual const char * getClobbers() const {
1466 return "";
1467 }
1468
1469 virtual void getGCCRegNames(const char * const *&Names,
1470 unsigned &numNames) const {
1471 Names = NULL;
1472 numNames = 0;
1473 }
1474
1475 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1476 unsigned &NumAliases) const {
1477 Aliases = NULL;
1478 NumAliases = 0;
1479 }
1480
1481 virtual bool validateAsmConstraint(const char *&Name,
1482 TargetInfo::ConstraintInfo &info) const {
1483 return true;
1484 }
1485
1486 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1487 unsigned &NumRecords) const {
1488 Records = NULL;
1489 NumRecords = 0;
1490 }
1491
1492
1493 virtual void getTargetDefines(const LangOptions &Opts,
1494 MacroBuilder &Builder) const {
1495 Builder.defineMacro("__R600__");
1496 }
1497
1498 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1499 return TargetInfo::CharPtrBuiltinVaList;
1500 }
1501
Tom Stellardc74b1e02013-03-04 17:40:53 +00001502 virtual bool setCPU(const std::string &Name) {
1503 GPU = llvm::StringSwitch<GPUKind>(Name)
1504 .Case("r600" , GK_R600)
1505 .Case("rv610", GK_R600)
1506 .Case("rv620", GK_R600)
1507 .Case("rv630", GK_R600)
1508 .Case("rv635", GK_R600)
1509 .Case("rs780", GK_R600)
1510 .Case("rs880", GK_R600)
1511 .Case("rv670", GK_R600_DOUBLE_OPS)
1512 .Case("rv710", GK_R700)
1513 .Case("rv730", GK_R700)
1514 .Case("rv740", GK_R700_DOUBLE_OPS)
1515 .Case("rv770", GK_R700_DOUBLE_OPS)
1516 .Case("palm", GK_EVERGREEN)
1517 .Case("cedar", GK_EVERGREEN)
1518 .Case("sumo", GK_EVERGREEN)
1519 .Case("sumo2", GK_EVERGREEN)
1520 .Case("redwood", GK_EVERGREEN)
1521 .Case("juniper", GK_EVERGREEN)
1522 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1523 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1524 .Case("barts", GK_NORTHERN_ISLANDS)
1525 .Case("turks", GK_NORTHERN_ISLANDS)
1526 .Case("caicos", GK_NORTHERN_ISLANDS)
1527 .Case("cayman", GK_CAYMAN)
1528 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001529 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001530 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1531 .Case("verde", GK_SOUTHERN_ISLANDS)
1532 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001533 .Case("bonaire", GK_SEA_ISLANDS)
1534 .Case("kabini", GK_SEA_ISLANDS)
1535 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001536 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001537 .Default(GK_NONE);
1538
1539 if (GPU == GK_NONE) {
1540 return false;
1541 }
1542
1543 // Set the correct data layout
1544 switch (GPU) {
1545 case GK_NONE:
1546 case GK_R600:
1547 case GK_R700:
1548 case GK_EVERGREEN:
1549 case GK_NORTHERN_ISLANDS:
1550 DescriptionString = DescriptionStringR600;
1551 break;
1552 case GK_R600_DOUBLE_OPS:
1553 case GK_R700_DOUBLE_OPS:
1554 case GK_EVERGREEN_DOUBLE_OPS:
1555 case GK_CAYMAN:
1556 DescriptionString = DescriptionStringR600DoubleOps;
1557 break;
1558 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001559 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001560 DescriptionString = DescriptionStringSI;
1561 break;
1562 }
1563
1564 return true;
1565 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001566};
1567
1568} // end anonymous namespace
1569
1570namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001571// Namespace for x86 abstract base class
1572const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001573#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001574#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001575 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001576#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001577};
Eli Friedmanb5366062008-05-20 14:21:01 +00001578
Nuno Lopescfca1f02009-12-23 17:49:57 +00001579static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001580 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1581 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001582 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001583 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1584 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1585 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001586 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001587 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1588 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001589};
1590
Eric Christophercdd36352011-06-21 00:05:20 +00001591const TargetInfo::AddlRegName AddlRegNames[] = {
1592 { { "al", "ah", "eax", "rax" }, 0 },
1593 { { "bl", "bh", "ebx", "rbx" }, 3 },
1594 { { "cl", "ch", "ecx", "rcx" }, 2 },
1595 { { "dl", "dh", "edx", "rdx" }, 1 },
1596 { { "esi", "rsi" }, 4 },
1597 { { "edi", "rdi" }, 5 },
1598 { { "esp", "rsp" }, 7 },
1599 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001600};
1601
1602// X86 target abstract base class; x86-32 and x86-64 are very close, so
1603// most of the implementation can be shared.
1604class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001605 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001606 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001607 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001608 enum MMX3DNowEnum {
1609 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1610 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001611 enum XOPEnum {
1612 NoXOP,
1613 SSE4A,
1614 FMA4,
1615 XOP
1616 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001617
Eric Christophere1ddaf92010-04-02 23:50:19 +00001618 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001619 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001620 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001621 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001622 bool HasBMI;
1623 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001624 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001625 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001626 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001627 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001628 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001629 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001630 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001631 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001632 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001633 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001634
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001635 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1636 ///
1637 /// Each enumeration represents a particular CPU supported by Clang. These
1638 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1639 enum CPUKind {
1640 CK_Generic,
1641
1642 /// \name i386
1643 /// i386-generation processors.
1644 //@{
1645 CK_i386,
1646 //@}
1647
1648 /// \name i486
1649 /// i486-generation processors.
1650 //@{
1651 CK_i486,
1652 CK_WinChipC6,
1653 CK_WinChip2,
1654 CK_C3,
1655 //@}
1656
1657 /// \name i586
1658 /// i586-generation processors, P5 microarchitecture based.
1659 //@{
1660 CK_i586,
1661 CK_Pentium,
1662 CK_PentiumMMX,
1663 //@}
1664
1665 /// \name i686
1666 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1667 //@{
1668 CK_i686,
1669 CK_PentiumPro,
1670 CK_Pentium2,
1671 CK_Pentium3,
1672 CK_Pentium3M,
1673 CK_PentiumM,
1674 CK_C3_2,
1675
1676 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1677 /// Clang however has some logic to suport this.
1678 // FIXME: Warn, deprecate, and potentially remove this.
1679 CK_Yonah,
1680 //@}
1681
1682 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001683 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001684 //@{
1685 CK_Pentium4,
1686 CK_Pentium4M,
1687 CK_Prescott,
1688 CK_Nocona,
1689 //@}
1690
1691 /// \name Core
1692 /// Core microarchitecture based processors.
1693 //@{
1694 CK_Core2,
1695
1696 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1697 /// codename which GCC no longer accepts as an option to -march, but Clang
1698 /// has some logic for recognizing it.
1699 // FIXME: Warn, deprecate, and potentially remove this.
1700 CK_Penryn,
1701 //@}
1702
1703 /// \name Atom
1704 /// Atom processors
1705 //@{
1706 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001707 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001708 //@}
1709
1710 /// \name Nehalem
1711 /// Nehalem microarchitecture based processors.
1712 //@{
1713 CK_Corei7,
1714 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001715 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001716 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001717 //@}
1718
Craig Topper449314e2013-08-20 07:09:39 +00001719 /// \name Knights Landing
1720 /// Knights Landing processor.
1721 CK_KNL,
1722
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001723 /// \name K6
1724 /// K6 architecture processors.
1725 //@{
1726 CK_K6,
1727 CK_K6_2,
1728 CK_K6_3,
1729 //@}
1730
1731 /// \name K7
1732 /// K7 architecture processors.
1733 //@{
1734 CK_Athlon,
1735 CK_AthlonThunderbird,
1736 CK_Athlon4,
1737 CK_AthlonXP,
1738 CK_AthlonMP,
1739 //@}
1740
1741 /// \name K8
1742 /// K8 architecture processors.
1743 //@{
1744 CK_Athlon64,
1745 CK_Athlon64SSE3,
1746 CK_AthlonFX,
1747 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001748 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001749 CK_Opteron,
1750 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001751 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001752 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001753
Benjamin Kramer569f2152012-01-10 11:50:18 +00001754 /// \name Bobcat
1755 /// Bobcat architecture processors.
1756 //@{
1757 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001758 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001759 //@}
1760
1761 /// \name Bulldozer
1762 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001763 //@{
1764 CK_BDVER1,
1765 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001766 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001767 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001768
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001769 /// This specification is deprecated and will be removed in the future.
1770 /// Users should prefer \see CK_K8.
1771 // FIXME: Warn on this when the CPU is set to it.
1772 CK_x86_64,
1773 //@}
1774
1775 /// \name Geode
1776 /// Geode processors.
1777 //@{
1778 CK_Geode
1779 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001780 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001781
Rafael Espindolaeb265472013-08-21 21:59:03 +00001782 enum FPMathKind {
1783 FP_Default,
1784 FP_SSE,
1785 FP_387
1786 } FPMath;
1787
Eli Friedman3fd920a2008-08-20 02:34:37 +00001788public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001789 X86TargetInfo(const llvm::Triple &Triple)
1790 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001791 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1792 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001793 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1794 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001795 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1796 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001797 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001798 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001799 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001800 virtual unsigned getFloatEvalMethod() const {
1801 // X87 evaluates with 80 bits "long double" precision.
1802 return SSELevel == NoSSE ? 2 : 0;
1803 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001804 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1805 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001806 Records = BuiltinInfo;
1807 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001808 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001809 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001810 unsigned &NumNames) const {
1811 Names = GCCRegNames;
1812 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001813 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001814 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001815 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001816 Aliases = 0;
1817 NumAliases = 0;
1818 }
1819 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001820 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001821 Names = AddlRegNames;
1822 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001823 }
Anders Carlsson58436352009-02-28 17:11:49 +00001824 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001825 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001826 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001827 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001828 return "~{dirflag},~{fpsr},~{flags}";
1829 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001830 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001831 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001832 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1833 bool Enabled);
1834 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1835 bool Enabled);
1836 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1837 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001838 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001839 StringRef Name, bool Enabled) const {
1840 setFeatureEnabledImpl(Features, Name, Enabled);
1841 }
1842 // This exists purely to cut down on the number of virtual calls in
1843 // getDefaultFeatures which calls this repeatedly.
1844 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1845 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001846 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001847 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001848 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001849 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001850 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001851 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001852 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001853 else if (getTriple().getArch() == llvm::Triple::x86 &&
1854 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001855 return "no-mmx";
1856 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001857 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001858 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001859 CPU = llvm::StringSwitch<CPUKind>(Name)
1860 .Case("i386", CK_i386)
1861 .Case("i486", CK_i486)
1862 .Case("winchip-c6", CK_WinChipC6)
1863 .Case("winchip2", CK_WinChip2)
1864 .Case("c3", CK_C3)
1865 .Case("i586", CK_i586)
1866 .Case("pentium", CK_Pentium)
1867 .Case("pentium-mmx", CK_PentiumMMX)
1868 .Case("i686", CK_i686)
1869 .Case("pentiumpro", CK_PentiumPro)
1870 .Case("pentium2", CK_Pentium2)
1871 .Case("pentium3", CK_Pentium3)
1872 .Case("pentium3m", CK_Pentium3M)
1873 .Case("pentium-m", CK_PentiumM)
1874 .Case("c3-2", CK_C3_2)
1875 .Case("yonah", CK_Yonah)
1876 .Case("pentium4", CK_Pentium4)
1877 .Case("pentium4m", CK_Pentium4M)
1878 .Case("prescott", CK_Prescott)
1879 .Case("nocona", CK_Nocona)
1880 .Case("core2", CK_Core2)
1881 .Case("penryn", CK_Penryn)
1882 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001883 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001884 .Case("corei7", CK_Corei7)
1885 .Case("corei7-avx", CK_Corei7AVX)
1886 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001887 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001888 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001889 .Case("k6", CK_K6)
1890 .Case("k6-2", CK_K6_2)
1891 .Case("k6-3", CK_K6_3)
1892 .Case("athlon", CK_Athlon)
1893 .Case("athlon-tbird", CK_AthlonThunderbird)
1894 .Case("athlon-4", CK_Athlon4)
1895 .Case("athlon-xp", CK_AthlonXP)
1896 .Case("athlon-mp", CK_AthlonMP)
1897 .Case("athlon64", CK_Athlon64)
1898 .Case("athlon64-sse3", CK_Athlon64SSE3)
1899 .Case("athlon-fx", CK_AthlonFX)
1900 .Case("k8", CK_K8)
1901 .Case("k8-sse3", CK_K8SSE3)
1902 .Case("opteron", CK_Opteron)
1903 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001904 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001905 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001906 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001907 .Case("bdver1", CK_BDVER1)
1908 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001909 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001910 .Case("x86-64", CK_x86_64)
1911 .Case("geode", CK_Geode)
1912 .Default(CK_Generic);
1913
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001914 // Perform any per-CPU checks necessary to determine if this CPU is
1915 // acceptable.
1916 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1917 // invalid without explaining *why*.
1918 switch (CPU) {
1919 case CK_Generic:
1920 // No processor selected!
1921 return false;
1922
1923 case CK_i386:
1924 case CK_i486:
1925 case CK_WinChipC6:
1926 case CK_WinChip2:
1927 case CK_C3:
1928 case CK_i586:
1929 case CK_Pentium:
1930 case CK_PentiumMMX:
1931 case CK_i686:
1932 case CK_PentiumPro:
1933 case CK_Pentium2:
1934 case CK_Pentium3:
1935 case CK_Pentium3M:
1936 case CK_PentiumM:
1937 case CK_Yonah:
1938 case CK_C3_2:
1939 case CK_Pentium4:
1940 case CK_Pentium4M:
1941 case CK_Prescott:
1942 case CK_K6:
1943 case CK_K6_2:
1944 case CK_K6_3:
1945 case CK_Athlon:
1946 case CK_AthlonThunderbird:
1947 case CK_Athlon4:
1948 case CK_AthlonXP:
1949 case CK_AthlonMP:
1950 case CK_Geode:
1951 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001952 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001953 return false;
1954
1955 // Fallthrough
1956 case CK_Nocona:
1957 case CK_Core2:
1958 case CK_Penryn:
1959 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001960 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001961 case CK_Corei7:
1962 case CK_Corei7AVX:
1963 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001964 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001965 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001966 case CK_Athlon64:
1967 case CK_Athlon64SSE3:
1968 case CK_AthlonFX:
1969 case CK_K8:
1970 case CK_K8SSE3:
1971 case CK_Opteron:
1972 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001973 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001974 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001975 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001976 case CK_BDVER1:
1977 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001978 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001979 case CK_x86_64:
1980 return true;
1981 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001982 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001983 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001984
Rafael Espindolaeb265472013-08-21 21:59:03 +00001985 virtual bool setFPMath(StringRef Name);
1986
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001987 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1988 // We accept all non-ARM calling conventions
1989 return (CC == CC_X86ThisCall ||
1990 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001991 CC == CC_X86StdCall ||
1992 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001993 CC == CC_X86Pascal ||
1994 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001995 }
1996
Aaron Ballman02df2e02012-12-09 17:45:41 +00001997 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1998 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001999 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002000};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002001
Rafael Espindolaeb265472013-08-21 21:59:03 +00002002bool X86TargetInfo::setFPMath(StringRef Name) {
2003 if (Name == "387") {
2004 FPMath = FP_387;
2005 return true;
2006 }
2007 if (Name == "sse") {
2008 FPMath = FP_SSE;
2009 return true;
2010 }
2011 return false;
2012}
2013
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002014void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002015 // FIXME: This *really* should not be here.
2016
2017 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002018 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002019 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002020
Chandler Carruth212334f2011-09-28 08:55:37 +00002021 switch (CPU) {
2022 case CK_Generic:
2023 case CK_i386:
2024 case CK_i486:
2025 case CK_i586:
2026 case CK_Pentium:
2027 case CK_i686:
2028 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002029 break;
2030 case CK_PentiumMMX:
2031 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002032 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002033 break;
2034 case CK_Pentium3:
2035 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002036 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002037 break;
2038 case CK_PentiumM:
2039 case CK_Pentium4:
2040 case CK_Pentium4M:
2041 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002042 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002043 break;
2044 case CK_Yonah:
2045 case CK_Prescott:
2046 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002047 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002048 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002049 break;
2050 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002051 setFeatureEnabledImpl(Features, "ssse3", 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_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002056 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002057 break;
2058 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002059 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002060 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002061 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002062 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002063 setFeatureEnabledImpl(Features, "sse4.2", true);
2064 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002065 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002066 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002067 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002068 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002069 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002070 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002071 break;
2072 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "avx", true);
2074 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002075 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002076 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002077 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002078 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002079 setFeatureEnabledImpl(Features, "avx", true);
2080 setFeatureEnabledImpl(Features, "aes", true);
2081 setFeatureEnabledImpl(Features, "pclmul", true);
2082 setFeatureEnabledImpl(Features, "rdrnd", true);
2083 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002084 break;
Craig Topper865fff52011-12-17 19:55:21 +00002085 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002086 setFeatureEnabledImpl(Features, "avx2", true);
2087 setFeatureEnabledImpl(Features, "aes", true);
2088 setFeatureEnabledImpl(Features, "pclmul", true);
2089 setFeatureEnabledImpl(Features, "lzcnt", true);
2090 setFeatureEnabledImpl(Features, "rdrnd", true);
2091 setFeatureEnabledImpl(Features, "f16c", true);
2092 setFeatureEnabledImpl(Features, "bmi", true);
2093 setFeatureEnabledImpl(Features, "bmi2", true);
2094 setFeatureEnabledImpl(Features, "rtm", true);
2095 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002096 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002097 break;
Craig Topper449314e2013-08-20 07:09:39 +00002098 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002099 setFeatureEnabledImpl(Features, "avx512f", true);
2100 setFeatureEnabledImpl(Features, "avx512cd", true);
2101 setFeatureEnabledImpl(Features, "avx512er", true);
2102 setFeatureEnabledImpl(Features, "avx512pf", true);
2103 setFeatureEnabledImpl(Features, "aes", true);
2104 setFeatureEnabledImpl(Features, "pclmul", true);
2105 setFeatureEnabledImpl(Features, "lzcnt", true);
2106 setFeatureEnabledImpl(Features, "rdrnd", true);
2107 setFeatureEnabledImpl(Features, "f16c", true);
2108 setFeatureEnabledImpl(Features, "bmi", true);
2109 setFeatureEnabledImpl(Features, "bmi2", true);
2110 setFeatureEnabledImpl(Features, "rtm", true);
2111 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002112 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002113 case CK_K6:
2114 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002115 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002116 break;
2117 case CK_K6_2:
2118 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002119 case CK_WinChip2:
2120 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002121 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002122 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002123 case CK_Athlon:
2124 case CK_AthlonThunderbird:
2125 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002127 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002128 case CK_Athlon4:
2129 case CK_AthlonXP:
2130 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002131 setFeatureEnabledImpl(Features, "sse", true);
2132 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002133 break;
2134 case CK_K8:
2135 case CK_Opteron:
2136 case CK_Athlon64:
2137 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002138 setFeatureEnabledImpl(Features, "sse2", true);
2139 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002140 break;
2141 case CK_K8SSE3:
2142 case CK_OpteronSSE3:
2143 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002144 setFeatureEnabledImpl(Features, "sse3", true);
2145 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002146 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002147 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "sse3", true);
2149 setFeatureEnabledImpl(Features, "sse4a", true);
2150 setFeatureEnabledImpl(Features, "3dnowa", true);
2151 setFeatureEnabledImpl(Features, "lzcnt", true);
2152 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002153 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002154 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002155 setFeatureEnabledImpl(Features, "ssse3", true);
2156 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002157 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002158 setFeatureEnabledImpl(Features, "lzcnt", true);
2159 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002160 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002161 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002162 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002163 setFeatureEnabledImpl(Features, "avx", true);
2164 setFeatureEnabledImpl(Features, "sse4a", true);
2165 setFeatureEnabledImpl(Features, "lzcnt", true);
2166 setFeatureEnabledImpl(Features, "aes", true);
2167 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002168 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002169 setFeatureEnabledImpl(Features, "bmi", true);
2170 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002171 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002172 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002173 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002174 setFeatureEnabledImpl(Features, "xop", true);
2175 setFeatureEnabledImpl(Features, "lzcnt", true);
2176 setFeatureEnabledImpl(Features, "aes", true);
2177 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002178 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002179 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002180 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002181 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002182 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002183 setFeatureEnabledImpl(Features, "xop", true);
2184 setFeatureEnabledImpl(Features, "lzcnt", true);
2185 setFeatureEnabledImpl(Features, "aes", true);
2186 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002187 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002188 setFeatureEnabledImpl(Features, "bmi", true);
2189 setFeatureEnabledImpl(Features, "fma", true);
2190 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002191 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002192 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002193 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002194 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002195 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002196 break;
Eli Friedman33465822011-07-08 23:31:17 +00002197 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002198}
2199
Rafael Espindolae62e2792013-08-20 13:44:29 +00002200void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002201 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002202 if (Enabled) {
2203 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002204 case AVX512F:
2205 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002206 case AVX2:
2207 Features["avx2"] = true;
2208 case AVX:
2209 Features["avx"] = true;
2210 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002211 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002212 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002213 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002214 case SSSE3:
2215 Features["ssse3"] = true;
2216 case SSE3:
2217 Features["sse3"] = true;
2218 case SSE2:
2219 Features["sse2"] = true;
2220 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002221 Features["sse"] = true;
2222 case NoSSE:
2223 break;
2224 }
2225 return;
2226 }
2227
2228 switch (Level) {
2229 case NoSSE:
2230 case SSE1:
2231 Features["sse"] = false;
2232 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002233 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2234 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002235 case SSE3:
2236 Features["sse3"] = false;
2237 setXOPLevel(Features, NoXOP, false);
2238 case SSSE3:
2239 Features["ssse3"] = false;
2240 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002241 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002242 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002243 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002244 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002245 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002246 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002247 case AVX2:
2248 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002249 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002250 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2251 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002252 }
2253}
2254
2255void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002256 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002257 if (Enabled) {
2258 switch (Level) {
2259 case AMD3DNowAthlon:
2260 Features["3dnowa"] = true;
2261 case AMD3DNow:
2262 Features["3dnow"] = true;
2263 case MMX:
2264 Features["mmx"] = true;
2265 case NoMMX3DNow:
2266 break;
2267 }
2268 return;
2269 }
2270
2271 switch (Level) {
2272 case NoMMX3DNow:
2273 case MMX:
2274 Features["mmx"] = false;
2275 case AMD3DNow:
2276 Features["3dnow"] = false;
2277 case AMD3DNowAthlon:
2278 Features["3dnowa"] = false;
2279 }
2280}
2281
2282void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002283 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002284 if (Enabled) {
2285 switch (Level) {
2286 case XOP:
2287 Features["xop"] = true;
2288 case FMA4:
2289 Features["fma4"] = true;
2290 setSSELevel(Features, AVX, true);
2291 case SSE4A:
2292 Features["sse4a"] = true;
2293 setSSELevel(Features, SSE3, true);
2294 case NoXOP:
2295 break;
2296 }
2297 return;
2298 }
2299
2300 switch (Level) {
2301 case NoXOP:
2302 case SSE4A:
2303 Features["sse4a"] = false;
2304 case FMA4:
2305 Features["fma4"] = false;
2306 case XOP:
2307 Features["xop"] = false;
2308 }
2309}
2310
Craig Topper86d79ef2013-09-17 04:51:29 +00002311void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2312 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002313 // FIXME: This *really* should not be here. We need some way of translating
2314 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002315 if (Name == "sse4")
2316 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002317
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002319
Craig Topper29561122013-09-19 01:13:07 +00002320 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002321 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002322 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002323 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002324 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002326 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002328 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002330 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002331 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002332 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002333 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002334 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002335 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002336 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002337 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002338 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 if (Enabled)
2340 setSSELevel(Features, SSE2, Enabled);
2341 } else if (Name == "pclmul") {
2342 if (Enabled)
2343 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002344 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002345 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002346 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002348 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002349 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002350 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002351 if (Enabled)
2352 setSSELevel(Features, AVX512F, Enabled);
2353 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002354 if (Enabled)
2355 setSSELevel(Features, AVX, Enabled);
2356 } else if (Name == "fma4") {
2357 setXOPLevel(Features, FMA4, Enabled);
2358 } else if (Name == "xop") {
2359 setXOPLevel(Features, XOP, Enabled);
2360 } else if (Name == "sse4a") {
2361 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002362 } else if (Name == "f16c") {
2363 if (Enabled)
2364 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002365 } else if (Name == "sha") {
2366 if (Enabled)
2367 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002368 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002369}
2370
Eric Christopher3ff21b32013-10-16 21:26:26 +00002371/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002372/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002373bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002374 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002375 // Remember the maximum enabled sselevel.
2376 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2377 // Ignore disabled features.
2378 if (Features[i][0] == '-')
2379 continue;
2380
Benjamin Kramer27402c62012-03-05 15:10:44 +00002381 StringRef Feature = StringRef(Features[i]).substr(1);
2382
2383 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002384 HasAES = true;
2385 continue;
2386 }
2387
Craig Topper3f122a72012-05-31 05:18:48 +00002388 if (Feature == "pclmul") {
2389 HasPCLMUL = true;
2390 continue;
2391 }
2392
Benjamin Kramer27402c62012-03-05 15:10:44 +00002393 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002394 HasLZCNT = true;
2395 continue;
2396 }
2397
Rafael Espindola89049822013-08-23 20:21:37 +00002398 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002399 HasRDRND = true;
2400 continue;
2401 }
2402
Benjamin Kramer27402c62012-03-05 15:10:44 +00002403 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002404 HasBMI = true;
2405 continue;
2406 }
2407
Benjamin Kramer27402c62012-03-05 15:10:44 +00002408 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002409 HasBMI2 = true;
2410 continue;
2411 }
2412
Benjamin Kramer27402c62012-03-05 15:10:44 +00002413 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002414 HasPOPCNT = true;
2415 continue;
2416 }
2417
Michael Liao625a8752012-11-10 05:17:46 +00002418 if (Feature == "rtm") {
2419 HasRTM = true;
2420 continue;
2421 }
2422
Michael Liao74f4eaf2013-03-26 17:52:08 +00002423 if (Feature == "prfchw") {
2424 HasPRFCHW = true;
2425 continue;
2426 }
2427
Michael Liaoffaae352013-03-29 05:17:55 +00002428 if (Feature == "rdseed") {
2429 HasRDSEED = true;
2430 continue;
2431 }
2432
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002433 if (Feature == "tbm") {
2434 HasTBM = true;
2435 continue;
2436 }
2437
Craig Topperbba778b2012-06-03 21:46:30 +00002438 if (Feature == "fma") {
2439 HasFMA = true;
2440 continue;
2441 }
2442
Manman Rena45358c2012-10-11 00:59:55 +00002443 if (Feature == "f16c") {
2444 HasF16C = true;
2445 continue;
2446 }
2447
Craig Topper679b53a2013-08-21 05:29:10 +00002448 if (Feature == "avx512cd") {
2449 HasAVX512CD = true;
2450 continue;
2451 }
2452
2453 if (Feature == "avx512er") {
2454 HasAVX512ER = true;
2455 continue;
2456 }
2457
2458 if (Feature == "avx512pf") {
2459 HasAVX512PF = true;
2460 continue;
2461 }
2462
Ben Langmuir58078d02013-09-19 13:22:04 +00002463 if (Feature == "sha") {
2464 HasSHA = true;
2465 continue;
2466 }
2467
Nick Lewycky50e8f482013-10-05 20:14:27 +00002468 if (Feature == "cx16") {
2469 HasCX16 = true;
2470 continue;
2471 }
2472
Daniel Dunbar979586e2009-11-11 09:38:56 +00002473 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002474 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002475 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002476 .Case("avx2", AVX2)
2477 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002478 .Case("sse4.2", SSE42)
2479 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002480 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002481 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002482 .Case("sse2", SSE2)
2483 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002484 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002485 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002486
Eli Friedman33465822011-07-08 23:31:17 +00002487 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002488 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002489 .Case("3dnowa", AMD3DNowAthlon)
2490 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002491 .Case("mmx", MMX)
2492 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002493 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002494
2495 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2496 .Case("xop", XOP)
2497 .Case("fma4", FMA4)
2498 .Case("sse4a", SSE4A)
2499 .Default(NoXOP);
2500 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002501 }
Eli Friedman33465822011-07-08 23:31:17 +00002502
Craig Topper7481d8a2013-09-10 06:55:47 +00002503 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2504 // Can't do this earlier because we need to be able to explicitly enable
2505 // popcnt and still disable sse4.2.
2506 if (!HasPOPCNT && SSELevel >= SSE42 &&
2507 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2508 HasPOPCNT = true;
2509 Features.push_back("+popcnt");
2510 }
2511
Yunzhong Gao61089362013-10-16 19:07:02 +00002512 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2513 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2514 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2515 HasPRFCHW = true;
2516 Features.push_back("+prfchw");
2517 }
2518
Rafael Espindolaeb265472013-08-21 21:59:03 +00002519 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2520 // matches the selected sse level.
2521 if (FPMath == FP_SSE && SSELevel < SSE1) {
2522 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2523 return false;
2524 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2525 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2526 return false;
2527 }
2528
Eli Friedman33465822011-07-08 23:31:17 +00002529 // Don't tell the backend if we're turning off mmx; it will end up disabling
2530 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002531 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2532 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002533 std::vector<std::string>::iterator it;
2534 it = std::find(Features.begin(), Features.end(), "-mmx");
2535 if (it != Features.end())
2536 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002537 else if (SSELevel > NoSSE)
2538 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002539 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002540}
Chris Lattnerecd49032009-03-02 22:27:17 +00002541
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002542/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2543/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002544void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002545 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002546 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002547 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002548 Builder.defineMacro("__amd64__");
2549 Builder.defineMacro("__amd64");
2550 Builder.defineMacro("__x86_64");
2551 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002552 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002553 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002554 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002555
Chris Lattnerecd49032009-03-02 22:27:17 +00002556 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002557 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2558 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002559 switch (CPU) {
2560 case CK_Generic:
2561 break;
2562 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002563 // The rest are coming from the i386 define above.
2564 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002565 break;
2566 case CK_i486:
2567 case CK_WinChipC6:
2568 case CK_WinChip2:
2569 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002570 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002571 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002572 case CK_PentiumMMX:
2573 Builder.defineMacro("__pentium_mmx__");
2574 Builder.defineMacro("__tune_pentium_mmx__");
2575 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002576 case CK_i586:
2577 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002578 defineCPUMacros(Builder, "i586");
2579 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002581 case CK_Pentium3:
2582 case CK_Pentium3M:
2583 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002584 Builder.defineMacro("__tune_pentium3__");
2585 // Fallthrough
2586 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002587 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002588 Builder.defineMacro("__tune_pentium2__");
2589 // Fallthrough
2590 case CK_PentiumPro:
2591 Builder.defineMacro("__tune_i686__");
2592 Builder.defineMacro("__tune_pentiumpro__");
2593 // Fallthrough
2594 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002595 Builder.defineMacro("__i686");
2596 Builder.defineMacro("__i686__");
2597 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2598 Builder.defineMacro("__pentiumpro");
2599 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002600 break;
2601 case CK_Pentium4:
2602 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002603 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 break;
2605 case CK_Yonah:
2606 case CK_Prescott:
2607 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002608 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002609 break;
2610 case CK_Core2:
2611 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002612 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 break;
2614 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002615 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002617 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002618 defineCPUMacros(Builder, "slm");
2619 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 case CK_Corei7:
2621 case CK_Corei7AVX:
2622 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002623 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002624 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002625 break;
Craig Topper449314e2013-08-20 07:09:39 +00002626 case CK_KNL:
2627 defineCPUMacros(Builder, "knl");
2628 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002629 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002630 Builder.defineMacro("__k6_2__");
2631 Builder.defineMacro("__tune_k6_2__");
2632 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002634 if (CPU != CK_K6_2) { // In case of fallthrough
2635 // FIXME: GCC may be enabling these in cases where some other k6
2636 // architecture is specified but -m3dnow is explicitly provided. The
2637 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002638 Builder.defineMacro("__k6_3__");
2639 Builder.defineMacro("__tune_k6_3__");
2640 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002641 // Fallthrough
2642 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002643 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 break;
2645 case CK_Athlon:
2646 case CK_AthlonThunderbird:
2647 case CK_Athlon4:
2648 case CK_AthlonXP:
2649 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002650 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002651 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002652 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002653 Builder.defineMacro("__tune_athlon_sse__");
2654 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002655 break;
2656 case CK_K8:
2657 case CK_K8SSE3:
2658 case CK_x86_64:
2659 case CK_Opteron:
2660 case CK_OpteronSSE3:
2661 case CK_Athlon64:
2662 case CK_Athlon64SSE3:
2663 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002664 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002665 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002666 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002667 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002668 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002669 case CK_BTVER1:
2670 defineCPUMacros(Builder, "btver1");
2671 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002672 case CK_BTVER2:
2673 defineCPUMacros(Builder, "btver2");
2674 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002675 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002676 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002677 break;
2678 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002679 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002680 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002681 case CK_BDVER3:
2682 defineCPUMacros(Builder, "bdver3");
2683 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002684 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002685 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002686 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002687 }
Chris Lattner96e43572009-03-02 22:40:39 +00002688
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002689 // Target properties.
2690 Builder.defineMacro("__LITTLE_ENDIAN__");
2691 Builder.defineMacro("__REGISTER_PREFIX__", "");
2692
Chris Lattner6df41af2009-04-19 17:32:33 +00002693 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2694 // functions in glibc header files that use FP Stack inline asm which the
2695 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002696 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002697
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002698 if (HasAES)
2699 Builder.defineMacro("__AES__");
2700
Craig Topper3f122a72012-05-31 05:18:48 +00002701 if (HasPCLMUL)
2702 Builder.defineMacro("__PCLMUL__");
2703
Craig Topper22967d42011-12-25 05:06:45 +00002704 if (HasLZCNT)
2705 Builder.defineMacro("__LZCNT__");
2706
Benjamin Kramer1e250392012-07-07 09:39:18 +00002707 if (HasRDRND)
2708 Builder.defineMacro("__RDRND__");
2709
Craig Topper22967d42011-12-25 05:06:45 +00002710 if (HasBMI)
2711 Builder.defineMacro("__BMI__");
2712
2713 if (HasBMI2)
2714 Builder.defineMacro("__BMI2__");
2715
Craig Topper1de83482011-12-29 16:10:46 +00002716 if (HasPOPCNT)
2717 Builder.defineMacro("__POPCNT__");
2718
Michael Liao625a8752012-11-10 05:17:46 +00002719 if (HasRTM)
2720 Builder.defineMacro("__RTM__");
2721
Michael Liao74f4eaf2013-03-26 17:52:08 +00002722 if (HasPRFCHW)
2723 Builder.defineMacro("__PRFCHW__");
2724
Michael Liaoffaae352013-03-29 05:17:55 +00002725 if (HasRDSEED)
2726 Builder.defineMacro("__RDSEED__");
2727
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002728 if (HasTBM)
2729 Builder.defineMacro("__TBM__");
2730
Rafael Espindolae62e2792013-08-20 13:44:29 +00002731 switch (XOPLevel) {
2732 case XOP:
2733 Builder.defineMacro("__XOP__");
2734 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002735 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 case SSE4A:
2737 Builder.defineMacro("__SSE4A__");
2738 case NoXOP:
2739 break;
2740 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002741
Craig Topperbba778b2012-06-03 21:46:30 +00002742 if (HasFMA)
2743 Builder.defineMacro("__FMA__");
2744
Manman Rena45358c2012-10-11 00:59:55 +00002745 if (HasF16C)
2746 Builder.defineMacro("__F16C__");
2747
Craig Topper679b53a2013-08-21 05:29:10 +00002748 if (HasAVX512CD)
2749 Builder.defineMacro("__AVX512CD__");
2750 if (HasAVX512ER)
2751 Builder.defineMacro("__AVX512ER__");
2752 if (HasAVX512PF)
2753 Builder.defineMacro("__AVX512PF__");
2754
Ben Langmuir58078d02013-09-19 13:22:04 +00002755 if (HasSHA)
2756 Builder.defineMacro("__SHA__");
2757
Nick Lewycky50e8f482013-10-05 20:14:27 +00002758 if (HasCX16)
2759 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2760
Chris Lattner96e43572009-03-02 22:40:39 +00002761 // Each case falls through to the previous one here.
2762 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002763 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002764 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002765 case AVX2:
2766 Builder.defineMacro("__AVX2__");
2767 case AVX:
2768 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002769 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002770 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002771 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002772 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002773 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002774 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002775 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002776 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002777 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002778 Builder.defineMacro("__SSE2__");
2779 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002780 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002781 Builder.defineMacro("__SSE__");
2782 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002783 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002784 break;
2785 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002786
Derek Schuffc7dd7222012-10-11 15:52:22 +00002787 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002788 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002789 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002790 case AVX2:
2791 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002792 case SSE42:
2793 case SSE41:
2794 case SSSE3:
2795 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002796 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002797 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002798 break;
2799 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002800 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002801 break;
2802 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002803 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002804 }
2805 }
2806
Anders Carlssone437c682010-01-27 03:47:49 +00002807 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002808 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002809 case AMD3DNowAthlon:
2810 Builder.defineMacro("__3dNOW_A__");
2811 case AMD3DNow:
2812 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002813 case MMX:
2814 Builder.defineMacro("__MMX__");
2815 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002816 break;
2817 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002818
2819 if (CPU >= CK_i486) {
2820 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2821 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2822 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2823 }
2824 if (CPU >= CK_i586)
2825 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002826}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002827
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002828bool X86TargetInfo::hasFeature(StringRef Feature) const {
2829 return llvm::StringSwitch<bool>(Feature)
2830 .Case("aes", HasAES)
2831 .Case("avx", SSELevel >= AVX)
2832 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002833 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002834 .Case("avx512cd", HasAVX512CD)
2835 .Case("avx512er", HasAVX512ER)
2836 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002837 .Case("bmi", HasBMI)
2838 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002839 .Case("cx16", HasCX16)
2840 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002841 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002843 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002844 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002845 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002846 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2847 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2848 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002849 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002850 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002851 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002852 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002853 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002854 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002855 .Case("sse", SSELevel >= SSE1)
2856 .Case("sse2", SSELevel >= SSE2)
2857 .Case("sse3", SSELevel >= SSE3)
2858 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002859 .Case("sse4.1", SSELevel >= SSE41)
2860 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002861 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002862 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002863 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2864 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002866 .Default(false);
2867}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002868
Eli Friedman3fd920a2008-08-20 02:34:37 +00002869bool
Anders Carlsson58436352009-02-28 17:11:49 +00002870X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002871 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002872 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002873 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002874 case 'Y': // first letter of a pair:
2875 switch (*(Name+1)) {
2876 default: return false;
2877 case '0': // First SSE register.
2878 case 't': // Any SSE register, when SSE2 is enabled.
2879 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2880 case 'm': // any MMX register, when inter-unit moves enabled.
2881 break; // falls through to setAllowsRegister.
2882 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002883 case 'a': // eax.
2884 case 'b': // ebx.
2885 case 'c': // ecx.
2886 case 'd': // edx.
2887 case 'S': // esi.
2888 case 'D': // edi.
2889 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002890 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002891 case 't': // top of floating point stack.
2892 case 'u': // second from top of floating point stack.
2893 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002894 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002895 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002896 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002897 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2898 case 'l': // "Index" registers: any general register that can be used as an
2899 // index in a base+index memory access.
2900 Info.setAllowsRegister();
2901 return true;
2902 case 'C': // SSE floating point constant.
2903 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002904 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002905 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002906 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002907 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002908 return true;
2909 }
2910}
2911
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002912
Eli Friedman3fd920a2008-08-20 02:34:37 +00002913std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002914X86TargetInfo::convertConstraint(const char *&Constraint) const {
2915 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002916 case 'a': return std::string("{ax}");
2917 case 'b': return std::string("{bx}");
2918 case 'c': return std::string("{cx}");
2919 case 'd': return std::string("{dx}");
2920 case 'S': return std::string("{si}");
2921 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002922 case 'p': // address
2923 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002924 case 't': // top of floating point stack.
2925 return std::string("{st}");
2926 case 'u': // second from top of floating point stack.
2927 return std::string("{st(1)}"); // second from top of floating point stack.
2928 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002929 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002930 }
2931}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002932} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002933
2934namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002935// X86-32 generic target
2936class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002937public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002938 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002939 DoubleAlign = LongLongAlign = 32;
2940 LongDoubleWidth = 96;
2941 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002942 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00002943 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00002944 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00002945 "f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002946 SizeType = UnsignedInt;
2947 PtrDiffType = SignedInt;
2948 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002949 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002950
2951 // Use fpret for all types.
2952 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2953 (1 << TargetInfo::Double) |
2954 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002955
2956 // x86-32 has atomics up to 8 bytes
2957 // FIXME: Check that we actually have cmpxchg8b before setting
2958 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2959 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002960 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002961 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2962 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002963 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002964
Chris Lattnerd545ad12009-09-23 06:06:36 +00002965 int getEHDataRegisterNumber(unsigned RegNo) const {
2966 if (RegNo == 0) return 0;
2967 if (RegNo == 1) return 2;
2968 return -1;
2969 }
Bill Wendling887b4852012-11-12 06:42:51 +00002970 virtual bool validateInputSize(StringRef Constraint,
2971 unsigned Size) const {
2972 switch (Constraint[0]) {
2973 default: break;
2974 case 'a':
2975 case 'b':
2976 case 'c':
2977 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002978 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002979 }
2980
2981 return true;
2982 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002983};
2984} // end anonymous namespace
2985
2986namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002987class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2988public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002989 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2990 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002991
2992 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002993 unsigned Major, Minor, Micro;
2994 getTriple().getOSVersion(Major, Minor, Micro);
2995 // New NetBSD uses the default rounding mode.
2996 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2997 return X86_32TargetInfo::getFloatEvalMethod();
2998 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002999 return 1;
3000 }
3001};
3002} // end anonymous namespace
3003
3004namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003005class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3006public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003007 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3008 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003009 SizeType = UnsignedLong;
3010 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003011 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003012 }
3013};
3014} // end anonymous namespace
3015
3016namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003017class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3018public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003019 BitrigI386TargetInfo(const llvm::Triple &Triple)
3020 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003021 SizeType = UnsignedLong;
3022 IntPtrType = SignedLong;
3023 PtrDiffType = SignedLong;
3024 }
3025};
3026} // end anonymous namespace
3027
3028namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003029class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003030public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003031 DarwinI386TargetInfo(const llvm::Triple &Triple)
3032 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003033 LongDoubleWidth = 128;
3034 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003035 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003036 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003037 SizeType = UnsignedLong;
3038 IntPtrType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00003039 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003040 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003041 "f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003042 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003043 }
3044
Eli Friedman3fd920a2008-08-20 02:34:37 +00003045};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003046} // end anonymous namespace
3047
3048namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003049// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003050class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003051public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003052 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3053 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003054 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003055 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003056 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003057 DescriptionString = "e-p:32:32-"
3058 "i64:64-"
3059 "f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003060 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003061 virtual void getTargetDefines(const LangOptions &Opts,
3062 MacroBuilder &Builder) const {
3063 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3064 }
3065};
3066} // end anonymous namespace
3067
3068namespace {
3069
3070// x86-32 Windows Visual Studio target
3071class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3072public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003073 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3074 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003075 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003076 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3077 }
3078 virtual void getTargetDefines(const LangOptions &Opts,
3079 MacroBuilder &Builder) const {
3080 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3081 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3082 // The value of the following reflects processor type.
3083 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3084 // We lost the original triple, so we use the default.
3085 Builder.defineMacro("_M_IX86", "600");
3086 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003087};
3088} // end anonymous namespace
3089
3090namespace {
3091// x86-32 MinGW target
3092class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3093public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003094 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3095 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003096 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003097 MacroBuilder &Builder) const {
3098 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003099 DefineStd(Builder, "WIN32", Opts);
3100 DefineStd(Builder, "WINNT", Opts);
3101 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003102 Builder.defineMacro("__MSVCRT__");
3103 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003104
3105 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3106 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003107 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003108 // Provide "as-is" __declspec.
3109 Builder.defineMacro("__declspec", "__declspec");
3110 else
3111 // Provide alias of __attribute__ like mingw32-gcc.
3112 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003113 }
3114};
3115} // end anonymous namespace
3116
3117namespace {
3118// x86-32 Cygwin target
3119class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3120public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003121 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3122 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003123 TLSSupported = false;
3124 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003125 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003126 DescriptionString = "e-p:32:32-"
3127 "i64:64-"
3128 "f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003129 }
3130 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003131 MacroBuilder &Builder) const {
3132 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003133 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003134 Builder.defineMacro("__CYGWIN__");
3135 Builder.defineMacro("__CYGWIN32__");
3136 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003137 if (Opts.CPlusPlus)
3138 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003139 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003140};
3141} // end anonymous namespace
3142
3143namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003144// x86-32 Haiku target
3145class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3146public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003147 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003148 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003149 IntPtrType = SignedLong;
3150 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003151 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003152 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003153 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003154 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003155 virtual void getTargetDefines(const LangOptions &Opts,
3156 MacroBuilder &Builder) const {
3157 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3158 Builder.defineMacro("__INTEL__");
3159 Builder.defineMacro("__HAIKU__");
3160 }
3161};
3162} // end anonymous namespace
3163
Douglas Gregor9fabd852011-07-01 22:41:14 +00003164// RTEMS Target
3165template<typename Target>
3166class RTEMSTargetInfo : public OSTargetInfo<Target> {
3167protected:
3168 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3169 MacroBuilder &Builder) const {
3170 // RTEMS defines; list based off of gcc output
3171
Douglas Gregor9fabd852011-07-01 22:41:14 +00003172 Builder.defineMacro("__rtems__");
3173 Builder.defineMacro("__ELF__");
3174 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003175
Douglas Gregor9fabd852011-07-01 22:41:14 +00003176public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003177 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3178 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003179
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003180 switch (Triple.getArch()) {
3181 default:
3182 case llvm::Triple::x86:
3183 // this->MCountName = ".mcount";
3184 break;
3185 case llvm::Triple::mips:
3186 case llvm::Triple::mipsel:
3187 case llvm::Triple::ppc:
3188 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003189 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003190 // this->MCountName = "_mcount";
3191 break;
3192 case llvm::Triple::arm:
3193 // this->MCountName = "__mcount";
3194 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003195 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003196 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003197};
3198
3199namespace {
3200// x86-32 RTEMS target
3201class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3202public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003203 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003204 SizeType = UnsignedLong;
3205 IntPtrType = SignedLong;
3206 PtrDiffType = SignedLong;
3207 this->UserLabelPrefix = "";
3208 }
3209 virtual void getTargetDefines(const LangOptions &Opts,
3210 MacroBuilder &Builder) const {
3211 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3212 Builder.defineMacro("__INTEL__");
3213 Builder.defineMacro("__rtems__");
3214 }
3215};
3216} // end anonymous namespace
3217
Chris Lattnerb986aba2010-04-11 19:29:39 +00003218namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003219// x86-64 generic target
3220class X86_64TargetInfo : public X86TargetInfo {
3221public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003222 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003223 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003224 LongDoubleWidth = 128;
3225 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003226 LargeArrayMinWidth = 128;
3227 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003228 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003229 IntMaxType = SignedLong;
3230 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003231 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003232 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003233
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00003234 DescriptionString = "e-i64:64-f80:128-s:64-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003235
3236 // Use fpret only for long double.
3237 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003238
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003239 // Use fp2ret for _Complex long double.
3240 ComplexLongDoubleUsesFP2Ret = true;
3241
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003242 // x86-64 has atomics up to 16 bytes.
3243 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3244 // on CPUs with cmpxchg16b
3245 MaxAtomicPromoteWidth = 128;
3246 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003247 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003248 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3249 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003250 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003251
Chris Lattnerd545ad12009-09-23 06:06:36 +00003252 int getEHDataRegisterNumber(unsigned RegNo) const {
3253 if (RegNo == 0) return 0;
3254 if (RegNo == 1) return 1;
3255 return -1;
3256 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003257
3258 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003259 return (CC == CC_C ||
3260 CC == CC_IntelOclBicc ||
3261 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003262 }
3263
Aaron Ballman02df2e02012-12-09 17:45:41 +00003264 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3265 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003266 }
3267
Eli Friedman3fd920a2008-08-20 02:34:37 +00003268};
3269} // end anonymous namespace
3270
3271namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003272// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003273class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003275 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3276 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003277 TLSSupported = false;
3278 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003279 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003280 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003281 IntMaxType = SignedLongLong;
3282 UIntMaxType = UnsignedLongLong;
3283 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003284 SizeType = UnsignedLongLong;
3285 PtrDiffType = SignedLongLong;
3286 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003287 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003288 }
3289 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003290 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003291 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003292 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003293 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003294 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3295 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003296 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003297 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3298 return (CC == CC_C ||
3299 CC == CC_IntelOclBicc ||
3300 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3301 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003302};
3303} // end anonymous namespace
3304
3305namespace {
3306// x86-64 Windows Visual Studio target
3307class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3308public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003309 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3310 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003311 LongDoubleWidth = LongDoubleAlign = 64;
3312 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003313 }
3314 virtual void getTargetDefines(const LangOptions &Opts,
3315 MacroBuilder &Builder) const {
3316 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3317 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003319 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003320 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003321};
3322} // end anonymous namespace
3323
3324namespace {
3325// x86-64 MinGW target
3326class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3327public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003328 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3329 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003330 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003331 MacroBuilder &Builder) const {
3332 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003333 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003334 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003335 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003336 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003337
3338 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3339 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003340 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003341 // Provide "as-is" __declspec.
3342 Builder.defineMacro("__declspec", "__declspec");
3343 else
3344 // Provide alias of __attribute__ like mingw32-gcc.
3345 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003346 }
3347};
3348} // end anonymous namespace
3349
3350namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003351class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3352public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003353 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3354 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003355 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003356 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003357 }
3358};
3359} // end anonymous namespace
3360
3361namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003362class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3363public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003364 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3365 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003366 IntMaxType = SignedLongLong;
3367 UIntMaxType = UnsignedLongLong;
3368 Int64Type = SignedLongLong;
3369 }
3370};
3371} // end anonymous namespace
3372
3373namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003374class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3375public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003376 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3377 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3378 IntMaxType = SignedLongLong;
3379 UIntMaxType = UnsignedLongLong;
3380 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003381 }
3382};
Tim Northover9bb857a2013-01-31 12:13:10 +00003383}
3384
3385namespace {
3386class AArch64TargetInfo : public TargetInfo {
3387 static const char * const GCCRegNames[];
3388 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003389
Tim Northover2fe823a2013-08-01 09:23:19 +00003390 enum FPUModeEnum {
3391 FPUMode,
3392 NeonMode
3393 };
3394
3395 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003396 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003397 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003398
Tim Northover9bb857a2013-01-31 12:13:10 +00003399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003400 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003401 BigEndian = false;
3402 LongWidth = LongAlign = 64;
3403 LongDoubleWidth = LongDoubleAlign = 128;
3404 PointerWidth = PointerAlign = 64;
3405 SuitableAlign = 128;
Rafael Espindolac2e60f52013-12-17 23:30:58 +00003406 DescriptionString = "e-i64:64-i128:128-s:32-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003407
3408 WCharType = UnsignedInt;
3409 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3410
Tim Northover847d2d42013-02-18 12:11:32 +00003411 // AArch64 backend supports 64-bit operations at the moment. In principle
3412 // 128-bit is possible if register-pairs are used.
3413 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3414
Tim Northover9bb857a2013-01-31 12:13:10 +00003415 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3416 }
3417 virtual void getTargetDefines(const LangOptions &Opts,
3418 MacroBuilder &Builder) const {
3419 // GCC defines theses currently
3420 Builder.defineMacro("__aarch64__");
3421 Builder.defineMacro("__AARCH64EL__");
3422
3423 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003424 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003425 Builder.defineMacro("__ARM_ARCH", "8");
3426 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003427
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003428 Builder.defineMacro("__ARM_64BIT_STATE");
3429 Builder.defineMacro("__ARM_PCS_AAPCS64");
3430 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3431
Tim Northoverb85654d2013-04-05 14:08:55 +00003432 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3433 Builder.defineMacro("__ARM_FEATURE_CLZ");
3434 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003435 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003436
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003437 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003438
3439 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003440 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003441
3442 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003443 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3444 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003445
3446 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003447 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003448
3449 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003450 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003451
Tim Northoverb85654d2013-04-05 14:08:55 +00003452 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003453 Opts.ShortWChar ? "2" : "4");
3454
Tim Northoverb85654d2013-04-05 14:08:55 +00003455 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003456 Opts.ShortEnums ? "1" : "4");
3457
3458 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003459 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3460
3461 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003462 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003463 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003464 Builder.defineMacro("__ARM_NEON_FP", "7");
3465 }
3466
3467 if (Crypto) {
3468 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003469 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003470 }
3471 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3472 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003473 Records = BuiltinInfo;
3474 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003475 }
3476 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003477 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003478 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003479
Amara Emerson703da2e2013-10-31 09:32:33 +00003480 virtual bool setCPU(const std::string &Name) {
3481 return llvm::StringSwitch<bool>(Name)
3482 .Case("generic", true)
3483 .Cases("cortex-a53", "cortex-a57", true)
3484 .Default(false);
3485 }
3486
Eric Christopher3ff21b32013-10-16 21:26:26 +00003487 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003488 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003489 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003490 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003491 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3492 if (Features[i] == "+neon")
3493 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003494 if (Features[i] == "+crypto")
3495 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003496 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003497 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003498 }
3499
3500 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003501 unsigned &NumNames) const;
3502 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3503 unsigned &NumAliases) const;
3504
3505 virtual bool isCLZForZeroUndef() const { return false; }
3506
3507 virtual bool validateAsmConstraint(const char *&Name,
3508 TargetInfo::ConstraintInfo &Info) const {
3509 switch (*Name) {
3510 default: return false;
3511 case 'w': // An FP/SIMD vector register
3512 Info.setAllowsRegister();
3513 return true;
3514 case 'I': // Constant that can be used with an ADD instruction
3515 case 'J': // Constant that can be used with a SUB instruction
3516 case 'K': // Constant that can be used with a 32-bit logical instruction
3517 case 'L': // Constant that can be used with a 64-bit logical instruction
3518 case 'M': // Constant that can be used as a 32-bit MOV immediate
3519 case 'N': // Constant that can be used as a 64-bit MOV immediate
3520 case 'Y': // Floating point constant zero
3521 case 'Z': // Integer constant zero
3522 return true;
3523 case 'Q': // A memory reference with base register and no offset
3524 Info.setAllowsMemory();
3525 return true;
3526 case 'S': // A symbolic address
3527 Info.setAllowsRegister();
3528 return true;
3529 case 'U':
3530 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3531 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3532 // Usa: An absolute symbolic address
3533 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3534 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3535 }
3536 }
3537
3538 virtual const char *getClobbers() const {
3539 // There are no AArch64 clobbers shared by all asm statements.
3540 return "";
3541 }
3542
3543 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3544 return TargetInfo::AArch64ABIBuiltinVaList;
3545 }
3546};
3547
3548const char * const AArch64TargetInfo::GCCRegNames[] = {
3549 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3550 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3551 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3552 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3553
3554 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3555 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3556 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3557 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3558
3559 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3560 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3561 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3562 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3563
3564 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3565 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3566 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3567 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3568
3569 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3570 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3571 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3572 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3573
3574 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3575 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3576 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3577 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3578
3579 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3580 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3581 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3582 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3583};
3584
3585void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3586 unsigned &NumNames) const {
3587 Names = GCCRegNames;
3588 NumNames = llvm::array_lengthof(GCCRegNames);
3589}
3590
3591const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3592 { { "x16" }, "ip0"},
3593 { { "x17" }, "ip1"},
3594 { { "x29" }, "fp" },
3595 { { "x30" }, "lr" }
3596};
3597
3598void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3599 unsigned &NumAliases) const {
3600 Aliases = GCCRegAliases;
3601 NumAliases = llvm::array_lengthof(GCCRegAliases);
3602
3603}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003604
3605const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3606#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3607#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3608 ALL_LANGUAGES },
3609#include "clang/Basic/BuiltinsAArch64.def"
3610};
3611
Eli Friedman9fa28852012-08-08 23:57:20 +00003612} // end anonymous namespace
3613
3614namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003615class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003616 // Possible FPU choices.
3617 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003618 VFP2FPU = (1 << 0),
3619 VFP3FPU = (1 << 1),
3620 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003621 NeonFPU = (1 << 3),
3622 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003623 };
3624
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003625 // Possible HWDiv features.
3626 enum HWDivMode {
3627 HWDivThumb = (1 << 0),
3628 HWDivARM = (1 << 1)
3629 };
3630
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003631 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003632 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003633 }
3634
3635 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3636 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003637
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003638 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003639
Rafael Espindolaeb265472013-08-21 21:59:03 +00003640 enum {
3641 FP_Default,
3642 FP_VFP,
3643 FP_Neon
3644 } FPMath;
3645
Bernard Ogdenda13af32013-10-24 18:32:51 +00003646 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003647
Logan Chien57086ce2012-10-10 06:56:20 +00003648 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003649 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003650 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003651
3652 // Initialized via features.
3653 unsigned SoftFloat : 1;
3654 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003655
Bernard Ogden18b57012013-10-29 09:47:51 +00003656 unsigned CRC : 1;
3657
Chris Lattner5cc15e02010-03-03 19:03:45 +00003658 static const Builtin::Info BuiltinInfo[];
3659
Rafael Espindola101d5b92013-05-13 20:09:47 +00003660 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3661 // On linux, binaries targeting old cpus call functions in libgcc to
3662 // perform atomic operations. The implementation in libgcc then calls into
3663 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3664 // is that if we assume the kernel is at least as recent as the hardware,
3665 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003666 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003667 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003668 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003669 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003670 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003671 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003672 if (T.getArch() == llvm::Triple::arm) {
3673 if (!ArchName.startswith("armv"))
3674 return false;
3675 StringRef VersionStr = ArchName.substr(4);
3676 unsigned Version;
3677 if (VersionStr.getAsInteger(10, Version))
3678 return false;
3679 return Version >= 6;
3680 }
3681 assert(T.getArch() == llvm::Triple::thumb);
3682 if (!ArchName.startswith("thumbv"))
3683 return false;
3684 StringRef VersionStr = ArchName.substr(6);
3685 unsigned Version;
3686 if (VersionStr.getAsInteger(10, Version))
3687 return false;
3688 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003689 }
3690
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003691 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003692 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003693
3694 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3695
3696 // size_t is unsigned long on Darwin and netbsd.
3697 if (getTriple().isOSDarwin() || getTriple().getOS() == llvm::Triple::NetBSD)
3698 SizeType = UnsignedLong;
3699 else
3700 SizeType = UnsignedInt;
3701
3702 if (getTriple().getOS() == llvm::Triple::NetBSD) {
3703 WCharType = SignedInt;
3704 } else {
3705 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3706 WCharType = UnsignedInt;
3707 }
3708
3709 UseBitFieldTypeAlignment = true;
3710
3711 ZeroLengthBitfieldBoundary = 0;
3712
3713 if (IsThumb) {
3714 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3715 // so set preferred for small types to 32.
3716 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3717 "v128:64:128-a:0:32-n32-S64");
3718 } else {
3719 DescriptionString = ("e-p:32:32-i64:64-v128:64:128-n32-S64");
3720 }
3721
3722 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003723 }
3724
3725 void setABIAPCS() {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003726 IsAAPCS = false;
3727
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003728 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003729
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003730 // size_t is unsigned int on FreeBSD.
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003731 if (getTriple().getOS() == llvm::Triple::FreeBSD)
3732 SizeType = UnsignedInt;
3733 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003734 SizeType = UnsignedLong;
3735
3736 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3737 WCharType = SignedInt;
3738
3739 // Do not respect the alignment of bit-field types when laying out
3740 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3741 UseBitFieldTypeAlignment = false;
3742
3743 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3744 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3745 /// gcc.
3746 ZeroLengthBitfieldBoundary = 32;
3747
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003748 if (IsThumb) {
3749 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3750 // so set preferred for small types to 32.
3751 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3752 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3753 } else {
3754 DescriptionString =
3755 "e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3756 }
3757
3758 // FIXME: Override "preferred align" for double and long long.
3759 }
3760
Chris Lattner17df24e2008-04-21 18:56:49 +00003761public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003762 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003763 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3764 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003765 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003766 switch (getTriple().getOS()) {
3767 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003768 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003769 break;
3770 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003771 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003772 break;
3773 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003774
Chris Lattner1a8f3942010-04-23 16:29:58 +00003775 // {} in inline assembly are neon specifiers, not assembly variant
3776 // specifiers.
3777 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003778
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003779 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003780 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003781
3782 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003783
3784 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003785 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003786
3787 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003788 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003789 if (shouldUseInlineAtomic(getTriple()))
3790 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003791
3792 // Do force alignment of members that follow zero length bitfields. If
3793 // the alignment of the zero-length bitfield is greater than the member
3794 // that follows it, `bar', `bar' will be aligned as the type of the
3795 // zero length bitfield.
3796 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003797 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003798 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003799 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003800 ABI = Name;
3801
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003802 // The defaults (above) are for AAPCS, check if we need to change them.
3803 //
3804 // FIXME: We need support for -meabi... we could just mangle it into the
3805 // name.
3806 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003807 setABIAPCS();
3808 return true;
3809 }
3810 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3811 setABIAAPCS();
3812 return true;
3813 }
3814 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003815 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003816
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003817 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Silviu Barangae5690462013-10-21 10:59:33 +00003818 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003819 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3820 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003821 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3822 CPU == "cortex-a9-mp") {
3823 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003824 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003825 }
3826 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003827 Features["vfp4"] = true;
3828 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003829 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3830 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3831 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003832 Features["vfp4"] = true;
3833 Features["neon"] = true;
3834 Features["hwdiv"] = true;
3835 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003836 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3837 Features["fp-armv8"] = true;
3838 Features["neon"] = true;
3839 Features["hwdiv"] = true;
3840 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003841 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003842 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003843 CPU == "cortex-m4" ||
3844 // Enable the hwdiv extension for all v8a AArch32 cores by
3845 // default.
3846 ArchName == "armv8a" || ArchName == "armv8" ||
3847 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3848 Features["hwdiv"] = true;
3849 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003850 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003851 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003852
Eric Christopher3ff21b32013-10-16 21:26:26 +00003853 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003854 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003855 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003856 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003857 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003858 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003859 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3860 if (Features[i] == "+soft-float")
3861 SoftFloat = true;
3862 else if (Features[i] == "+soft-float-abi")
3863 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003864 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003865 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003866 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003867 FPU |= VFP3FPU;
3868 else if (Features[i] == "+vfp4")
3869 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003870 else if (Features[i] == "+fp-armv8")
3871 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003872 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003873 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003874 else if (Features[i] == "+hwdiv")
3875 HWDiv |= HWDivThumb;
3876 else if (Features[i] == "+hwdiv-arm")
3877 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003878 else if (Features[i] == "+crc")
3879 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003880 }
3881
Rafael Espindolaeb265472013-08-21 21:59:03 +00003882 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3883 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3884 return false;
3885 }
3886
3887 if (FPMath == FP_Neon)
3888 Features.push_back("+neonfp");
3889 else if (FPMath == FP_VFP)
3890 Features.push_back("-neonfp");
3891
Daniel Dunbar893d4752009-12-19 04:15:38 +00003892 // Remove front-end specific options which the backend handles differently.
3893 std::vector<std::string>::iterator it;
3894 it = std::find(Features.begin(), Features.end(), "+soft-float");
3895 if (it != Features.end())
3896 Features.erase(it);
3897 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3898 if (it != Features.end())
3899 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003900 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003901 }
3902
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003903 virtual bool hasFeature(StringRef Feature) const {
3904 return llvm::StringSwitch<bool>(Feature)
3905 .Case("arm", true)
3906 .Case("softfloat", SoftFloat)
3907 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003908 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003909 .Case("hwdiv", HWDiv & HWDivThumb)
3910 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003911 .Default(false);
3912 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003913 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003914 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003915 return llvm::StringSwitch<const char*>(Name)
3916 .Cases("arm8", "arm810", "4")
3917 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3918 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3919 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3920 .Case("ep9312", "4T")
3921 .Cases("arm10tdmi", "arm1020t", "5T")
3922 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3923 .Case("arm926ej-s", "5TEJ")
3924 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3925 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003926 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003927 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003928 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003929 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003930 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003931 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003932 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003933 .Case("cortex-a9-mp", "7F")
3934 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003935 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003936 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003937 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003938 .Default(0);
3939 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003940 static const char *getCPUProfile(StringRef Name) {
3941 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003942 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003943 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003944 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003945 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003946 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003947 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003948 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003949 virtual bool setCPU(const std::string &Name) {
3950 if (!getCPUDefineSuffix(Name))
3951 return false;
3952
3953 CPU = Name;
3954 return true;
3955 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003956 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003957 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003959 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003960 Builder.defineMacro("__arm");
3961 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003962
Chris Lattnerecd49032009-03-02 22:27:17 +00003963 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003964 Builder.defineMacro("__ARMEL__");
3965 Builder.defineMacro("__LITTLE_ENDIAN__");
3966 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003967
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003968 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003969 unsigned int CPUArchVer;
3970 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3971 llvm_unreachable("Invalid char for architecture version number");
3972 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003973 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003974 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3975 StringRef CPUProfile = getCPUProfile(CPU);
3976 if (!CPUProfile.empty())
3977 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3978
Mike Stump9d54bd72009-04-08 02:07:04 +00003979 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003980
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003981 // FIXME: It's more complicated than this and we don't really support
3982 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003983 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003984 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003985
David Tweed8f676532012-10-25 13:33:01 +00003986 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003987 // Embedded targets on Darwin follow AAPCS, but not EABI.
3988 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003989 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003990 Builder.defineMacro("__ARM_PCS", "1");
3991
David Tweed8f676532012-10-25 13:33:01 +00003992 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003993 Builder.defineMacro("__ARM_PCS_VFP", "1");
3994 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003995
Daniel Dunbar893d4752009-12-19 04:15:38 +00003996 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003997 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003998
3999 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004000 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004001
4002 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004003 Builder.defineMacro("__THUMBEL__");
4004 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004005 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004006 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004007 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004008 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4009 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004010
4011 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004012 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004013
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004014 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004015 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004016 if (FPU & VFP2FPU)
4017 Builder.defineMacro("__ARM_VFPV2__");
4018 if (FPU & VFP3FPU)
4019 Builder.defineMacro("__ARM_VFPV3__");
4020 if (FPU & VFP4FPU)
4021 Builder.defineMacro("__ARM_VFPV4__");
4022 }
4023
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004024 // This only gets set when Neon instructions are actually available, unlike
4025 // the VFP define, hence the soft float and arch check. This is subtly
4026 // different from gcc, we follow the intent which was that it should be set
4027 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004028 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4029 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004030 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004031 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004032
Bernard Ogden18b57012013-10-29 09:47:51 +00004033 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004034 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004035
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004036 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004037 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4038 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4039 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4040 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4041 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004042 }
4043 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4044 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004045 Records = BuiltinInfo;
4046 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004047 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004048 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004049 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004050 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004051 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004052 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004053 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004054 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004055 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004056 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004057 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004058 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004059 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004060 case 'l': // r0-r7
4061 case 'h': // r8-r15
4062 case 'w': // VFP Floating point register single precision
4063 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004064 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004065 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004066 case 'Q': // A memory address that is a single base register.
4067 Info.setAllowsMemory();
4068 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004069 case 'U': // a memory reference...
4070 switch (Name[1]) {
4071 case 'q': // ...ARMV4 ldrsb
4072 case 'v': // ...VFP load/store (reg+constant offset)
4073 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004074 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004075 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004076 case 'n': // valid address for Neon doubleword vector load/store
4077 case 'm': // valid address for Neon element and structure load/store
4078 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004079 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004080 Info.setAllowsMemory();
4081 Name++;
4082 return true;
4083 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004084 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004085 return false;
4086 }
Evan Chengd863adb2011-06-16 19:13:15 +00004087 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004088 std::string R;
4089 switch (*Constraint) {
4090 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004091 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004092 Constraint++;
4093 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004094 case 'p': // 'p' should be translated to 'r' by default.
4095 R = std::string("r");
4096 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004097 default:
4098 return std::string(1, *Constraint);
4099 }
4100 return R;
4101 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004102 virtual bool validateConstraintModifier(StringRef Constraint,
4103 const char Modifier,
4104 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004105 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004106 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004107
Bill Wendling9d1ee112012-10-25 23:28:48 +00004108 // Strip off constraint modifiers.
4109 while (Constraint[0] == '=' ||
4110 Constraint[0] == '+' ||
4111 Constraint[0] == '&')
4112 Constraint = Constraint.substr(1);
4113
4114 switch (Constraint[0]) {
4115 default: break;
4116 case 'r': {
4117 switch (Modifier) {
4118 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004119 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004120 case 'q':
4121 // A register of size 32 cannot fit a vector type.
4122 return false;
4123 }
4124 }
4125 }
4126
4127 return true;
4128 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004129 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004130 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004131 return "";
4132 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004133
4134 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4135 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4136 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004137
4138 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4139 if (RegNo == 0) return 0;
4140 if (RegNo == 1) return 1;
4141 return -1;
4142 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004143};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004144
Rafael Espindolaeb265472013-08-21 21:59:03 +00004145bool ARMTargetInfo::setFPMath(StringRef Name) {
4146 if (Name == "neon") {
4147 FPMath = FP_Neon;
4148 return true;
4149 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4150 Name == "vfp4") {
4151 FPMath = FP_VFP;
4152 return true;
4153 }
4154 return false;
4155}
4156
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004157const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004158 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004159 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004160 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4161
4162 // Float registers
4163 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4164 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4165 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004166 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004167
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004168 // Double registers
4169 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4170 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004171 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4172 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004173
4174 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004175 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4176 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004177};
4178
4179void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004180 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004181 Names = GCCRegNames;
4182 NumNames = llvm::array_lengthof(GCCRegNames);
4183}
4184
4185const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004186 { { "a1" }, "r0" },
4187 { { "a2" }, "r1" },
4188 { { "a3" }, "r2" },
4189 { { "a4" }, "r3" },
4190 { { "v1" }, "r4" },
4191 { { "v2" }, "r5" },
4192 { { "v3" }, "r6" },
4193 { { "v4" }, "r7" },
4194 { { "v5" }, "r8" },
4195 { { "v6", "rfp" }, "r9" },
4196 { { "sl" }, "r10" },
4197 { { "fp" }, "r11" },
4198 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004199 { { "r13" }, "sp" },
4200 { { "r14" }, "lr" },
4201 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004202 // The S, D and Q registers overlap, but aren't really aliases; we
4203 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004204};
4205
4206void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4207 unsigned &NumAliases) const {
4208 Aliases = GCCRegAliases;
4209 NumAliases = llvm::array_lengthof(GCCRegAliases);
4210}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004211
4212const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004213#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004214#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004215 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004216#include "clang/Basic/BuiltinsARM.def"
4217};
Chris Lattner17df24e2008-04-21 18:56:49 +00004218} // end anonymous namespace.
4219
Eli Friedmanf05b7722008-08-20 07:44:10 +00004220namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004221class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004222 public DarwinTargetInfo<ARMTargetInfo> {
4223protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004224 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004225 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004226 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004227 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004228
Torok Edwinb2b37c62009-06-30 17:10:35 +00004229public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004230 DarwinARMTargetInfo(const llvm::Triple &Triple)
4231 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004232 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004233 // iOS always has 64-bit atomic instructions.
4234 // FIXME: This should be based off of the target features in ARMTargetInfo.
4235 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004236
4237 // Darwin on iOS uses a variant of the ARM C++ ABI.
4238 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004239 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004240};
4241} // end anonymous namespace.
4242
Tony Linthicum76329bf2011-12-12 21:14:55 +00004243
4244namespace {
4245// Hexagon abstract base class
4246class HexagonTargetInfo : public TargetInfo {
4247 static const Builtin::Info BuiltinInfo[];
4248 static const char * const GCCRegNames[];
4249 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4250 std::string CPU;
4251public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004252 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004253 BigEndian = false;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00004254 DescriptionString = ("e-p:32:32-i1:32-i64:64-a:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004255
4256 // {} in inline assembly are packet specifiers, not assembly variant
4257 // specifiers.
4258 NoAsmVariants = true;
4259 }
4260
4261 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4262 unsigned &NumRecords) const {
4263 Records = BuiltinInfo;
4264 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4265 }
4266
4267 virtual bool validateAsmConstraint(const char *&Name,
4268 TargetInfo::ConstraintInfo &Info) const {
4269 return true;
4270 }
4271
4272 virtual void getTargetDefines(const LangOptions &Opts,
4273 MacroBuilder &Builder) const;
4274
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004275 virtual bool hasFeature(StringRef Feature) const {
4276 return Feature == "hexagon";
4277 }
4278
Meador Inge5d3fb222012-06-16 03:34:49 +00004279 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4280 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004281 }
4282 virtual void getGCCRegNames(const char * const *&Names,
4283 unsigned &NumNames) const;
4284 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4285 unsigned &NumAliases) const;
4286 virtual const char *getClobbers() const {
4287 return "";
4288 }
Sebastian Pop86500282012-01-13 20:37:10 +00004289
4290 static const char *getHexagonCPUSuffix(StringRef Name) {
4291 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004292 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004293 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004294 .Default(0);
4295 }
4296
Tony Linthicum76329bf2011-12-12 21:14:55 +00004297 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004298 if (!getHexagonCPUSuffix(Name))
4299 return false;
4300
Tony Linthicum76329bf2011-12-12 21:14:55 +00004301 CPU = Name;
4302 return true;
4303 }
4304};
4305
4306void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4307 MacroBuilder &Builder) const {
4308 Builder.defineMacro("qdsp6");
4309 Builder.defineMacro("__qdsp6", "1");
4310 Builder.defineMacro("__qdsp6__", "1");
4311
4312 Builder.defineMacro("hexagon");
4313 Builder.defineMacro("__hexagon", "1");
4314 Builder.defineMacro("__hexagon__", "1");
4315
4316 if(CPU == "hexagonv1") {
4317 Builder.defineMacro("__HEXAGON_V1__");
4318 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4319 if(Opts.HexagonQdsp6Compat) {
4320 Builder.defineMacro("__QDSP6_V1__");
4321 Builder.defineMacro("__QDSP6_ARCH__", "1");
4322 }
4323 }
4324 else if(CPU == "hexagonv2") {
4325 Builder.defineMacro("__HEXAGON_V2__");
4326 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4327 if(Opts.HexagonQdsp6Compat) {
4328 Builder.defineMacro("__QDSP6_V2__");
4329 Builder.defineMacro("__QDSP6_ARCH__", "2");
4330 }
4331 }
4332 else if(CPU == "hexagonv3") {
4333 Builder.defineMacro("__HEXAGON_V3__");
4334 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4335 if(Opts.HexagonQdsp6Compat) {
4336 Builder.defineMacro("__QDSP6_V3__");
4337 Builder.defineMacro("__QDSP6_ARCH__", "3");
4338 }
4339 }
4340 else if(CPU == "hexagonv4") {
4341 Builder.defineMacro("__HEXAGON_V4__");
4342 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4343 if(Opts.HexagonQdsp6Compat) {
4344 Builder.defineMacro("__QDSP6_V4__");
4345 Builder.defineMacro("__QDSP6_ARCH__", "4");
4346 }
4347 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004348 else if(CPU == "hexagonv5") {
4349 Builder.defineMacro("__HEXAGON_V5__");
4350 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4351 if(Opts.HexagonQdsp6Compat) {
4352 Builder.defineMacro("__QDSP6_V5__");
4353 Builder.defineMacro("__QDSP6_ARCH__", "5");
4354 }
4355 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004356}
4357
4358const char * const HexagonTargetInfo::GCCRegNames[] = {
4359 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4360 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4361 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4362 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4363 "p0", "p1", "p2", "p3",
4364 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4365};
4366
4367void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4368 unsigned &NumNames) const {
4369 Names = GCCRegNames;
4370 NumNames = llvm::array_lengthof(GCCRegNames);
4371}
4372
4373
4374const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4375 { { "sp" }, "r29" },
4376 { { "fp" }, "r30" },
4377 { { "lr" }, "r31" },
4378 };
4379
4380void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4381 unsigned &NumAliases) const {
4382 Aliases = GCCRegAliases;
4383 NumAliases = llvm::array_lengthof(GCCRegAliases);
4384}
4385
4386
4387const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4388#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4389#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4390 ALL_LANGUAGES },
4391#include "clang/Basic/BuiltinsHexagon.def"
4392};
4393}
4394
4395
Chris Lattner5ba61f02006-10-14 07:39:34 +00004396namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004397// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4398class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004399 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4400 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004401 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004402public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004403 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004404
Eric Christopher3ff21b32013-10-16 21:26:26 +00004405 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004406 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004407 SoftFloat = false;
4408 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4409 if (Features[i] == "+soft-float")
4410 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004411 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004412 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004413 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004414 MacroBuilder &Builder) const {
4415 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004416 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004417
4418 if (SoftFloat)
4419 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004420 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004421
4422 virtual bool hasFeature(StringRef Feature) const {
4423 return llvm::StringSwitch<bool>(Feature)
4424 .Case("softfloat", SoftFloat)
4425 .Case("sparc", true)
4426 .Default(false);
4427 }
4428
Gabor Greif49991682008-02-21 16:29:08 +00004429 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4430 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004431 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004432 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004433 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4434 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004435 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004436 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004437 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004438 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004439 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004440 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004441 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004442 // FIXME: Implement!
4443 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004444 }
4445 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004446 // FIXME: Implement!
4447 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004448 }
4449};
4450
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004451const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004452 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4453 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4454 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4455 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4456};
4457
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004458void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4459 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004460 Names = GCCRegNames;
4461 NumNames = llvm::array_lengthof(GCCRegNames);
4462}
4463
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004464const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004465 { { "g0" }, "r0" },
4466 { { "g1" }, "r1" },
4467 { { "g2" }, "r2" },
4468 { { "g3" }, "r3" },
4469 { { "g4" }, "r4" },
4470 { { "g5" }, "r5" },
4471 { { "g6" }, "r6" },
4472 { { "g7" }, "r7" },
4473 { { "o0" }, "r8" },
4474 { { "o1" }, "r9" },
4475 { { "o2" }, "r10" },
4476 { { "o3" }, "r11" },
4477 { { "o4" }, "r12" },
4478 { { "o5" }, "r13" },
4479 { { "o6", "sp" }, "r14" },
4480 { { "o7" }, "r15" },
4481 { { "l0" }, "r16" },
4482 { { "l1" }, "r17" },
4483 { { "l2" }, "r18" },
4484 { { "l3" }, "r19" },
4485 { { "l4" }, "r20" },
4486 { { "l5" }, "r21" },
4487 { { "l6" }, "r22" },
4488 { { "l7" }, "r23" },
4489 { { "i0" }, "r24" },
4490 { { "i1" }, "r25" },
4491 { { "i2" }, "r26" },
4492 { { "i3" }, "r27" },
4493 { { "i4" }, "r28" },
4494 { { "i5" }, "r29" },
4495 { { "i6", "fp" }, "r30" },
4496 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004497};
4498
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004499void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4500 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004501 Aliases = GCCRegAliases;
4502 NumAliases = llvm::array_lengthof(GCCRegAliases);
4503}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004504
4505// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4506class SparcV8TargetInfo : public SparcTargetInfo {
4507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004508 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004509 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola2da35322013-12-16 23:27:41 +00004510 DescriptionString = "E-p:32:32-"
4511 "i64:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004512 }
4513
4514 virtual void getTargetDefines(const LangOptions &Opts,
4515 MacroBuilder &Builder) const {
4516 SparcTargetInfo::getTargetDefines(Opts, Builder);
4517 Builder.defineMacro("__sparcv8");
4518 }
4519};
4520
4521// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4522class SparcV9TargetInfo : public SparcTargetInfo {
4523public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004524 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004525 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola47debc02013-12-16 21:59:14 +00004526 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00004527 "i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004528 // This is an LP64 platform.
4529 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004530
4531 // OpenBSD uses long long for int64_t and intmax_t.
4532 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4533 IntMaxType = SignedLongLong;
4534 UIntMaxType = UnsignedLongLong;
4535 } else {
4536 IntMaxType = SignedLong;
4537 UIntMaxType = UnsignedLong;
4538 }
4539 Int64Type = IntMaxType;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004540 }
4541
4542 virtual void getTargetDefines(const LangOptions &Opts,
4543 MacroBuilder &Builder) const {
4544 SparcTargetInfo::getTargetDefines(Opts, Builder);
4545 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004546 Builder.defineMacro("__arch64__");
4547 // Solaris and its derivative AuroraUX don't need these variants, but the
4548 // BSDs do.
4549 if (getTriple().getOS() != llvm::Triple::Solaris &&
4550 getTriple().getOS() != llvm::Triple::AuroraUX) {
4551 Builder.defineMacro("__sparc64__");
4552 Builder.defineMacro("__sparc_v9__");
4553 Builder.defineMacro("__sparcv9__");
4554 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004555 }
4556};
4557
Gabor Greif49991682008-02-21 16:29:08 +00004558} // end anonymous namespace.
4559
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004560namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004561class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4562public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004563 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4564 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004565 SizeType = UnsignedInt;
4566 PtrDiffType = SignedInt;
4567 }
4568};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004569class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004570public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004571 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4572 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004573 SizeType = UnsignedInt;
4574 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004575 }
4576};
4577} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004578
Chris Lattnerb781dc792008-05-08 05:58:21 +00004579namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004580 class SystemZTargetInfo : public TargetInfo {
4581 static const char *const GCCRegNames[];
4582
4583 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004584 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004585 TLSSupported = true;
4586 IntWidth = IntAlign = 32;
4587 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4588 PointerWidth = PointerAlign = 64;
4589 LongDoubleWidth = 128;
4590 LongDoubleAlign = 64;
4591 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4592 MinGlobalAlign = 16;
Rafael Espindola04c685b2013-12-16 22:50:41 +00004593 DescriptionString = "E-i1:8:16-i8:8:16-i64:64"
4594 "-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004595 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4596 }
4597 virtual void getTargetDefines(const LangOptions &Opts,
4598 MacroBuilder &Builder) const {
4599 Builder.defineMacro("__s390__");
4600 Builder.defineMacro("__s390x__");
4601 Builder.defineMacro("__zarch__");
4602 Builder.defineMacro("__LONG_DOUBLE_128__");
4603 }
4604 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4605 unsigned &NumRecords) const {
4606 // FIXME: Implement.
4607 Records = 0;
4608 NumRecords = 0;
4609 }
4610
4611 virtual void getGCCRegNames(const char *const *&Names,
4612 unsigned &NumNames) const;
4613 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4614 unsigned &NumAliases) const {
4615 // No aliases.
4616 Aliases = 0;
4617 NumAliases = 0;
4618 }
4619 virtual bool validateAsmConstraint(const char *&Name,
4620 TargetInfo::ConstraintInfo &info) const;
4621 virtual const char *getClobbers() const {
4622 // FIXME: Is this really right?
4623 return "";
4624 }
4625 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4626 return TargetInfo::SystemZBuiltinVaList;
4627 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004628 virtual bool setCPU(const std::string &Name) {
4629 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4630 .Case("z10", true)
4631 .Case("z196", true)
4632 .Case("zEC12", true)
4633 .Default(false);
4634
4635 // No need to store the CPU yet. There aren't any CPU-specific
4636 // macros to define.
4637 return CPUKnown;
4638 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004639 };
4640
4641 const char *const SystemZTargetInfo::GCCRegNames[] = {
4642 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4643 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4644 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4645 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4646 };
4647
4648 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4649 unsigned &NumNames) const {
4650 Names = GCCRegNames;
4651 NumNames = llvm::array_lengthof(GCCRegNames);
4652 }
4653
4654 bool SystemZTargetInfo::
4655 validateAsmConstraint(const char *&Name,
4656 TargetInfo::ConstraintInfo &Info) const {
4657 switch (*Name) {
4658 default:
4659 return false;
4660
4661 case 'a': // Address register
4662 case 'd': // Data register (equivalent to 'r')
4663 case 'f': // Floating-point register
4664 Info.setAllowsRegister();
4665 return true;
4666
4667 case 'I': // Unsigned 8-bit constant
4668 case 'J': // Unsigned 12-bit constant
4669 case 'K': // Signed 16-bit constant
4670 case 'L': // Signed 20-bit displacement (on all targets we support)
4671 case 'M': // 0x7fffffff
4672 return true;
4673
4674 case 'Q': // Memory with base and unsigned 12-bit displacement
4675 case 'R': // Likewise, plus an index
4676 case 'S': // Memory with base and signed 20-bit displacement
4677 case 'T': // Likewise, plus an index
4678 Info.setAllowsMemory();
4679 return true;
4680 }
4681 }
4682}
4683
4684namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004685 class MSP430TargetInfo : public TargetInfo {
4686 static const char * const GCCRegNames[];
4687 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004688 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004689 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004690 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004691 IntWidth = 16; IntAlign = 16;
4692 LongWidth = 32; LongLongWidth = 64;
4693 LongAlign = LongLongAlign = 16;
4694 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004695 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004696 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004697 IntMaxType = SignedLongLong;
4698 UIntMaxType = UnsignedLongLong;
4699 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004700 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004701 SigAtomicType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00004702 DescriptionString = "e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004703 }
4704 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004705 MacroBuilder &Builder) const {
4706 Builder.defineMacro("MSP430");
4707 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004708 // FIXME: defines for different 'flavours' of MCU
4709 }
4710 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4711 unsigned &NumRecords) const {
4712 // FIXME: Implement.
4713 Records = 0;
4714 NumRecords = 0;
4715 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004716 virtual bool hasFeature(StringRef Feature) const {
4717 return Feature == "msp430";
4718 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004719 virtual void getGCCRegNames(const char * const *&Names,
4720 unsigned &NumNames) const;
4721 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4722 unsigned &NumAliases) const {
4723 // No aliases.
4724 Aliases = 0;
4725 NumAliases = 0;
4726 }
4727 virtual bool validateAsmConstraint(const char *&Name,
4728 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004729 // No target constraints for now.
4730 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004731 }
4732 virtual const char *getClobbers() const {
4733 // FIXME: Is this really right?
4734 return "";
4735 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004736 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004737 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004738 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004739 }
4740 };
4741
4742 const char * const MSP430TargetInfo::GCCRegNames[] = {
4743 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4744 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4745 };
4746
4747 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4748 unsigned &NumNames) const {
4749 Names = GCCRegNames;
4750 NumNames = llvm::array_lengthof(GCCRegNames);
4751 }
4752}
4753
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004754namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004755
Mike Stump11289f42009-09-09 15:08:12 +00004756 // LLVM and Clang cannot be used directly to output native binaries for
4757 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004758 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004759 //
4760 // TCE uses the llvm bitcode as input and uses it for generating customized
4761 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004762 // publicly available in http://tce.cs.tut.fi
4763
Eli Friedman1f191002011-10-07 19:51:42 +00004764 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4765 3, // opencl_global
4766 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004767 5, // opencl_constant
4768 0, // cuda_device
4769 0, // cuda_constant
4770 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004771 };
4772
Eli Friedmana9c3d712009-08-19 20:47:07 +00004773 class TCETargetInfo : public TargetInfo{
4774 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004775 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004776 TLSSupported = false;
4777 IntWidth = 32;
4778 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004779 PointerWidth = 32;
4780 IntAlign = 32;
4781 LongAlign = LongLongAlign = 32;
4782 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004783 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004784 SizeType = UnsignedInt;
4785 IntMaxType = SignedLong;
4786 UIntMaxType = UnsignedLong;
4787 IntPtrType = SignedInt;
4788 PtrDiffType = SignedInt;
4789 FloatWidth = 32;
4790 FloatAlign = 32;
4791 DoubleWidth = 32;
4792 DoubleAlign = 32;
4793 LongDoubleWidth = 32;
4794 LongDoubleAlign = 32;
4795 FloatFormat = &llvm::APFloat::IEEEsingle;
4796 DoubleFormat = &llvm::APFloat::IEEEsingle;
4797 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola2da35322013-12-16 23:27:41 +00004798 DescriptionString = "E-p:32:32-i8:8:32-"
4799 "i16:16:32-i64:32"
4800 "-f64:32-v64:32-"
4801 "v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004802 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004803 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004804 }
4805
4806 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004807 MacroBuilder &Builder) const {
4808 DefineStd(Builder, "tce", Opts);
4809 Builder.defineMacro("__TCE__");
4810 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004811 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004812 virtual bool hasFeature(StringRef Feature) const {
4813 return Feature == "tce";
4814 }
4815
Eli Friedmana9c3d712009-08-19 20:47:07 +00004816 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4817 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004818 virtual const char *getClobbers() const {
4819 return "";
4820 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004821 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4822 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004823 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004824 virtual void getGCCRegNames(const char * const *&Names,
4825 unsigned &NumNames) const {}
4826 virtual bool validateAsmConstraint(const char *&Name,
4827 TargetInfo::ConstraintInfo &info) const {
4828 return true;
4829 }
4830 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4831 unsigned &NumAliases) const {}
4832 };
4833}
4834
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004835namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004836class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004837 virtual void setDescriptionString() = 0;
4838
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004839 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004840 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004841 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004842 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004843 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004844 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004845 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004846 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004847 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004848 enum DspRevEnum {
4849 NoDSP, DSP1, DSP2
4850 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004851 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004852
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004853protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004854 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004855 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004856
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004857public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004858 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4859 const std::string &CPUStr)
4860 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004861 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004862 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004863
Eric Christopher0b26a612010-03-02 02:41:08 +00004864 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004865 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004866 virtual bool setCPU(const std::string &Name) {
4867 CPU = Name;
4868 return true;
4869 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004870 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004871 Features[ABI] = true;
4872 Features[CPU] = true;
4873 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004874
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004875 virtual void getTargetDefines(const LangOptions &Opts,
4876 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004877 DefineStd(Builder, "mips", Opts);
4878 Builder.defineMacro("_mips");
4879 Builder.defineMacro("__REGISTER_PREFIX__", "");
4880
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004881 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004882 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004883 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004884 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004885 case SoftFloat:
4886 Builder.defineMacro("__mips_soft_float", Twine(1));
4887 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004888 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004889
Simon Atanasyan16071912013-04-14 14:07:30 +00004890 if (IsSingleFloat)
4891 Builder.defineMacro("__mips_single_float", Twine(1));
4892
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004893 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4894 Builder.defineMacro("_MIPS_FPSET",
4895 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4896
Simon Atanasyan72244b62012-07-05 16:06:06 +00004897 if (IsMips16)
4898 Builder.defineMacro("__mips16", Twine(1));
4899
Simon Atanasyan60777612013-04-14 14:07:51 +00004900 if (IsMicromips)
4901 Builder.defineMacro("__mips_micromips", Twine(1));
4902
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004903 if (IsNan2008)
4904 Builder.defineMacro("__mips_nan2008", Twine(1));
4905
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004906 switch (DspRev) {
4907 default:
4908 break;
4909 case DSP1:
4910 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4911 Builder.defineMacro("__mips_dsp", Twine(1));
4912 break;
4913 case DSP2:
4914 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4915 Builder.defineMacro("__mips_dspr2", Twine(1));
4916 Builder.defineMacro("__mips_dsp", Twine(1));
4917 break;
4918 }
4919
Jack Carter44ff1e52013-08-12 17:20:29 +00004920 if (HasMSA)
4921 Builder.defineMacro("__mips_msa", Twine(1));
4922
Simon Atanasyan26f19672012-04-05 19:28:31 +00004923 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4924 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4925 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004926
4927 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4928 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004929 }
4930
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004931 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4932 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004933 Records = BuiltinInfo;
4934 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004935 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004936 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004937 return llvm::StringSwitch<bool>(Feature)
4938 .Case("mips", true)
4939 .Case("fp64", HasFP64)
4940 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004941 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004942 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4943 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004944 }
4945 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004946 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004947 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004948 // CPU register names
4949 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004950 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4951 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4952 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004953 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4954 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004955 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4956 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4957 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4958 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004959 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004960 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004961 "$fcc5","$fcc6","$fcc7",
4962 // MSA register names
4963 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4964 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4965 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4966 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4967 // MSA control register names
4968 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4969 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004970 };
4971 Names = GCCRegNames;
4972 NumNames = llvm::array_lengthof(GCCRegNames);
4973 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004974 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004975 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004976 virtual bool validateAsmConstraint(const char *&Name,
4977 TargetInfo::ConstraintInfo &Info) const {
4978 switch (*Name) {
4979 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004980 return false;
4981
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004982 case 'r': // CPU registers.
4983 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4984 case 'y': // Equivalent to "r", backwards compatibility only.
4985 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004986 case 'c': // $25 for indirect jumps
4987 case 'l': // lo register
4988 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004989 Info.setAllowsRegister();
4990 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004991 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004992 Info.setAllowsMemory();
4993 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004994 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004995 }
4996
4997 virtual const char *getClobbers() const {
4998 // FIXME: Implement!
4999 return "";
5000 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005001
Eric Christopher3ff21b32013-10-16 21:26:26 +00005002 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00005003 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005004 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005005 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005006 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005007 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005008 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005009 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005010 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005011
5012 for (std::vector<std::string>::iterator it = Features.begin(),
5013 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005014 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005015 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005016 else if (*it == "+soft-float")
5017 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005018 else if (*it == "+mips16")
5019 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005020 else if (*it == "+micromips")
5021 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005022 else if (*it == "+dsp")
5023 DspRev = std::max(DspRev, DSP1);
5024 else if (*it == "+dspr2")
5025 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005026 else if (*it == "+msa")
5027 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005028 else if (*it == "+fp64")
5029 HasFP64 = true;
5030 else if (*it == "-fp64")
5031 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005032 else if (*it == "+nan2008")
5033 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005034 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005035
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005036 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005037 std::vector<std::string>::iterator it =
5038 std::find(Features.begin(), Features.end(), "+soft-float");
5039 if (it != Features.end())
5040 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005041 it = std::find(Features.begin(), Features.end(), "+nan2008");
5042 if (it != Features.end())
5043 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005044
Akira Hatanaka9064e362013-10-29 18:30:33 +00005045 setDescriptionString();
5046
Rafael Espindolaeb265472013-08-21 21:59:03 +00005047 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005048 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005049
5050 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5051 if (RegNo == 0) return 4;
5052 if (RegNo == 1) return 5;
5053 return -1;
5054 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005055};
5056
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005057const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5058#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5059#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5060 ALL_LANGUAGES },
5061#include "clang/Basic/BuiltinsMips.def"
5062};
5063
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005064class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005065public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005066 Mips32TargetInfoBase(const llvm::Triple &Triple)
5067 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005068 SizeType = UnsignedInt;
5069 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005070 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005071 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005072 virtual bool setABI(const std::string &Name) {
5073 if ((Name == "o32") || (Name == "eabi")) {
5074 ABI = Name;
5075 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005076 } else if (Name == "32") {
5077 ABI = "o32";
5078 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005079 } else
5080 return false;
5081 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005082 virtual void getTargetDefines(const LangOptions &Opts,
5083 MacroBuilder &Builder) const {
5084 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005085
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005086 if (ABI == "o32") {
5087 Builder.defineMacro("__mips_o32");
5088 Builder.defineMacro("_ABIO32", "1");
5089 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5090 }
5091 else if (ABI == "eabi")
5092 Builder.defineMacro("__mips_eabi");
5093 else
David Blaikie83d382b2011-09-23 05:06:16 +00005094 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005095 }
5096 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5097 unsigned &NumAliases) const {
5098 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5099 { { "at" }, "$1" },
5100 { { "v0" }, "$2" },
5101 { { "v1" }, "$3" },
5102 { { "a0" }, "$4" },
5103 { { "a1" }, "$5" },
5104 { { "a2" }, "$6" },
5105 { { "a3" }, "$7" },
5106 { { "t0" }, "$8" },
5107 { { "t1" }, "$9" },
5108 { { "t2" }, "$10" },
5109 { { "t3" }, "$11" },
5110 { { "t4" }, "$12" },
5111 { { "t5" }, "$13" },
5112 { { "t6" }, "$14" },
5113 { { "t7" }, "$15" },
5114 { { "s0" }, "$16" },
5115 { { "s1" }, "$17" },
5116 { { "s2" }, "$18" },
5117 { { "s3" }, "$19" },
5118 { { "s4" }, "$20" },
5119 { { "s5" }, "$21" },
5120 { { "s6" }, "$22" },
5121 { { "s7" }, "$23" },
5122 { { "t8" }, "$24" },
5123 { { "t9" }, "$25" },
5124 { { "k0" }, "$26" },
5125 { { "k1" }, "$27" },
5126 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005127 { { "sp","$sp" }, "$29" },
5128 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005129 { { "ra" }, "$31" }
5130 };
5131 Aliases = GCCRegAliases;
5132 NumAliases = llvm::array_lengthof(GCCRegAliases);
5133 }
5134};
5135
5136class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005137 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005138 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5139 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005140 }
5141
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005142public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005143 Mips32EBTargetInfo(const llvm::Triple &Triple)
5144 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005145 }
5146 virtual void getTargetDefines(const LangOptions &Opts,
5147 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005148 DefineStd(Builder, "MIPSEB", Opts);
5149 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005150 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005151 }
5152};
5153
5154class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005155 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005156 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5157 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005158 }
5159
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005160public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005161 Mips32ELTargetInfo(const llvm::Triple &Triple)
5162 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005163 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005164 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005165 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005166 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005167 DefineStd(Builder, "MIPSEL", Opts);
5168 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005169 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005170 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005171};
Akira Hatanakabef17452011-09-20 19:21:49 +00005172
5173class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005174public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005175 Mips64TargetInfoBase(const llvm::Triple &Triple)
5176 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005177 LongWidth = LongAlign = 64;
5178 PointerWidth = PointerAlign = 64;
5179 LongDoubleWidth = LongDoubleAlign = 128;
5180 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005181 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5182 LongDoubleWidth = LongDoubleAlign = 64;
5183 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5184 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005185 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005186 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005187 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005188 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005189 if (Name == "n32") {
5190 LongWidth = LongAlign = 32;
5191 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005192 ABI = Name;
5193 return true;
5194 } else if (Name == "n64") {
5195 ABI = Name;
5196 return true;
5197 } else if (Name == "64") {
5198 ABI = "n64";
5199 return true;
5200 } else
5201 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005202 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005203 virtual void getTargetDefines(const LangOptions &Opts,
5204 MacroBuilder &Builder) const {
5205 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005206
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005207 Builder.defineMacro("__mips64");
5208 Builder.defineMacro("__mips64__");
5209
Akira Hatanakabef17452011-09-20 19:21:49 +00005210 if (ABI == "n32") {
5211 Builder.defineMacro("__mips_n32");
5212 Builder.defineMacro("_ABIN32", "2");
5213 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5214 }
5215 else if (ABI == "n64") {
5216 Builder.defineMacro("__mips_n64");
5217 Builder.defineMacro("_ABI64", "3");
5218 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5219 }
5220 else
David Blaikie83d382b2011-09-23 05:06:16 +00005221 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005222 }
5223 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5224 unsigned &NumAliases) const {
5225 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5226 { { "at" }, "$1" },
5227 { { "v0" }, "$2" },
5228 { { "v1" }, "$3" },
5229 { { "a0" }, "$4" },
5230 { { "a1" }, "$5" },
5231 { { "a2" }, "$6" },
5232 { { "a3" }, "$7" },
5233 { { "a4" }, "$8" },
5234 { { "a5" }, "$9" },
5235 { { "a6" }, "$10" },
5236 { { "a7" }, "$11" },
5237 { { "t0" }, "$12" },
5238 { { "t1" }, "$13" },
5239 { { "t2" }, "$14" },
5240 { { "t3" }, "$15" },
5241 { { "s0" }, "$16" },
5242 { { "s1" }, "$17" },
5243 { { "s2" }, "$18" },
5244 { { "s3" }, "$19" },
5245 { { "s4" }, "$20" },
5246 { { "s5" }, "$21" },
5247 { { "s6" }, "$22" },
5248 { { "s7" }, "$23" },
5249 { { "t8" }, "$24" },
5250 { { "t9" }, "$25" },
5251 { { "k0" }, "$26" },
5252 { { "k1" }, "$27" },
5253 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005254 { { "sp","$sp" }, "$29" },
5255 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005256 { { "ra" }, "$31" }
5257 };
5258 Aliases = GCCRegAliases;
5259 NumAliases = llvm::array_lengthof(GCCRegAliases);
5260 }
5261};
5262
5263class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005264 virtual void setDescriptionString() {
5265 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005266 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005267 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005268 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005269 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005270 DescriptionString = "E-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005271 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005272 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005273
Akira Hatanakabef17452011-09-20 19:21:49 +00005274 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005275
Akira Hatanakabef17452011-09-20 19:21:49 +00005276public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005277 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005278 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005279 virtual void getTargetDefines(const LangOptions &Opts,
5280 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005281 DefineStd(Builder, "MIPSEB", Opts);
5282 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005283 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005284 }
5285};
5286
5287class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005288 virtual void setDescriptionString() {
5289 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005290 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005291 "i64:64"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005292 "-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005293 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005294 DescriptionString = "e-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005295 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005296 "n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005297 }
5298public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005299 Mips64ELTargetInfo(const llvm::Triple &Triple)
5300 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005301 // Default ABI is n64.
5302 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005303 }
5304 virtual void getTargetDefines(const LangOptions &Opts,
5305 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005306 DefineStd(Builder, "MIPSEL", Opts);
5307 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005308 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005309 }
5310};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005311} // end anonymous namespace.
5312
Ivan Krasindd7403e2011-08-24 20:22:22 +00005313namespace {
5314class PNaClTargetInfo : public TargetInfo {
5315public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005316 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005317 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005318 this->UserLabelPrefix = "";
5319 this->LongAlign = 32;
5320 this->LongWidth = 32;
5321 this->PointerAlign = 32;
5322 this->PointerWidth = 32;
5323 this->IntMaxType = TargetInfo::SignedLongLong;
5324 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5325 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005326 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005327 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005328 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005329 this->SizeType = TargetInfo::UnsignedInt;
5330 this->PtrDiffType = TargetInfo::SignedInt;
5331 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005332 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005333 }
5334
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005335 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005336 }
5337 virtual void getArchDefines(const LangOptions &Opts,
5338 MacroBuilder &Builder) const {
5339 Builder.defineMacro("__le32__");
5340 Builder.defineMacro("__pnacl__");
5341 }
5342 virtual void getTargetDefines(const LangOptions &Opts,
5343 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005344 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005345 getArchDefines(Opts, Builder);
5346 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005347 virtual bool hasFeature(StringRef Feature) const {
5348 return Feature == "pnacl";
5349 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005350 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5351 unsigned &NumRecords) const {
5352 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005353 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5354 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005355 }
5356 virtual void getGCCRegNames(const char * const *&Names,
5357 unsigned &NumNames) const;
5358 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5359 unsigned &NumAliases) const;
5360 virtual bool validateAsmConstraint(const char *&Name,
5361 TargetInfo::ConstraintInfo &Info) const {
5362 return false;
5363 }
5364
5365 virtual const char *getClobbers() const {
5366 return "";
5367 }
5368};
5369
5370void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5371 unsigned &NumNames) const {
5372 Names = NULL;
5373 NumNames = 0;
5374}
5375
5376void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5377 unsigned &NumAliases) const {
5378 Aliases = NULL;
5379 NumAliases = 0;
5380}
5381} // end anonymous namespace.
5382
Guy Benyeib798fc92012-12-11 21:38:14 +00005383namespace {
5384 static const unsigned SPIRAddrSpaceMap[] = {
5385 1, // opencl_global
5386 3, // opencl_local
5387 2, // opencl_constant
5388 0, // cuda_device
5389 0, // cuda_constant
5390 0 // cuda_shared
5391 };
5392 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005393 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005394 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005395 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5396 "SPIR target must use unknown OS");
5397 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5398 "SPIR target must use unknown environment type");
5399 BigEndian = false;
5400 TLSSupported = false;
5401 LongWidth = LongAlign = 64;
5402 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005403 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005404 // Define available target features
5405 // These must be defined in sorted order!
5406 NoAsmVariants = true;
5407 }
5408 virtual void getTargetDefines(const LangOptions &Opts,
5409 MacroBuilder &Builder) const {
5410 DefineStd(Builder, "SPIR", Opts);
5411 }
5412 virtual bool hasFeature(StringRef Feature) const {
5413 return Feature == "spir";
5414 }
5415
5416 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5417 unsigned &NumRecords) const {}
5418 virtual const char *getClobbers() const {
5419 return "";
5420 }
5421 virtual void getGCCRegNames(const char * const *&Names,
5422 unsigned &NumNames) const {}
5423 virtual bool validateAsmConstraint(const char *&Name,
5424 TargetInfo::ConstraintInfo &info) const {
5425 return true;
5426 }
5427 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5428 unsigned &NumAliases) const {}
5429 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5430 return TargetInfo::VoidPtrBuiltinVaList;
5431 }
5432 };
5433
5434
5435 class SPIR32TargetInfo : public SPIRTargetInfo {
5436 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005437 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005438 PointerWidth = PointerAlign = 32;
5439 SizeType = TargetInfo::UnsignedInt;
5440 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5441 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005442 = "e-p:32:32-i64:64"
5443 "-v16:16-v24:32-v32:32-v48:64-"
5444 "v96:128-v192:256-v256:256-"
5445 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005446 }
5447 virtual void getTargetDefines(const LangOptions &Opts,
5448 MacroBuilder &Builder) const {
5449 DefineStd(Builder, "SPIR32", Opts);
5450 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005451 };
5452
5453 class SPIR64TargetInfo : public SPIRTargetInfo {
5454 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005455 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005456 PointerWidth = PointerAlign = 64;
5457 SizeType = TargetInfo::UnsignedLong;
5458 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5459 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005460 = "e-i64:64"
5461 "-v16:16-v24:32-v32:32-v48:64-"
5462 "v96:128-v192:256-v256:256-"
5463 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005464 }
5465 virtual void getTargetDefines(const LangOptions &Opts,
5466 MacroBuilder &Builder) const {
5467 DefineStd(Builder, "SPIR64", Opts);
5468 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005469 };
5470}
5471
Robert Lytton0e076492013-08-13 09:43:10 +00005472namespace {
5473class XCoreTargetInfo : public TargetInfo {
5474 static const Builtin::Info BuiltinInfo[];
5475public:
5476 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5477 BigEndian = false;
5478 NoAsmVariants = true;
5479 LongLongAlign = 32;
5480 SuitableAlign = 32;
5481 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005482 SizeType = UnsignedInt;
5483 PtrDiffType = SignedInt;
5484 IntPtrType = SignedInt;
5485 WCharType = UnsignedChar;
5486 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005487 UseZeroLengthBitfieldAlignment = true;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00005488 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005489 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005490 }
5491 virtual void getTargetDefines(const LangOptions &Opts,
5492 MacroBuilder &Builder) const {
5493 Builder.defineMacro("__XS1B__");
5494 }
5495 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5496 unsigned &NumRecords) const {
5497 Records = BuiltinInfo;
5498 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5499 }
5500 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5501 return TargetInfo::VoidPtrBuiltinVaList;
5502 }
5503 virtual const char *getClobbers() const {
5504 return "";
5505 }
5506 virtual void getGCCRegNames(const char * const *&Names,
5507 unsigned &NumNames) const {
5508 static const char * const GCCRegNames[] = {
5509 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5510 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5511 };
5512 Names = GCCRegNames;
5513 NumNames = llvm::array_lengthof(GCCRegNames);
5514 }
5515 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5516 unsigned &NumAliases) const {
5517 Aliases = NULL;
5518 NumAliases = 0;
5519 }
5520 virtual bool validateAsmConstraint(const char *&Name,
5521 TargetInfo::ConstraintInfo &Info) const {
5522 return false;
5523 }
5524};
5525
5526const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5527#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5528#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5529 ALL_LANGUAGES },
5530#include "clang/Basic/BuiltinsXCore.def"
5531};
5532} // end anonymous namespace.
5533
Ivan Krasindd7403e2011-08-24 20:22:22 +00005534
Chris Lattner5ba61f02006-10-14 07:39:34 +00005535//===----------------------------------------------------------------------===//
5536// Driver code
5537//===----------------------------------------------------------------------===//
5538
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005539static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005540 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005541
Daniel Dunbar52322032009-08-18 05:47:58 +00005542 switch (Triple.getArch()) {
5543 default:
5544 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005545
Robert Lytton0e076492013-08-13 09:43:10 +00005546 case llvm::Triple::xcore:
5547 return new XCoreTargetInfo(Triple);
5548
Tony Linthicum76329bf2011-12-12 21:14:55 +00005549 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005550 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005551
Tim Northover9bb857a2013-01-31 12:13:10 +00005552 case llvm::Triple::aarch64:
5553 switch (os) {
5554 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005555 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005556 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005557 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005558 }
5559
Daniel Dunbar52322032009-08-18 05:47:58 +00005560 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005561 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005562 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005563 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005564
Daniel Dunbar52322032009-08-18 05:47:58 +00005565 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005566 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005567 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005568 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005569 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005570 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005571 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005572 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005573 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005574 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005575 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005576 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005577 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005578 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005579 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005580 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005582 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005583
Daniel Dunbar52322032009-08-18 05:47:58 +00005584 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005585 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005586
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005587 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005588 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005589 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005590 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005591 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005592 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005593 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005594 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005595 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005596 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005597 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005598 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005599 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005600
5601 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005602 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005603 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005604 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005605 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005606 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005607 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005608 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005609 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005610 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005611 case llvm::Triple::NaCl:
5612 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005613 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005614 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005615 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005616
Akira Hatanakabef17452011-09-20 19:21:49 +00005617 case llvm::Triple::mips64:
5618 switch (os) {
5619 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005620 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005621 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005622 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005623 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005624 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005625 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005626 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005627 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005628 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005629 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005630 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005631 }
5632
5633 case llvm::Triple::mips64el:
5634 switch (os) {
5635 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005636 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005637 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005638 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005639 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005640 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005641 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005642 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005643 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005644 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005645 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005646 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005647 }
5648
Ivan Krasindd7403e2011-08-24 20:22:22 +00005649 case llvm::Triple::le32:
5650 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005651 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005652 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005653 default:
5654 return NULL;
5655 }
5656
Daniel Dunbar52322032009-08-18 05:47:58 +00005657 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005658 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005659 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005660 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005661 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005662 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005663 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005664 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005665 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005666 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005667 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005668 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005669 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005670 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005671 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005672 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005673 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005674
5675 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005676 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005678 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005679 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005680 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005681 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005682 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005683 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005684 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005685 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005686 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005687 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005688 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005689 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005690
Bill Schmidt778d3872013-07-26 01:36:11 +00005691 case llvm::Triple::ppc64le:
5692 switch (os) {
5693 case llvm::Triple::Linux:
5694 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5695 default:
5696 return new PPC64TargetInfo(Triple);
5697 }
5698
Peter Collingbournec947aae2012-05-20 23:28:41 +00005699 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005700 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005701 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005702 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005703
Eli Friedmand13b41e2012-10-12 23:32:00 +00005704 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005705 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005706
Daniel Dunbar52322032009-08-18 05:47:58 +00005707 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005708 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005709 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005710 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005711 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005713 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005714 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005715 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005716 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005717 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005718 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005719 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005720 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005721 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005722 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005723 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005724
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005725 case llvm::Triple::sparcv9:
5726 switch (os) {
5727 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005728 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005729 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005730 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005731 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005732 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005733 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005734 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005735 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005736 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005737 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005738 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005739 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005741 }
5742
Ulrich Weigand47445072013-05-06 16:26:41 +00005743 case llvm::Triple::systemz:
5744 switch (os) {
5745 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005746 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005747 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005749 }
5750
Eli Friedmana9c3d712009-08-19 20:47:07 +00005751 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005752 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005753
Daniel Dunbar52322032009-08-18 05:47:58 +00005754 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005755 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005756 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005757
Daniel Dunbar52322032009-08-18 05:47:58 +00005758 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005759 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005760 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005761 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005762 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005763 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005764 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005765 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005766 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005767 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005768 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005769 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005770 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005771 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005772 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005773 case llvm::Triple::KFreeBSD:
5774 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005775 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005776 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005777 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005778 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005779 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005780 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005781 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005782 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005783 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005784 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005785 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005787 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005789 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005790 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005791 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005793 }
5794
5795 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005796 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005797 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005798
Daniel Dunbar52322032009-08-18 05:47:58 +00005799 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005800 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005801 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005802 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005804 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005806 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005807 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005808 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005809 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005810 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005811 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005812 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005813 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005814 case llvm::Triple::KFreeBSD:
5815 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005816 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005817 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005818 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005819 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005820 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005821 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005822 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005824 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005825 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005826 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005827
5828 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005829 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005830 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005831 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005832 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005833 }
5834 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005835 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005836 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005837 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005838 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005839 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005840 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005841}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005842
5843/// CreateTargetInfo - Return the target info object for the specified target
5844/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005845TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005846 TargetOptions *Opts) {
5847 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005848
5849 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005850 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005851 if (!Target) {
5852 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5853 return 0;
5854 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005855 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005856
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005857 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005858 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5859 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005860 return 0;
5861 }
5862
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005863 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005864 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5865 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005866 return 0;
5867 }
5868
Charles Davis95a546e2010-06-11 01:06:47 +00005869 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005870 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5871 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005872 return 0;
5873 }
5874
Rafael Espindolaeb265472013-08-21 21:59:03 +00005875 // Set the fp math unit.
5876 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5877 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5878 return 0;
5879 }
5880
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005881 // Compute the default target features, we need the target to handle this
5882 // because features may have dependencies on one another.
5883 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005884 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005885
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005886 // Apply the user specified deltas.
5887 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5888 I < N; ++I) {
5889 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005890 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005891 bool Enabled = Name[0] == '+';
5892 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005893 }
5894
5895 // Add the features to the compile options.
5896 //
5897 // FIXME: If we are completely confident that we have the right set, we only
5898 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005899 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005900 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5901 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005902 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005903 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005904 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005905
5906 return Target.take();
5907}