blob: a7f261f35bfb053f177fd0d80c1a2ee0644bc932 [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 Espindola9ec8d082013-12-19 16:54:10 +00001434 "-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
Rafael Espindola2da35322013-12-16 23:27:41 +00001435 "-i64:64"
1436 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1437 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001438 "-n32:64";
1439
Eli Friedmand13b41e2012-10-12 23:32:00 +00001440class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001441 /// \brief The GPU profiles supported by the R600 target.
1442 enum GPUKind {
1443 GK_NONE,
1444 GK_R600,
1445 GK_R600_DOUBLE_OPS,
1446 GK_R700,
1447 GK_R700_DOUBLE_OPS,
1448 GK_EVERGREEN,
1449 GK_EVERGREEN_DOUBLE_OPS,
1450 GK_NORTHERN_ISLANDS,
1451 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001452 GK_SOUTHERN_ISLANDS,
1453 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001454 } GPU;
1455
Eli Friedmand13b41e2012-10-12 23:32:00 +00001456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001457 R600TargetInfo(const llvm::Triple &Triple)
1458 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001459 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001460 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001461 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001462 }
1463
1464 virtual const char * getClobbers() const {
1465 return "";
1466 }
1467
1468 virtual void getGCCRegNames(const char * const *&Names,
1469 unsigned &numNames) const {
1470 Names = NULL;
1471 numNames = 0;
1472 }
1473
1474 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1475 unsigned &NumAliases) const {
1476 Aliases = NULL;
1477 NumAliases = 0;
1478 }
1479
1480 virtual bool validateAsmConstraint(const char *&Name,
1481 TargetInfo::ConstraintInfo &info) const {
1482 return true;
1483 }
1484
1485 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1486 unsigned &NumRecords) const {
1487 Records = NULL;
1488 NumRecords = 0;
1489 }
1490
1491
1492 virtual void getTargetDefines(const LangOptions &Opts,
1493 MacroBuilder &Builder) const {
1494 Builder.defineMacro("__R600__");
1495 }
1496
1497 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1498 return TargetInfo::CharPtrBuiltinVaList;
1499 }
1500
Tom Stellardc74b1e02013-03-04 17:40:53 +00001501 virtual bool setCPU(const std::string &Name) {
1502 GPU = llvm::StringSwitch<GPUKind>(Name)
1503 .Case("r600" , GK_R600)
1504 .Case("rv610", GK_R600)
1505 .Case("rv620", GK_R600)
1506 .Case("rv630", GK_R600)
1507 .Case("rv635", GK_R600)
1508 .Case("rs780", GK_R600)
1509 .Case("rs880", GK_R600)
1510 .Case("rv670", GK_R600_DOUBLE_OPS)
1511 .Case("rv710", GK_R700)
1512 .Case("rv730", GK_R700)
1513 .Case("rv740", GK_R700_DOUBLE_OPS)
1514 .Case("rv770", GK_R700_DOUBLE_OPS)
1515 .Case("palm", GK_EVERGREEN)
1516 .Case("cedar", GK_EVERGREEN)
1517 .Case("sumo", GK_EVERGREEN)
1518 .Case("sumo2", GK_EVERGREEN)
1519 .Case("redwood", GK_EVERGREEN)
1520 .Case("juniper", GK_EVERGREEN)
1521 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1522 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1523 .Case("barts", GK_NORTHERN_ISLANDS)
1524 .Case("turks", GK_NORTHERN_ISLANDS)
1525 .Case("caicos", GK_NORTHERN_ISLANDS)
1526 .Case("cayman", GK_CAYMAN)
1527 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001528 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001529 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1530 .Case("verde", GK_SOUTHERN_ISLANDS)
1531 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001532 .Case("bonaire", GK_SEA_ISLANDS)
1533 .Case("kabini", GK_SEA_ISLANDS)
1534 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001535 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001536 .Default(GK_NONE);
1537
1538 if (GPU == GK_NONE) {
1539 return false;
1540 }
1541
1542 // Set the correct data layout
1543 switch (GPU) {
1544 case GK_NONE:
1545 case GK_R600:
1546 case GK_R700:
1547 case GK_EVERGREEN:
1548 case GK_NORTHERN_ISLANDS:
1549 DescriptionString = DescriptionStringR600;
1550 break;
1551 case GK_R600_DOUBLE_OPS:
1552 case GK_R700_DOUBLE_OPS:
1553 case GK_EVERGREEN_DOUBLE_OPS:
1554 case GK_CAYMAN:
1555 DescriptionString = DescriptionStringR600DoubleOps;
1556 break;
1557 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001558 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001559 DescriptionString = DescriptionStringSI;
1560 break;
1561 }
1562
1563 return true;
1564 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001565};
1566
1567} // end anonymous namespace
1568
1569namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001570// Namespace for x86 abstract base class
1571const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001572#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001573#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001574 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001575#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001576};
Eli Friedmanb5366062008-05-20 14:21:01 +00001577
Nuno Lopescfca1f02009-12-23 17:49:57 +00001578static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001579 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1580 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001581 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001582 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1583 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1584 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001585 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001586 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1587 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001588};
1589
Eric Christophercdd36352011-06-21 00:05:20 +00001590const TargetInfo::AddlRegName AddlRegNames[] = {
1591 { { "al", "ah", "eax", "rax" }, 0 },
1592 { { "bl", "bh", "ebx", "rbx" }, 3 },
1593 { { "cl", "ch", "ecx", "rcx" }, 2 },
1594 { { "dl", "dh", "edx", "rdx" }, 1 },
1595 { { "esi", "rsi" }, 4 },
1596 { { "edi", "rdi" }, 5 },
1597 { { "esp", "rsp" }, 7 },
1598 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001599};
1600
1601// X86 target abstract base class; x86-32 and x86-64 are very close, so
1602// most of the implementation can be shared.
1603class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001604 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001605 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001606 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001607 enum MMX3DNowEnum {
1608 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1609 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001610 enum XOPEnum {
1611 NoXOP,
1612 SSE4A,
1613 FMA4,
1614 XOP
1615 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001616
Eric Christophere1ddaf92010-04-02 23:50:19 +00001617 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001618 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001619 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001620 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001621 bool HasBMI;
1622 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001623 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001624 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001625 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001626 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001627 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001628 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001629 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001630 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001631 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001632 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001633
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001634 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1635 ///
1636 /// Each enumeration represents a particular CPU supported by Clang. These
1637 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1638 enum CPUKind {
1639 CK_Generic,
1640
1641 /// \name i386
1642 /// i386-generation processors.
1643 //@{
1644 CK_i386,
1645 //@}
1646
1647 /// \name i486
1648 /// i486-generation processors.
1649 //@{
1650 CK_i486,
1651 CK_WinChipC6,
1652 CK_WinChip2,
1653 CK_C3,
1654 //@}
1655
1656 /// \name i586
1657 /// i586-generation processors, P5 microarchitecture based.
1658 //@{
1659 CK_i586,
1660 CK_Pentium,
1661 CK_PentiumMMX,
1662 //@}
1663
1664 /// \name i686
1665 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1666 //@{
1667 CK_i686,
1668 CK_PentiumPro,
1669 CK_Pentium2,
1670 CK_Pentium3,
1671 CK_Pentium3M,
1672 CK_PentiumM,
1673 CK_C3_2,
1674
1675 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1676 /// Clang however has some logic to suport this.
1677 // FIXME: Warn, deprecate, and potentially remove this.
1678 CK_Yonah,
1679 //@}
1680
1681 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001682 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001683 //@{
1684 CK_Pentium4,
1685 CK_Pentium4M,
1686 CK_Prescott,
1687 CK_Nocona,
1688 //@}
1689
1690 /// \name Core
1691 /// Core microarchitecture based processors.
1692 //@{
1693 CK_Core2,
1694
1695 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1696 /// codename which GCC no longer accepts as an option to -march, but Clang
1697 /// has some logic for recognizing it.
1698 // FIXME: Warn, deprecate, and potentially remove this.
1699 CK_Penryn,
1700 //@}
1701
1702 /// \name Atom
1703 /// Atom processors
1704 //@{
1705 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001706 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001707 //@}
1708
1709 /// \name Nehalem
1710 /// Nehalem microarchitecture based processors.
1711 //@{
1712 CK_Corei7,
1713 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001714 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001715 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001716 //@}
1717
Craig Topper449314e2013-08-20 07:09:39 +00001718 /// \name Knights Landing
1719 /// Knights Landing processor.
1720 CK_KNL,
1721
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001722 /// \name K6
1723 /// K6 architecture processors.
1724 //@{
1725 CK_K6,
1726 CK_K6_2,
1727 CK_K6_3,
1728 //@}
1729
1730 /// \name K7
1731 /// K7 architecture processors.
1732 //@{
1733 CK_Athlon,
1734 CK_AthlonThunderbird,
1735 CK_Athlon4,
1736 CK_AthlonXP,
1737 CK_AthlonMP,
1738 //@}
1739
1740 /// \name K8
1741 /// K8 architecture processors.
1742 //@{
1743 CK_Athlon64,
1744 CK_Athlon64SSE3,
1745 CK_AthlonFX,
1746 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001747 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001748 CK_Opteron,
1749 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001750 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001751 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001752
Benjamin Kramer569f2152012-01-10 11:50:18 +00001753 /// \name Bobcat
1754 /// Bobcat architecture processors.
1755 //@{
1756 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001757 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001758 //@}
1759
1760 /// \name Bulldozer
1761 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001762 //@{
1763 CK_BDVER1,
1764 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001765 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001766 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001767
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001768 /// This specification is deprecated and will be removed in the future.
1769 /// Users should prefer \see CK_K8.
1770 // FIXME: Warn on this when the CPU is set to it.
1771 CK_x86_64,
1772 //@}
1773
1774 /// \name Geode
1775 /// Geode processors.
1776 //@{
1777 CK_Geode
1778 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001779 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001780
Rafael Espindolaeb265472013-08-21 21:59:03 +00001781 enum FPMathKind {
1782 FP_Default,
1783 FP_SSE,
1784 FP_387
1785 } FPMath;
1786
Eli Friedman3fd920a2008-08-20 02:34:37 +00001787public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001788 X86TargetInfo(const llvm::Triple &Triple)
1789 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001790 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1791 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001792 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1793 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001794 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1795 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001796 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001797 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001798 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001799 virtual unsigned getFloatEvalMethod() const {
1800 // X87 evaluates with 80 bits "long double" precision.
1801 return SSELevel == NoSSE ? 2 : 0;
1802 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001803 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1804 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001805 Records = BuiltinInfo;
1806 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001807 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001808 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001809 unsigned &NumNames) const {
1810 Names = GCCRegNames;
1811 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001812 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001813 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001814 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001815 Aliases = 0;
1816 NumAliases = 0;
1817 }
1818 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001819 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001820 Names = AddlRegNames;
1821 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001822 }
Anders Carlsson58436352009-02-28 17:11:49 +00001823 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001824 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001825 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001826 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001827 return "~{dirflag},~{fpsr},~{flags}";
1828 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001829 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001830 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001831 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1832 bool Enabled);
1833 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1834 bool Enabled);
1835 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1836 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001837 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001838 StringRef Name, bool Enabled) const {
1839 setFeatureEnabledImpl(Features, Name, Enabled);
1840 }
1841 // This exists purely to cut down on the number of virtual calls in
1842 // getDefaultFeatures which calls this repeatedly.
1843 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1844 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001845 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001846 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001847 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001848 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001849 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001850 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001851 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001852 else if (getTriple().getArch() == llvm::Triple::x86 &&
1853 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001854 return "no-mmx";
1855 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001856 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001857 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001858 CPU = llvm::StringSwitch<CPUKind>(Name)
1859 .Case("i386", CK_i386)
1860 .Case("i486", CK_i486)
1861 .Case("winchip-c6", CK_WinChipC6)
1862 .Case("winchip2", CK_WinChip2)
1863 .Case("c3", CK_C3)
1864 .Case("i586", CK_i586)
1865 .Case("pentium", CK_Pentium)
1866 .Case("pentium-mmx", CK_PentiumMMX)
1867 .Case("i686", CK_i686)
1868 .Case("pentiumpro", CK_PentiumPro)
1869 .Case("pentium2", CK_Pentium2)
1870 .Case("pentium3", CK_Pentium3)
1871 .Case("pentium3m", CK_Pentium3M)
1872 .Case("pentium-m", CK_PentiumM)
1873 .Case("c3-2", CK_C3_2)
1874 .Case("yonah", CK_Yonah)
1875 .Case("pentium4", CK_Pentium4)
1876 .Case("pentium4m", CK_Pentium4M)
1877 .Case("prescott", CK_Prescott)
1878 .Case("nocona", CK_Nocona)
1879 .Case("core2", CK_Core2)
1880 .Case("penryn", CK_Penryn)
1881 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001882 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001883 .Case("corei7", CK_Corei7)
1884 .Case("corei7-avx", CK_Corei7AVX)
1885 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001886 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001887 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001888 .Case("k6", CK_K6)
1889 .Case("k6-2", CK_K6_2)
1890 .Case("k6-3", CK_K6_3)
1891 .Case("athlon", CK_Athlon)
1892 .Case("athlon-tbird", CK_AthlonThunderbird)
1893 .Case("athlon-4", CK_Athlon4)
1894 .Case("athlon-xp", CK_AthlonXP)
1895 .Case("athlon-mp", CK_AthlonMP)
1896 .Case("athlon64", CK_Athlon64)
1897 .Case("athlon64-sse3", CK_Athlon64SSE3)
1898 .Case("athlon-fx", CK_AthlonFX)
1899 .Case("k8", CK_K8)
1900 .Case("k8-sse3", CK_K8SSE3)
1901 .Case("opteron", CK_Opteron)
1902 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001903 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001904 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001905 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001906 .Case("bdver1", CK_BDVER1)
1907 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001908 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001909 .Case("x86-64", CK_x86_64)
1910 .Case("geode", CK_Geode)
1911 .Default(CK_Generic);
1912
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001913 // Perform any per-CPU checks necessary to determine if this CPU is
1914 // acceptable.
1915 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1916 // invalid without explaining *why*.
1917 switch (CPU) {
1918 case CK_Generic:
1919 // No processor selected!
1920 return false;
1921
1922 case CK_i386:
1923 case CK_i486:
1924 case CK_WinChipC6:
1925 case CK_WinChip2:
1926 case CK_C3:
1927 case CK_i586:
1928 case CK_Pentium:
1929 case CK_PentiumMMX:
1930 case CK_i686:
1931 case CK_PentiumPro:
1932 case CK_Pentium2:
1933 case CK_Pentium3:
1934 case CK_Pentium3M:
1935 case CK_PentiumM:
1936 case CK_Yonah:
1937 case CK_C3_2:
1938 case CK_Pentium4:
1939 case CK_Pentium4M:
1940 case CK_Prescott:
1941 case CK_K6:
1942 case CK_K6_2:
1943 case CK_K6_3:
1944 case CK_Athlon:
1945 case CK_AthlonThunderbird:
1946 case CK_Athlon4:
1947 case CK_AthlonXP:
1948 case CK_AthlonMP:
1949 case CK_Geode:
1950 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001951 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001952 return false;
1953
1954 // Fallthrough
1955 case CK_Nocona:
1956 case CK_Core2:
1957 case CK_Penryn:
1958 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001959 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001960 case CK_Corei7:
1961 case CK_Corei7AVX:
1962 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001963 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001964 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001965 case CK_Athlon64:
1966 case CK_Athlon64SSE3:
1967 case CK_AthlonFX:
1968 case CK_K8:
1969 case CK_K8SSE3:
1970 case CK_Opteron:
1971 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001972 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001973 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001974 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001975 case CK_BDVER1:
1976 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001977 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001978 case CK_x86_64:
1979 return true;
1980 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001981 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001982 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001983
Rafael Espindolaeb265472013-08-21 21:59:03 +00001984 virtual bool setFPMath(StringRef Name);
1985
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001986 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1987 // We accept all non-ARM calling conventions
1988 return (CC == CC_X86ThisCall ||
1989 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001990 CC == CC_X86StdCall ||
1991 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001992 CC == CC_X86Pascal ||
1993 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001994 }
1995
Aaron Ballman02df2e02012-12-09 17:45:41 +00001996 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1997 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001998 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001999};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002000
Rafael Espindolaeb265472013-08-21 21:59:03 +00002001bool X86TargetInfo::setFPMath(StringRef Name) {
2002 if (Name == "387") {
2003 FPMath = FP_387;
2004 return true;
2005 }
2006 if (Name == "sse") {
2007 FPMath = FP_SSE;
2008 return true;
2009 }
2010 return false;
2011}
2012
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002013void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002014 // FIXME: This *really* should not be here.
2015
2016 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002017 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002018 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002019
Chandler Carruth212334f2011-09-28 08:55:37 +00002020 switch (CPU) {
2021 case CK_Generic:
2022 case CK_i386:
2023 case CK_i486:
2024 case CK_i586:
2025 case CK_Pentium:
2026 case CK_i686:
2027 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002028 break;
2029 case CK_PentiumMMX:
2030 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002031 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002032 break;
2033 case CK_Pentium3:
2034 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002035 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002036 break;
2037 case CK_PentiumM:
2038 case CK_Pentium4:
2039 case CK_Pentium4M:
2040 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002041 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002042 break;
2043 case CK_Yonah:
2044 case CK_Prescott:
2045 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002046 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002047 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002048 break;
2049 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002050 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002051 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002052 break;
2053 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002055 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002056 break;
2057 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002059 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002061 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002062 setFeatureEnabledImpl(Features, "sse4.2", true);
2063 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002064 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002065 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002066 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002067 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002069 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002070 break;
2071 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002072 setFeatureEnabledImpl(Features, "avx", true);
2073 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002074 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002075 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002076 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002077 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002078 setFeatureEnabledImpl(Features, "avx", true);
2079 setFeatureEnabledImpl(Features, "aes", true);
2080 setFeatureEnabledImpl(Features, "pclmul", true);
2081 setFeatureEnabledImpl(Features, "rdrnd", true);
2082 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002083 break;
Craig Topper865fff52011-12-17 19:55:21 +00002084 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002085 setFeatureEnabledImpl(Features, "avx2", true);
2086 setFeatureEnabledImpl(Features, "aes", true);
2087 setFeatureEnabledImpl(Features, "pclmul", true);
2088 setFeatureEnabledImpl(Features, "lzcnt", true);
2089 setFeatureEnabledImpl(Features, "rdrnd", true);
2090 setFeatureEnabledImpl(Features, "f16c", true);
2091 setFeatureEnabledImpl(Features, "bmi", true);
2092 setFeatureEnabledImpl(Features, "bmi2", true);
2093 setFeatureEnabledImpl(Features, "rtm", true);
2094 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002095 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002096 break;
Craig Topper449314e2013-08-20 07:09:39 +00002097 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002098 setFeatureEnabledImpl(Features, "avx512f", true);
2099 setFeatureEnabledImpl(Features, "avx512cd", true);
2100 setFeatureEnabledImpl(Features, "avx512er", true);
2101 setFeatureEnabledImpl(Features, "avx512pf", true);
2102 setFeatureEnabledImpl(Features, "aes", true);
2103 setFeatureEnabledImpl(Features, "pclmul", true);
2104 setFeatureEnabledImpl(Features, "lzcnt", true);
2105 setFeatureEnabledImpl(Features, "rdrnd", true);
2106 setFeatureEnabledImpl(Features, "f16c", true);
2107 setFeatureEnabledImpl(Features, "bmi", true);
2108 setFeatureEnabledImpl(Features, "bmi2", true);
2109 setFeatureEnabledImpl(Features, "rtm", true);
2110 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002111 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002112 case CK_K6:
2113 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 break;
2116 case CK_K6_2:
2117 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002118 case CK_WinChip2:
2119 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002122 case CK_Athlon:
2123 case CK_AthlonThunderbird:
2124 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002125 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002126 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002127 case CK_Athlon4:
2128 case CK_AthlonXP:
2129 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "sse", true);
2131 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002132 break;
2133 case CK_K8:
2134 case CK_Opteron:
2135 case CK_Athlon64:
2136 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "sse2", true);
2138 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002139 break;
2140 case CK_K8SSE3:
2141 case CK_OpteronSSE3:
2142 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "sse3", true);
2144 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002145 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002146 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002147 setFeatureEnabledImpl(Features, "sse3", true);
2148 setFeatureEnabledImpl(Features, "sse4a", true);
2149 setFeatureEnabledImpl(Features, "3dnowa", true);
2150 setFeatureEnabledImpl(Features, "lzcnt", true);
2151 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002152 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002153 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002154 setFeatureEnabledImpl(Features, "ssse3", true);
2155 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002156 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "lzcnt", true);
2158 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002159 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002160 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002161 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "avx", true);
2163 setFeatureEnabledImpl(Features, "sse4a", true);
2164 setFeatureEnabledImpl(Features, "lzcnt", true);
2165 setFeatureEnabledImpl(Features, "aes", true);
2166 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002167 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002168 setFeatureEnabledImpl(Features, "bmi", true);
2169 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002170 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002171 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002172 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "xop", true);
2174 setFeatureEnabledImpl(Features, "lzcnt", true);
2175 setFeatureEnabledImpl(Features, "aes", true);
2176 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002177 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002179 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002180 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002181 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002182 setFeatureEnabledImpl(Features, "xop", true);
2183 setFeatureEnabledImpl(Features, "lzcnt", true);
2184 setFeatureEnabledImpl(Features, "aes", true);
2185 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002186 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "bmi", true);
2188 setFeatureEnabledImpl(Features, "fma", true);
2189 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002190 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002191 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002192 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002193 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002194 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002195 break;
Eli Friedman33465822011-07-08 23:31:17 +00002196 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002197}
2198
Rafael Espindolae62e2792013-08-20 13:44:29 +00002199void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002200 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002201 if (Enabled) {
2202 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002203 case AVX512F:
2204 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002205 case AVX2:
2206 Features["avx2"] = true;
2207 case AVX:
2208 Features["avx"] = true;
2209 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002210 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002211 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002212 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002213 case SSSE3:
2214 Features["ssse3"] = true;
2215 case SSE3:
2216 Features["sse3"] = true;
2217 case SSE2:
2218 Features["sse2"] = true;
2219 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002220 Features["sse"] = true;
2221 case NoSSE:
2222 break;
2223 }
2224 return;
2225 }
2226
2227 switch (Level) {
2228 case NoSSE:
2229 case SSE1:
2230 Features["sse"] = false;
2231 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002232 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2233 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002234 case SSE3:
2235 Features["sse3"] = false;
2236 setXOPLevel(Features, NoXOP, false);
2237 case SSSE3:
2238 Features["ssse3"] = false;
2239 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002240 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002241 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002242 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002243 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002244 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002245 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246 case AVX2:
2247 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002248 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002249 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2250 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002251 }
2252}
2253
2254void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002255 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002256 if (Enabled) {
2257 switch (Level) {
2258 case AMD3DNowAthlon:
2259 Features["3dnowa"] = true;
2260 case AMD3DNow:
2261 Features["3dnow"] = true;
2262 case MMX:
2263 Features["mmx"] = true;
2264 case NoMMX3DNow:
2265 break;
2266 }
2267 return;
2268 }
2269
2270 switch (Level) {
2271 case NoMMX3DNow:
2272 case MMX:
2273 Features["mmx"] = false;
2274 case AMD3DNow:
2275 Features["3dnow"] = false;
2276 case AMD3DNowAthlon:
2277 Features["3dnowa"] = false;
2278 }
2279}
2280
2281void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002282 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002283 if (Enabled) {
2284 switch (Level) {
2285 case XOP:
2286 Features["xop"] = true;
2287 case FMA4:
2288 Features["fma4"] = true;
2289 setSSELevel(Features, AVX, true);
2290 case SSE4A:
2291 Features["sse4a"] = true;
2292 setSSELevel(Features, SSE3, true);
2293 case NoXOP:
2294 break;
2295 }
2296 return;
2297 }
2298
2299 switch (Level) {
2300 case NoXOP:
2301 case SSE4A:
2302 Features["sse4a"] = false;
2303 case FMA4:
2304 Features["fma4"] = false;
2305 case XOP:
2306 Features["xop"] = false;
2307 }
2308}
2309
Craig Topper86d79ef2013-09-17 04:51:29 +00002310void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2311 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002312 // FIXME: This *really* should not be here. We need some way of translating
2313 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002314 if (Name == "sse4")
2315 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002316
Rafael Espindolae62e2792013-08-20 13:44:29 +00002317 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002318
Craig Topper29561122013-09-19 01:13:07 +00002319 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002320 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002321 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002323 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002324 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002325 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002327 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002328 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002329 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002331 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002332 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002333 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002334 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002335 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002337 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002338 if (Enabled)
2339 setSSELevel(Features, SSE2, Enabled);
2340 } else if (Name == "pclmul") {
2341 if (Enabled)
2342 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002343 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002344 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002345 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002346 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002347 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002348 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002349 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002350 if (Enabled)
2351 setSSELevel(Features, AVX512F, Enabled);
2352 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002353 if (Enabled)
2354 setSSELevel(Features, AVX, Enabled);
2355 } else if (Name == "fma4") {
2356 setXOPLevel(Features, FMA4, Enabled);
2357 } else if (Name == "xop") {
2358 setXOPLevel(Features, XOP, Enabled);
2359 } else if (Name == "sse4a") {
2360 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002361 } else if (Name == "f16c") {
2362 if (Enabled)
2363 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002364 } else if (Name == "sha") {
2365 if (Enabled)
2366 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002367 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002368}
2369
Eric Christopher3ff21b32013-10-16 21:26:26 +00002370/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002371/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002372bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002373 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002374 // Remember the maximum enabled sselevel.
2375 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2376 // Ignore disabled features.
2377 if (Features[i][0] == '-')
2378 continue;
2379
Benjamin Kramer27402c62012-03-05 15:10:44 +00002380 StringRef Feature = StringRef(Features[i]).substr(1);
2381
2382 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002383 HasAES = true;
2384 continue;
2385 }
2386
Craig Topper3f122a72012-05-31 05:18:48 +00002387 if (Feature == "pclmul") {
2388 HasPCLMUL = true;
2389 continue;
2390 }
2391
Benjamin Kramer27402c62012-03-05 15:10:44 +00002392 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002393 HasLZCNT = true;
2394 continue;
2395 }
2396
Rafael Espindola89049822013-08-23 20:21:37 +00002397 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002398 HasRDRND = true;
2399 continue;
2400 }
2401
Benjamin Kramer27402c62012-03-05 15:10:44 +00002402 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002403 HasBMI = true;
2404 continue;
2405 }
2406
Benjamin Kramer27402c62012-03-05 15:10:44 +00002407 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002408 HasBMI2 = true;
2409 continue;
2410 }
2411
Benjamin Kramer27402c62012-03-05 15:10:44 +00002412 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002413 HasPOPCNT = true;
2414 continue;
2415 }
2416
Michael Liao625a8752012-11-10 05:17:46 +00002417 if (Feature == "rtm") {
2418 HasRTM = true;
2419 continue;
2420 }
2421
Michael Liao74f4eaf2013-03-26 17:52:08 +00002422 if (Feature == "prfchw") {
2423 HasPRFCHW = true;
2424 continue;
2425 }
2426
Michael Liaoffaae352013-03-29 05:17:55 +00002427 if (Feature == "rdseed") {
2428 HasRDSEED = true;
2429 continue;
2430 }
2431
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002432 if (Feature == "tbm") {
2433 HasTBM = true;
2434 continue;
2435 }
2436
Craig Topperbba778b2012-06-03 21:46:30 +00002437 if (Feature == "fma") {
2438 HasFMA = true;
2439 continue;
2440 }
2441
Manman Rena45358c2012-10-11 00:59:55 +00002442 if (Feature == "f16c") {
2443 HasF16C = true;
2444 continue;
2445 }
2446
Craig Topper679b53a2013-08-21 05:29:10 +00002447 if (Feature == "avx512cd") {
2448 HasAVX512CD = true;
2449 continue;
2450 }
2451
2452 if (Feature == "avx512er") {
2453 HasAVX512ER = true;
2454 continue;
2455 }
2456
2457 if (Feature == "avx512pf") {
2458 HasAVX512PF = true;
2459 continue;
2460 }
2461
Ben Langmuir58078d02013-09-19 13:22:04 +00002462 if (Feature == "sha") {
2463 HasSHA = true;
2464 continue;
2465 }
2466
Nick Lewycky50e8f482013-10-05 20:14:27 +00002467 if (Feature == "cx16") {
2468 HasCX16 = true;
2469 continue;
2470 }
2471
Daniel Dunbar979586e2009-11-11 09:38:56 +00002472 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002473 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002474 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002475 .Case("avx2", AVX2)
2476 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002477 .Case("sse4.2", SSE42)
2478 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002479 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002480 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002481 .Case("sse2", SSE2)
2482 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002483 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002484 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002485
Eli Friedman33465822011-07-08 23:31:17 +00002486 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002487 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002488 .Case("3dnowa", AMD3DNowAthlon)
2489 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002490 .Case("mmx", MMX)
2491 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002492 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002493
2494 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2495 .Case("xop", XOP)
2496 .Case("fma4", FMA4)
2497 .Case("sse4a", SSE4A)
2498 .Default(NoXOP);
2499 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002500 }
Eli Friedman33465822011-07-08 23:31:17 +00002501
Craig Topper7481d8a2013-09-10 06:55:47 +00002502 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2503 // Can't do this earlier because we need to be able to explicitly enable
2504 // popcnt and still disable sse4.2.
2505 if (!HasPOPCNT && SSELevel >= SSE42 &&
2506 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2507 HasPOPCNT = true;
2508 Features.push_back("+popcnt");
2509 }
2510
Yunzhong Gao61089362013-10-16 19:07:02 +00002511 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2512 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2513 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2514 HasPRFCHW = true;
2515 Features.push_back("+prfchw");
2516 }
2517
Rafael Espindolaeb265472013-08-21 21:59:03 +00002518 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2519 // matches the selected sse level.
2520 if (FPMath == FP_SSE && SSELevel < SSE1) {
2521 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2522 return false;
2523 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2524 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2525 return false;
2526 }
2527
Eli Friedman33465822011-07-08 23:31:17 +00002528 // Don't tell the backend if we're turning off mmx; it will end up disabling
2529 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002530 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2531 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002532 std::vector<std::string>::iterator it;
2533 it = std::find(Features.begin(), Features.end(), "-mmx");
2534 if (it != Features.end())
2535 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002536 else if (SSELevel > NoSSE)
2537 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002538 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002539}
Chris Lattnerecd49032009-03-02 22:27:17 +00002540
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002541/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2542/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002543void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002544 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002545 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002546 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002547 Builder.defineMacro("__amd64__");
2548 Builder.defineMacro("__amd64");
2549 Builder.defineMacro("__x86_64");
2550 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002551 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002552 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002553 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002554
Chris Lattnerecd49032009-03-02 22:27:17 +00002555 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002556 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2557 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 switch (CPU) {
2559 case CK_Generic:
2560 break;
2561 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002562 // The rest are coming from the i386 define above.
2563 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002564 break;
2565 case CK_i486:
2566 case CK_WinChipC6:
2567 case CK_WinChip2:
2568 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002569 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002570 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002571 case CK_PentiumMMX:
2572 Builder.defineMacro("__pentium_mmx__");
2573 Builder.defineMacro("__tune_pentium_mmx__");
2574 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002575 case CK_i586:
2576 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002577 defineCPUMacros(Builder, "i586");
2578 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002579 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 case CK_Pentium3:
2581 case CK_Pentium3M:
2582 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002583 Builder.defineMacro("__tune_pentium3__");
2584 // Fallthrough
2585 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002586 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002587 Builder.defineMacro("__tune_pentium2__");
2588 // Fallthrough
2589 case CK_PentiumPro:
2590 Builder.defineMacro("__tune_i686__");
2591 Builder.defineMacro("__tune_pentiumpro__");
2592 // Fallthrough
2593 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002594 Builder.defineMacro("__i686");
2595 Builder.defineMacro("__i686__");
2596 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2597 Builder.defineMacro("__pentiumpro");
2598 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002599 break;
2600 case CK_Pentium4:
2601 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002602 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002603 break;
2604 case CK_Yonah:
2605 case CK_Prescott:
2606 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002607 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_Core2:
2610 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002611 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002612 break;
2613 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002614 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002616 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002617 defineCPUMacros(Builder, "slm");
2618 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002619 case CK_Corei7:
2620 case CK_Corei7AVX:
2621 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002622 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002623 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
Craig Topper449314e2013-08-20 07:09:39 +00002625 case CK_KNL:
2626 defineCPUMacros(Builder, "knl");
2627 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002629 Builder.defineMacro("__k6_2__");
2630 Builder.defineMacro("__tune_k6_2__");
2631 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002633 if (CPU != CK_K6_2) { // In case of fallthrough
2634 // FIXME: GCC may be enabling these in cases where some other k6
2635 // architecture is specified but -m3dnow is explicitly provided. The
2636 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002637 Builder.defineMacro("__k6_3__");
2638 Builder.defineMacro("__tune_k6_3__");
2639 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002640 // Fallthrough
2641 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002642 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002643 break;
2644 case CK_Athlon:
2645 case CK_AthlonThunderbird:
2646 case CK_Athlon4:
2647 case CK_AthlonXP:
2648 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002649 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002650 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002651 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002652 Builder.defineMacro("__tune_athlon_sse__");
2653 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
2655 case CK_K8:
2656 case CK_K8SSE3:
2657 case CK_x86_64:
2658 case CK_Opteron:
2659 case CK_OpteronSSE3:
2660 case CK_Athlon64:
2661 case CK_Athlon64SSE3:
2662 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002663 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002664 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002665 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002666 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002667 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002668 case CK_BTVER1:
2669 defineCPUMacros(Builder, "btver1");
2670 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002671 case CK_BTVER2:
2672 defineCPUMacros(Builder, "btver2");
2673 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002674 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002675 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002676 break;
2677 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002678 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002679 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002680 case CK_BDVER3:
2681 defineCPUMacros(Builder, "bdver3");
2682 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002683 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002684 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002685 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002686 }
Chris Lattner96e43572009-03-02 22:40:39 +00002687
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002688 // Target properties.
2689 Builder.defineMacro("__LITTLE_ENDIAN__");
2690 Builder.defineMacro("__REGISTER_PREFIX__", "");
2691
Chris Lattner6df41af2009-04-19 17:32:33 +00002692 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2693 // functions in glibc header files that use FP Stack inline asm which the
2694 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002695 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002696
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002697 if (HasAES)
2698 Builder.defineMacro("__AES__");
2699
Craig Topper3f122a72012-05-31 05:18:48 +00002700 if (HasPCLMUL)
2701 Builder.defineMacro("__PCLMUL__");
2702
Craig Topper22967d42011-12-25 05:06:45 +00002703 if (HasLZCNT)
2704 Builder.defineMacro("__LZCNT__");
2705
Benjamin Kramer1e250392012-07-07 09:39:18 +00002706 if (HasRDRND)
2707 Builder.defineMacro("__RDRND__");
2708
Craig Topper22967d42011-12-25 05:06:45 +00002709 if (HasBMI)
2710 Builder.defineMacro("__BMI__");
2711
2712 if (HasBMI2)
2713 Builder.defineMacro("__BMI2__");
2714
Craig Topper1de83482011-12-29 16:10:46 +00002715 if (HasPOPCNT)
2716 Builder.defineMacro("__POPCNT__");
2717
Michael Liao625a8752012-11-10 05:17:46 +00002718 if (HasRTM)
2719 Builder.defineMacro("__RTM__");
2720
Michael Liao74f4eaf2013-03-26 17:52:08 +00002721 if (HasPRFCHW)
2722 Builder.defineMacro("__PRFCHW__");
2723
Michael Liaoffaae352013-03-29 05:17:55 +00002724 if (HasRDSEED)
2725 Builder.defineMacro("__RDSEED__");
2726
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002727 if (HasTBM)
2728 Builder.defineMacro("__TBM__");
2729
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730 switch (XOPLevel) {
2731 case XOP:
2732 Builder.defineMacro("__XOP__");
2733 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002734 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002735 case SSE4A:
2736 Builder.defineMacro("__SSE4A__");
2737 case NoXOP:
2738 break;
2739 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002740
Craig Topperbba778b2012-06-03 21:46:30 +00002741 if (HasFMA)
2742 Builder.defineMacro("__FMA__");
2743
Manman Rena45358c2012-10-11 00:59:55 +00002744 if (HasF16C)
2745 Builder.defineMacro("__F16C__");
2746
Craig Topper679b53a2013-08-21 05:29:10 +00002747 if (HasAVX512CD)
2748 Builder.defineMacro("__AVX512CD__");
2749 if (HasAVX512ER)
2750 Builder.defineMacro("__AVX512ER__");
2751 if (HasAVX512PF)
2752 Builder.defineMacro("__AVX512PF__");
2753
Ben Langmuir58078d02013-09-19 13:22:04 +00002754 if (HasSHA)
2755 Builder.defineMacro("__SHA__");
2756
Nick Lewycky50e8f482013-10-05 20:14:27 +00002757 if (HasCX16)
2758 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2759
Chris Lattner96e43572009-03-02 22:40:39 +00002760 // Each case falls through to the previous one here.
2761 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002762 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002763 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002764 case AVX2:
2765 Builder.defineMacro("__AVX2__");
2766 case AVX:
2767 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002768 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002769 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002770 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002771 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002772 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002773 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002774 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002775 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002776 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 Builder.defineMacro("__SSE2__");
2778 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002779 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002780 Builder.defineMacro("__SSE__");
2781 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002782 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002783 break;
2784 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002785
Derek Schuffc7dd7222012-10-11 15:52:22 +00002786 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002787 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002788 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002789 case AVX2:
2790 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002791 case SSE42:
2792 case SSE41:
2793 case SSSE3:
2794 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002795 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002796 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002797 break;
2798 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002799 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002800 break;
2801 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002802 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002803 }
2804 }
2805
Anders Carlssone437c682010-01-27 03:47:49 +00002806 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002807 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002808 case AMD3DNowAthlon:
2809 Builder.defineMacro("__3dNOW_A__");
2810 case AMD3DNow:
2811 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002812 case MMX:
2813 Builder.defineMacro("__MMX__");
2814 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002815 break;
2816 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002817
2818 if (CPU >= CK_i486) {
2819 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2820 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2821 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2822 }
2823 if (CPU >= CK_i586)
2824 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002825}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002826
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002827bool X86TargetInfo::hasFeature(StringRef Feature) const {
2828 return llvm::StringSwitch<bool>(Feature)
2829 .Case("aes", HasAES)
2830 .Case("avx", SSELevel >= AVX)
2831 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002832 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002833 .Case("avx512cd", HasAVX512CD)
2834 .Case("avx512er", HasAVX512ER)
2835 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002836 .Case("bmi", HasBMI)
2837 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002838 .Case("cx16", HasCX16)
2839 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002840 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002842 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002843 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002844 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002845 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2846 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2847 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002848 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002849 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002850 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002851 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002852 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002853 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002854 .Case("sse", SSELevel >= SSE1)
2855 .Case("sse2", SSELevel >= SSE2)
2856 .Case("sse3", SSELevel >= SSE3)
2857 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002858 .Case("sse4.1", SSELevel >= SSE41)
2859 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002860 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002861 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002862 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2863 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002865 .Default(false);
2866}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002867
Eli Friedman3fd920a2008-08-20 02:34:37 +00002868bool
Anders Carlsson58436352009-02-28 17:11:49 +00002869X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002870 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002871 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002872 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002873 case 'Y': // first letter of a pair:
2874 switch (*(Name+1)) {
2875 default: return false;
2876 case '0': // First SSE register.
2877 case 't': // Any SSE register, when SSE2 is enabled.
2878 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2879 case 'm': // any MMX register, when inter-unit moves enabled.
2880 break; // falls through to setAllowsRegister.
2881 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002882 case 'a': // eax.
2883 case 'b': // ebx.
2884 case 'c': // ecx.
2885 case 'd': // edx.
2886 case 'S': // esi.
2887 case 'D': // edi.
2888 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002889 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002890 case 't': // top of floating point stack.
2891 case 'u': // second from top of floating point stack.
2892 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002893 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002894 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002895 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002896 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2897 case 'l': // "Index" registers: any general register that can be used as an
2898 // index in a base+index memory access.
2899 Info.setAllowsRegister();
2900 return true;
2901 case 'C': // SSE floating point constant.
2902 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002903 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002904 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002905 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002906 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002907 return true;
2908 }
2909}
2910
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002911
Eli Friedman3fd920a2008-08-20 02:34:37 +00002912std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002913X86TargetInfo::convertConstraint(const char *&Constraint) const {
2914 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002915 case 'a': return std::string("{ax}");
2916 case 'b': return std::string("{bx}");
2917 case 'c': return std::string("{cx}");
2918 case 'd': return std::string("{dx}");
2919 case 'S': return std::string("{si}");
2920 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002921 case 'p': // address
2922 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002923 case 't': // top of floating point stack.
2924 return std::string("{st}");
2925 case 'u': // second from top of floating point stack.
2926 return std::string("{st(1)}"); // second from top of floating point stack.
2927 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002928 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002929 }
2930}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002931} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002932
2933namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002934// X86-32 generic target
2935class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002936public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002937 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002938 DoubleAlign = LongLongAlign = 32;
2939 LongDoubleWidth = 96;
2940 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002941 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00002942 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00002943 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00002944 "f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002945 SizeType = UnsignedInt;
2946 PtrDiffType = SignedInt;
2947 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002948 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002949
2950 // Use fpret for all types.
2951 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2952 (1 << TargetInfo::Double) |
2953 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002954
2955 // x86-32 has atomics up to 8 bytes
2956 // FIXME: Check that we actually have cmpxchg8b before setting
2957 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2958 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002959 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002960 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2961 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002962 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002963
Chris Lattnerd545ad12009-09-23 06:06:36 +00002964 int getEHDataRegisterNumber(unsigned RegNo) const {
2965 if (RegNo == 0) return 0;
2966 if (RegNo == 1) return 2;
2967 return -1;
2968 }
Bill Wendling887b4852012-11-12 06:42:51 +00002969 virtual bool validateInputSize(StringRef Constraint,
2970 unsigned Size) const {
2971 switch (Constraint[0]) {
2972 default: break;
2973 case 'a':
2974 case 'b':
2975 case 'c':
2976 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002977 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002978 }
2979
2980 return true;
2981 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002982};
2983} // end anonymous namespace
2984
2985namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002986class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2987public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002988 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2989 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002990
2991 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002992 unsigned Major, Minor, Micro;
2993 getTriple().getOSVersion(Major, Minor, Micro);
2994 // New NetBSD uses the default rounding mode.
2995 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2996 return X86_32TargetInfo::getFloatEvalMethod();
2997 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002998 return 1;
2999 }
3000};
3001} // end anonymous namespace
3002
3003namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003004class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3005public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003006 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3007 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003008 SizeType = UnsignedLong;
3009 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003010 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003011 }
3012};
3013} // end anonymous namespace
3014
3015namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003016class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3017public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003018 BitrigI386TargetInfo(const llvm::Triple &Triple)
3019 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003020 SizeType = UnsignedLong;
3021 IntPtrType = SignedLong;
3022 PtrDiffType = SignedLong;
3023 }
3024};
3025} // end anonymous namespace
3026
3027namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003028class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003030 DarwinI386TargetInfo(const llvm::Triple &Triple)
3031 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003032 LongDoubleWidth = 128;
3033 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003034 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003035 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003036 SizeType = UnsignedLong;
3037 IntPtrType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00003038 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003039 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003040 "f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003041 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003042 }
3043
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003045} // end anonymous namespace
3046
3047namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003048// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003049class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003051 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3052 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003053 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003054 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003055 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003056 DescriptionString = "e-p:32:32-"
3057 "i64:64-"
3058 "f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003059 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003060 virtual void getTargetDefines(const LangOptions &Opts,
3061 MacroBuilder &Builder) const {
3062 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3063 }
3064};
3065} // end anonymous namespace
3066
3067namespace {
3068
3069// x86-32 Windows Visual Studio target
3070class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3071public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003072 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3073 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003074 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003075 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3076 }
3077 virtual void getTargetDefines(const LangOptions &Opts,
3078 MacroBuilder &Builder) const {
3079 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3080 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3081 // The value of the following reflects processor type.
3082 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3083 // We lost the original triple, so we use the default.
3084 Builder.defineMacro("_M_IX86", "600");
3085 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003086};
3087} // end anonymous namespace
3088
3089namespace {
3090// x86-32 MinGW target
3091class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3092public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003093 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3094 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003095 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003096 MacroBuilder &Builder) const {
3097 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003098 DefineStd(Builder, "WIN32", Opts);
3099 DefineStd(Builder, "WINNT", Opts);
3100 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003101 Builder.defineMacro("__MSVCRT__");
3102 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003103
3104 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3105 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003106 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003107 // Provide "as-is" __declspec.
3108 Builder.defineMacro("__declspec", "__declspec");
3109 else
3110 // Provide alias of __attribute__ like mingw32-gcc.
3111 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003112 }
3113};
3114} // end anonymous namespace
3115
3116namespace {
3117// x86-32 Cygwin target
3118class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3119public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003120 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3121 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003122 TLSSupported = false;
3123 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003124 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003125 DescriptionString = "e-p:32:32-"
3126 "i64:64-"
3127 "f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003128 }
3129 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003130 MacroBuilder &Builder) const {
3131 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003132 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003133 Builder.defineMacro("__CYGWIN__");
3134 Builder.defineMacro("__CYGWIN32__");
3135 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003136 if (Opts.CPlusPlus)
3137 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003138 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003139};
3140} // end anonymous namespace
3141
3142namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003143// x86-32 Haiku target
3144class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3145public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003146 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003147 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003148 IntPtrType = SignedLong;
3149 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003150 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003151 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003152 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003153 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003154 virtual void getTargetDefines(const LangOptions &Opts,
3155 MacroBuilder &Builder) const {
3156 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3157 Builder.defineMacro("__INTEL__");
3158 Builder.defineMacro("__HAIKU__");
3159 }
3160};
3161} // end anonymous namespace
3162
Douglas Gregor9fabd852011-07-01 22:41:14 +00003163// RTEMS Target
3164template<typename Target>
3165class RTEMSTargetInfo : public OSTargetInfo<Target> {
3166protected:
3167 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3168 MacroBuilder &Builder) const {
3169 // RTEMS defines; list based off of gcc output
3170
Douglas Gregor9fabd852011-07-01 22:41:14 +00003171 Builder.defineMacro("__rtems__");
3172 Builder.defineMacro("__ELF__");
3173 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003174
Douglas Gregor9fabd852011-07-01 22:41:14 +00003175public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003176 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3177 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003178
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003179 switch (Triple.getArch()) {
3180 default:
3181 case llvm::Triple::x86:
3182 // this->MCountName = ".mcount";
3183 break;
3184 case llvm::Triple::mips:
3185 case llvm::Triple::mipsel:
3186 case llvm::Triple::ppc:
3187 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003188 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003189 // this->MCountName = "_mcount";
3190 break;
3191 case llvm::Triple::arm:
3192 // this->MCountName = "__mcount";
3193 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003194 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003195 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003196};
3197
3198namespace {
3199// x86-32 RTEMS target
3200class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3201public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003202 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003203 SizeType = UnsignedLong;
3204 IntPtrType = SignedLong;
3205 PtrDiffType = SignedLong;
3206 this->UserLabelPrefix = "";
3207 }
3208 virtual void getTargetDefines(const LangOptions &Opts,
3209 MacroBuilder &Builder) const {
3210 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3211 Builder.defineMacro("__INTEL__");
3212 Builder.defineMacro("__rtems__");
3213 }
3214};
3215} // end anonymous namespace
3216
Chris Lattnerb986aba2010-04-11 19:29:39 +00003217namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003218// x86-64 generic target
3219class X86_64TargetInfo : public X86TargetInfo {
3220public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003221 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003222 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003223 LongDoubleWidth = 128;
3224 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003225 LargeArrayMinWidth = 128;
3226 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003227 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003228 IntMaxType = SignedLong;
3229 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003230 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003231 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003232
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00003233 DescriptionString = "e-i64:64-f80:128-s:64-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003234
3235 // Use fpret only for long double.
3236 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003237
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003238 // Use fp2ret for _Complex long double.
3239 ComplexLongDoubleUsesFP2Ret = true;
3240
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003241 // x86-64 has atomics up to 16 bytes.
3242 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3243 // on CPUs with cmpxchg16b
3244 MaxAtomicPromoteWidth = 128;
3245 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003246 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003247 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3248 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003249 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003250
Chris Lattnerd545ad12009-09-23 06:06:36 +00003251 int getEHDataRegisterNumber(unsigned RegNo) const {
3252 if (RegNo == 0) return 0;
3253 if (RegNo == 1) return 1;
3254 return -1;
3255 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003256
3257 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003258 return (CC == CC_C ||
3259 CC == CC_IntelOclBicc ||
3260 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003261 }
3262
Aaron Ballman02df2e02012-12-09 17:45:41 +00003263 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3264 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003265 }
3266
Eli Friedman3fd920a2008-08-20 02:34:37 +00003267};
3268} // end anonymous namespace
3269
3270namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003271// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003272class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003274 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3275 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003276 TLSSupported = false;
3277 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003278 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003279 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003280 IntMaxType = SignedLongLong;
3281 UIntMaxType = UnsignedLongLong;
3282 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003283 SizeType = UnsignedLongLong;
3284 PtrDiffType = SignedLongLong;
3285 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003286 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003287 }
3288 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003289 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003290 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003291 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003292 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003293 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3294 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003295 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003296 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3297 return (CC == CC_C ||
3298 CC == CC_IntelOclBicc ||
3299 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3300 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003301};
3302} // end anonymous namespace
3303
3304namespace {
3305// x86-64 Windows Visual Studio target
3306class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3307public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003308 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3309 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003310 LongDoubleWidth = LongDoubleAlign = 64;
3311 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003312 }
3313 virtual void getTargetDefines(const LangOptions &Opts,
3314 MacroBuilder &Builder) const {
3315 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3316 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003317 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003318 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003319 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003320};
3321} // end anonymous namespace
3322
3323namespace {
3324// x86-64 MinGW target
3325class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003327 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3328 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003329 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003330 MacroBuilder &Builder) const {
3331 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003332 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003333 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003334 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003335 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003336
3337 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3338 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003339 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003340 // Provide "as-is" __declspec.
3341 Builder.defineMacro("__declspec", "__declspec");
3342 else
3343 // Provide alias of __attribute__ like mingw32-gcc.
3344 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003345 }
3346};
3347} // end anonymous namespace
3348
3349namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003350class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3351public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003352 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3353 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003354 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003355 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003356 }
3357};
3358} // end anonymous namespace
3359
3360namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003361class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3364 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003365 IntMaxType = SignedLongLong;
3366 UIntMaxType = UnsignedLongLong;
3367 Int64Type = SignedLongLong;
3368 }
3369};
3370} // end anonymous namespace
3371
3372namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003373class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003375 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3376 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3377 IntMaxType = SignedLongLong;
3378 UIntMaxType = UnsignedLongLong;
3379 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003380 }
3381};
Tim Northover9bb857a2013-01-31 12:13:10 +00003382}
3383
3384namespace {
3385class AArch64TargetInfo : public TargetInfo {
3386 static const char * const GCCRegNames[];
3387 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003388
Tim Northover2fe823a2013-08-01 09:23:19 +00003389 enum FPUModeEnum {
3390 FPUMode,
3391 NeonMode
3392 };
3393
3394 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003395 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003396 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003397
Tim Northover9bb857a2013-01-31 12:13:10 +00003398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003399 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003400 BigEndian = false;
3401 LongWidth = LongAlign = 64;
3402 LongDoubleWidth = LongDoubleAlign = 128;
3403 PointerWidth = PointerAlign = 64;
3404 SuitableAlign = 128;
Rafael Espindolac2e60f52013-12-17 23:30:58 +00003405 DescriptionString = "e-i64:64-i128:128-s:32-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003406
3407 WCharType = UnsignedInt;
3408 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3409
Tim Northover847d2d42013-02-18 12:11:32 +00003410 // AArch64 backend supports 64-bit operations at the moment. In principle
3411 // 128-bit is possible if register-pairs are used.
3412 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3413
Tim Northover9bb857a2013-01-31 12:13:10 +00003414 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3415 }
3416 virtual void getTargetDefines(const LangOptions &Opts,
3417 MacroBuilder &Builder) const {
3418 // GCC defines theses currently
3419 Builder.defineMacro("__aarch64__");
3420 Builder.defineMacro("__AARCH64EL__");
3421
3422 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003423 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003424 Builder.defineMacro("__ARM_ARCH", "8");
3425 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003426
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003427 Builder.defineMacro("__ARM_64BIT_STATE");
3428 Builder.defineMacro("__ARM_PCS_AAPCS64");
3429 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3430
Tim Northoverb85654d2013-04-05 14:08:55 +00003431 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3432 Builder.defineMacro("__ARM_FEATURE_CLZ");
3433 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003434 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003435
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003436 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003437
3438 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003439 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003440
3441 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003442 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3443 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003444
3445 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003446 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003447
3448 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003449 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003450
Tim Northoverb85654d2013-04-05 14:08:55 +00003451 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003452 Opts.ShortWChar ? "2" : "4");
3453
Tim Northoverb85654d2013-04-05 14:08:55 +00003454 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003455 Opts.ShortEnums ? "1" : "4");
3456
3457 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003458 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3459
3460 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003461 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003462 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003463 Builder.defineMacro("__ARM_NEON_FP", "7");
3464 }
3465
3466 if (Crypto) {
3467 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003468 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003469 }
3470 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3471 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003472 Records = BuiltinInfo;
3473 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003474 }
3475 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003476 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003477 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003478
Amara Emerson703da2e2013-10-31 09:32:33 +00003479 virtual bool setCPU(const std::string &Name) {
3480 return llvm::StringSwitch<bool>(Name)
3481 .Case("generic", true)
3482 .Cases("cortex-a53", "cortex-a57", true)
3483 .Default(false);
3484 }
3485
Eric Christopher3ff21b32013-10-16 21:26:26 +00003486 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003487 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003488 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003489 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003490 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3491 if (Features[i] == "+neon")
3492 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003493 if (Features[i] == "+crypto")
3494 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003495 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003496 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003497 }
3498
3499 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003500 unsigned &NumNames) const;
3501 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3502 unsigned &NumAliases) const;
3503
3504 virtual bool isCLZForZeroUndef() const { return false; }
3505
3506 virtual bool validateAsmConstraint(const char *&Name,
3507 TargetInfo::ConstraintInfo &Info) const {
3508 switch (*Name) {
3509 default: return false;
3510 case 'w': // An FP/SIMD vector register
3511 Info.setAllowsRegister();
3512 return true;
3513 case 'I': // Constant that can be used with an ADD instruction
3514 case 'J': // Constant that can be used with a SUB instruction
3515 case 'K': // Constant that can be used with a 32-bit logical instruction
3516 case 'L': // Constant that can be used with a 64-bit logical instruction
3517 case 'M': // Constant that can be used as a 32-bit MOV immediate
3518 case 'N': // Constant that can be used as a 64-bit MOV immediate
3519 case 'Y': // Floating point constant zero
3520 case 'Z': // Integer constant zero
3521 return true;
3522 case 'Q': // A memory reference with base register and no offset
3523 Info.setAllowsMemory();
3524 return true;
3525 case 'S': // A symbolic address
3526 Info.setAllowsRegister();
3527 return true;
3528 case 'U':
3529 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3530 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3531 // Usa: An absolute symbolic address
3532 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3533 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3534 }
3535 }
3536
3537 virtual const char *getClobbers() const {
3538 // There are no AArch64 clobbers shared by all asm statements.
3539 return "";
3540 }
3541
3542 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3543 return TargetInfo::AArch64ABIBuiltinVaList;
3544 }
3545};
3546
3547const char * const AArch64TargetInfo::GCCRegNames[] = {
3548 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3549 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3550 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3551 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3552
3553 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3554 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3555 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3556 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3557
3558 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3559 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3560 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3561 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3562
3563 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3564 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3565 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3566 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3567
3568 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3569 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3570 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3571 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3572
3573 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3574 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3575 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3576 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3577
3578 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3579 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3580 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3581 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3582};
3583
3584void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3585 unsigned &NumNames) const {
3586 Names = GCCRegNames;
3587 NumNames = llvm::array_lengthof(GCCRegNames);
3588}
3589
3590const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3591 { { "x16" }, "ip0"},
3592 { { "x17" }, "ip1"},
3593 { { "x29" }, "fp" },
3594 { { "x30" }, "lr" }
3595};
3596
3597void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3598 unsigned &NumAliases) const {
3599 Aliases = GCCRegAliases;
3600 NumAliases = llvm::array_lengthof(GCCRegAliases);
3601
3602}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003603
3604const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3605#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3606#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3607 ALL_LANGUAGES },
3608#include "clang/Basic/BuiltinsAArch64.def"
3609};
3610
Eli Friedman9fa28852012-08-08 23:57:20 +00003611} // end anonymous namespace
3612
3613namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003614class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003615 // Possible FPU choices.
3616 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003617 VFP2FPU = (1 << 0),
3618 VFP3FPU = (1 << 1),
3619 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003620 NeonFPU = (1 << 3),
3621 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003622 };
3623
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003624 // Possible HWDiv features.
3625 enum HWDivMode {
3626 HWDivThumb = (1 << 0),
3627 HWDivARM = (1 << 1)
3628 };
3629
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003630 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003631 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003632 }
3633
3634 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3635 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003636
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003637 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003638
Rafael Espindolaeb265472013-08-21 21:59:03 +00003639 enum {
3640 FP_Default,
3641 FP_VFP,
3642 FP_Neon
3643 } FPMath;
3644
Bernard Ogdenda13af32013-10-24 18:32:51 +00003645 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003646
Logan Chien57086ce2012-10-10 06:56:20 +00003647 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003648 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003649 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003650
3651 // Initialized via features.
3652 unsigned SoftFloat : 1;
3653 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003654
Bernard Ogden18b57012013-10-29 09:47:51 +00003655 unsigned CRC : 1;
3656
Chris Lattner5cc15e02010-03-03 19:03:45 +00003657 static const Builtin::Info BuiltinInfo[];
3658
Rafael Espindola101d5b92013-05-13 20:09:47 +00003659 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3660 // On linux, binaries targeting old cpus call functions in libgcc to
3661 // perform atomic operations. The implementation in libgcc then calls into
3662 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3663 // is that if we assume the kernel is at least as recent as the hardware,
3664 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003665 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003666 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003667 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003668 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003669 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003670 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003671 if (T.getArch() == llvm::Triple::arm) {
3672 if (!ArchName.startswith("armv"))
3673 return false;
3674 StringRef VersionStr = ArchName.substr(4);
3675 unsigned Version;
3676 if (VersionStr.getAsInteger(10, Version))
3677 return false;
3678 return Version >= 6;
3679 }
3680 assert(T.getArch() == llvm::Triple::thumb);
3681 if (!ArchName.startswith("thumbv"))
3682 return false;
3683 StringRef VersionStr = ArchName.substr(6);
3684 unsigned Version;
3685 if (VersionStr.getAsInteger(10, Version))
3686 return false;
3687 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003688 }
3689
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003690 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003691 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003692
3693 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3694
3695 // size_t is unsigned long on Darwin and netbsd.
3696 if (getTriple().isOSDarwin() || getTriple().getOS() == llvm::Triple::NetBSD)
3697 SizeType = UnsignedLong;
3698 else
3699 SizeType = UnsignedInt;
3700
3701 if (getTriple().getOS() == llvm::Triple::NetBSD) {
3702 WCharType = SignedInt;
3703 } else {
3704 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3705 WCharType = UnsignedInt;
3706 }
3707
3708 UseBitFieldTypeAlignment = true;
3709
3710 ZeroLengthBitfieldBoundary = 0;
3711
3712 if (IsThumb) {
3713 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3714 // so set preferred for small types to 32.
3715 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3716 "v128:64:128-a:0:32-n32-S64");
3717 } else {
3718 DescriptionString = ("e-p:32:32-i64:64-v128:64:128-n32-S64");
3719 }
3720
3721 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003722 }
3723
3724 void setABIAPCS() {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003725 IsAAPCS = false;
3726
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003727 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003728
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003729 // size_t is unsigned int on FreeBSD.
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003730 if (getTriple().getOS() == llvm::Triple::FreeBSD)
3731 SizeType = UnsignedInt;
3732 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003733 SizeType = UnsignedLong;
3734
3735 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3736 WCharType = SignedInt;
3737
3738 // Do not respect the alignment of bit-field types when laying out
3739 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3740 UseBitFieldTypeAlignment = false;
3741
3742 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3743 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3744 /// gcc.
3745 ZeroLengthBitfieldBoundary = 32;
3746
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003747 if (IsThumb) {
3748 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3749 // so set preferred for small types to 32.
3750 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3751 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3752 } else {
3753 DescriptionString =
3754 "e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3755 }
3756
3757 // FIXME: Override "preferred align" for double and long long.
3758 }
3759
Chris Lattner17df24e2008-04-21 18:56:49 +00003760public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003761 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003762 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3763 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003764 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003765 switch (getTriple().getOS()) {
3766 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003767 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003768 break;
3769 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003770 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003771 break;
3772 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003773
Chris Lattner1a8f3942010-04-23 16:29:58 +00003774 // {} in inline assembly are neon specifiers, not assembly variant
3775 // specifiers.
3776 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003777
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003778 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003779 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003780
3781 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003782
3783 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003784 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003785
3786 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003787 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003788 if (shouldUseInlineAtomic(getTriple()))
3789 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003790
3791 // Do force alignment of members that follow zero length bitfields. If
3792 // the alignment of the zero-length bitfield is greater than the member
3793 // that follows it, `bar', `bar' will be aligned as the type of the
3794 // zero length bitfield.
3795 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003796 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003797 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003798 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003799 ABI = Name;
3800
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003801 // The defaults (above) are for AAPCS, check if we need to change them.
3802 //
3803 // FIXME: We need support for -meabi... we could just mangle it into the
3804 // name.
3805 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003806 setABIAPCS();
3807 return true;
3808 }
3809 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3810 setABIAAPCS();
3811 return true;
3812 }
3813 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003814 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003815
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003816 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003817 if (IsAAPCS)
3818 Features["aapcs"] = true;
3819 else
3820 Features["apcs"] = true;
3821
Silviu Barangae5690462013-10-21 10:59:33 +00003822 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003823 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3824 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003825 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3826 CPU == "cortex-a9-mp") {
3827 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003828 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003829 }
3830 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003831 Features["vfp4"] = true;
3832 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003833 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3834 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3835 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003836 Features["vfp4"] = true;
3837 Features["neon"] = true;
3838 Features["hwdiv"] = true;
3839 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003840 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3841 Features["fp-armv8"] = true;
3842 Features["neon"] = true;
3843 Features["hwdiv"] = true;
3844 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003845 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003846 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003847 CPU == "cortex-m4" ||
3848 // Enable the hwdiv extension for all v8a AArch32 cores by
3849 // default.
3850 ArchName == "armv8a" || ArchName == "armv8" ||
3851 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3852 Features["hwdiv"] = true;
3853 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003854 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003855 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003856
Eric Christopher3ff21b32013-10-16 21:26:26 +00003857 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003858 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003859 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003860 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003861 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003862 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003863 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3864 if (Features[i] == "+soft-float")
3865 SoftFloat = true;
3866 else if (Features[i] == "+soft-float-abi")
3867 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003868 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003869 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003870 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003871 FPU |= VFP3FPU;
3872 else if (Features[i] == "+vfp4")
3873 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003874 else if (Features[i] == "+fp-armv8")
3875 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003876 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003877 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003878 else if (Features[i] == "+hwdiv")
3879 HWDiv |= HWDivThumb;
3880 else if (Features[i] == "+hwdiv-arm")
3881 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003882 else if (Features[i] == "+crc")
3883 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003884 }
3885
Rafael Espindolaeb265472013-08-21 21:59:03 +00003886 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3887 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3888 return false;
3889 }
3890
3891 if (FPMath == FP_Neon)
3892 Features.push_back("+neonfp");
3893 else if (FPMath == FP_VFP)
3894 Features.push_back("-neonfp");
3895
Daniel Dunbar893d4752009-12-19 04:15:38 +00003896 // Remove front-end specific options which the backend handles differently.
3897 std::vector<std::string>::iterator it;
3898 it = std::find(Features.begin(), Features.end(), "+soft-float");
3899 if (it != Features.end())
3900 Features.erase(it);
3901 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3902 if (it != Features.end())
3903 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003904 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003905 }
3906
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003907 virtual bool hasFeature(StringRef Feature) const {
3908 return llvm::StringSwitch<bool>(Feature)
3909 .Case("arm", true)
3910 .Case("softfloat", SoftFloat)
3911 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003912 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003913 .Case("hwdiv", HWDiv & HWDivThumb)
3914 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003915 .Default(false);
3916 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003917 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003918 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003919 return llvm::StringSwitch<const char*>(Name)
3920 .Cases("arm8", "arm810", "4")
3921 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3922 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3923 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3924 .Case("ep9312", "4T")
3925 .Cases("arm10tdmi", "arm1020t", "5T")
3926 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3927 .Case("arm926ej-s", "5TEJ")
3928 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3929 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003930 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003931 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003932 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003933 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003934 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003935 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003936 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003937 .Case("cortex-a9-mp", "7F")
3938 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003939 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003940 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003941 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003942 .Default(0);
3943 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003944 static const char *getCPUProfile(StringRef Name) {
3945 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003946 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003947 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003948 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003949 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003950 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003951 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003952 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003953 virtual bool setCPU(const std::string &Name) {
3954 if (!getCPUDefineSuffix(Name))
3955 return false;
3956
3957 CPU = Name;
3958 return true;
3959 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003960 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003961 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003962 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003963 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003964 Builder.defineMacro("__arm");
3965 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003966
Chris Lattnerecd49032009-03-02 22:27:17 +00003967 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003968 Builder.defineMacro("__ARMEL__");
3969 Builder.defineMacro("__LITTLE_ENDIAN__");
3970 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003971
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003972 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003973 unsigned int CPUArchVer;
3974 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3975 llvm_unreachable("Invalid char for architecture version number");
3976 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003977 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003978 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3979 StringRef CPUProfile = getCPUProfile(CPU);
3980 if (!CPUProfile.empty())
3981 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3982
Mike Stump9d54bd72009-04-08 02:07:04 +00003983 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003984
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003985 // FIXME: It's more complicated than this and we don't really support
3986 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003987 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003988 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003989
David Tweed8f676532012-10-25 13:33:01 +00003990 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003991 // Embedded targets on Darwin follow AAPCS, but not EABI.
3992 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003993 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003994 Builder.defineMacro("__ARM_PCS", "1");
3995
David Tweed8f676532012-10-25 13:33:01 +00003996 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003997 Builder.defineMacro("__ARM_PCS_VFP", "1");
3998 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003999
Daniel Dunbar893d4752009-12-19 04:15:38 +00004000 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004001 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004002
4003 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004004 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004005
4006 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004007 Builder.defineMacro("__THUMBEL__");
4008 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004009 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004010 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004011 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004012 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4013 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004014
4015 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004016 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004017
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004018 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004019 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004020 if (FPU & VFP2FPU)
4021 Builder.defineMacro("__ARM_VFPV2__");
4022 if (FPU & VFP3FPU)
4023 Builder.defineMacro("__ARM_VFPV3__");
4024 if (FPU & VFP4FPU)
4025 Builder.defineMacro("__ARM_VFPV4__");
4026 }
4027
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004028 // This only gets set when Neon instructions are actually available, unlike
4029 // the VFP define, hence the soft float and arch check. This is subtly
4030 // different from gcc, we follow the intent which was that it should be set
4031 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004032 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4033 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004034 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004035 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004036
Bernard Ogden18b57012013-10-29 09:47:51 +00004037 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004038 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004039
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004040 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004041 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4042 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4043 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4044 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4045 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004046 }
4047 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4048 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004049 Records = BuiltinInfo;
4050 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004051 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004052 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004053 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004054 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004055 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004056 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004057 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004058 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004059 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004060 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004061 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004062 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004063 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004064 case 'l': // r0-r7
4065 case 'h': // r8-r15
4066 case 'w': // VFP Floating point register single precision
4067 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004068 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004069 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004070 case 'Q': // A memory address that is a single base register.
4071 Info.setAllowsMemory();
4072 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004073 case 'U': // a memory reference...
4074 switch (Name[1]) {
4075 case 'q': // ...ARMV4 ldrsb
4076 case 'v': // ...VFP load/store (reg+constant offset)
4077 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004078 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004079 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004080 case 'n': // valid address for Neon doubleword vector load/store
4081 case 'm': // valid address for Neon element and structure load/store
4082 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004083 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004084 Info.setAllowsMemory();
4085 Name++;
4086 return true;
4087 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004088 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004089 return false;
4090 }
Evan Chengd863adb2011-06-16 19:13:15 +00004091 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004092 std::string R;
4093 switch (*Constraint) {
4094 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004095 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004096 Constraint++;
4097 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004098 case 'p': // 'p' should be translated to 'r' by default.
4099 R = std::string("r");
4100 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004101 default:
4102 return std::string(1, *Constraint);
4103 }
4104 return R;
4105 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004106 virtual bool validateConstraintModifier(StringRef Constraint,
4107 const char Modifier,
4108 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004109 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004110 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004111
Bill Wendling9d1ee112012-10-25 23:28:48 +00004112 // Strip off constraint modifiers.
4113 while (Constraint[0] == '=' ||
4114 Constraint[0] == '+' ||
4115 Constraint[0] == '&')
4116 Constraint = Constraint.substr(1);
4117
4118 switch (Constraint[0]) {
4119 default: break;
4120 case 'r': {
4121 switch (Modifier) {
4122 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004123 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004124 case 'q':
4125 // A register of size 32 cannot fit a vector type.
4126 return false;
4127 }
4128 }
4129 }
4130
4131 return true;
4132 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004133 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004134 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004135 return "";
4136 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004137
4138 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4139 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4140 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004141
4142 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4143 if (RegNo == 0) return 0;
4144 if (RegNo == 1) return 1;
4145 return -1;
4146 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004147};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004148
Rafael Espindolaeb265472013-08-21 21:59:03 +00004149bool ARMTargetInfo::setFPMath(StringRef Name) {
4150 if (Name == "neon") {
4151 FPMath = FP_Neon;
4152 return true;
4153 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4154 Name == "vfp4") {
4155 FPMath = FP_VFP;
4156 return true;
4157 }
4158 return false;
4159}
4160
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004161const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004162 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004163 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004164 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4165
4166 // Float registers
4167 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4168 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4169 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004170 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004171
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004172 // Double registers
4173 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4174 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004175 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4176 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004177
4178 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004179 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4180 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004181};
4182
4183void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004184 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004185 Names = GCCRegNames;
4186 NumNames = llvm::array_lengthof(GCCRegNames);
4187}
4188
4189const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004190 { { "a1" }, "r0" },
4191 { { "a2" }, "r1" },
4192 { { "a3" }, "r2" },
4193 { { "a4" }, "r3" },
4194 { { "v1" }, "r4" },
4195 { { "v2" }, "r5" },
4196 { { "v3" }, "r6" },
4197 { { "v4" }, "r7" },
4198 { { "v5" }, "r8" },
4199 { { "v6", "rfp" }, "r9" },
4200 { { "sl" }, "r10" },
4201 { { "fp" }, "r11" },
4202 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004203 { { "r13" }, "sp" },
4204 { { "r14" }, "lr" },
4205 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004206 // The S, D and Q registers overlap, but aren't really aliases; we
4207 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004208};
4209
4210void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4211 unsigned &NumAliases) const {
4212 Aliases = GCCRegAliases;
4213 NumAliases = llvm::array_lengthof(GCCRegAliases);
4214}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004215
4216const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004217#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004218#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004219 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004220#include "clang/Basic/BuiltinsARM.def"
4221};
Chris Lattner17df24e2008-04-21 18:56:49 +00004222} // end anonymous namespace.
4223
Eli Friedmanf05b7722008-08-20 07:44:10 +00004224namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004225class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004226 public DarwinTargetInfo<ARMTargetInfo> {
4227protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004228 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004229 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004230 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004231 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004232
Torok Edwinb2b37c62009-06-30 17:10:35 +00004233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004234 DarwinARMTargetInfo(const llvm::Triple &Triple)
4235 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004236 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004237 // iOS always has 64-bit atomic instructions.
4238 // FIXME: This should be based off of the target features in ARMTargetInfo.
4239 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004240
4241 // Darwin on iOS uses a variant of the ARM C++ ABI.
4242 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004243 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004244};
4245} // end anonymous namespace.
4246
Tony Linthicum76329bf2011-12-12 21:14:55 +00004247
4248namespace {
4249// Hexagon abstract base class
4250class HexagonTargetInfo : public TargetInfo {
4251 static const Builtin::Info BuiltinInfo[];
4252 static const char * const GCCRegNames[];
4253 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4254 std::string CPU;
4255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004256 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004257 BigEndian = false;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00004258 DescriptionString = ("e-p:32:32-i1:32-i64:64-a:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004259
4260 // {} in inline assembly are packet specifiers, not assembly variant
4261 // specifiers.
4262 NoAsmVariants = true;
4263 }
4264
4265 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4266 unsigned &NumRecords) const {
4267 Records = BuiltinInfo;
4268 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4269 }
4270
4271 virtual bool validateAsmConstraint(const char *&Name,
4272 TargetInfo::ConstraintInfo &Info) const {
4273 return true;
4274 }
4275
4276 virtual void getTargetDefines(const LangOptions &Opts,
4277 MacroBuilder &Builder) const;
4278
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004279 virtual bool hasFeature(StringRef Feature) const {
4280 return Feature == "hexagon";
4281 }
4282
Meador Inge5d3fb222012-06-16 03:34:49 +00004283 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4284 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004285 }
4286 virtual void getGCCRegNames(const char * const *&Names,
4287 unsigned &NumNames) const;
4288 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4289 unsigned &NumAliases) const;
4290 virtual const char *getClobbers() const {
4291 return "";
4292 }
Sebastian Pop86500282012-01-13 20:37:10 +00004293
4294 static const char *getHexagonCPUSuffix(StringRef Name) {
4295 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004296 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004297 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004298 .Default(0);
4299 }
4300
Tony Linthicum76329bf2011-12-12 21:14:55 +00004301 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004302 if (!getHexagonCPUSuffix(Name))
4303 return false;
4304
Tony Linthicum76329bf2011-12-12 21:14:55 +00004305 CPU = Name;
4306 return true;
4307 }
4308};
4309
4310void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4311 MacroBuilder &Builder) const {
4312 Builder.defineMacro("qdsp6");
4313 Builder.defineMacro("__qdsp6", "1");
4314 Builder.defineMacro("__qdsp6__", "1");
4315
4316 Builder.defineMacro("hexagon");
4317 Builder.defineMacro("__hexagon", "1");
4318 Builder.defineMacro("__hexagon__", "1");
4319
4320 if(CPU == "hexagonv1") {
4321 Builder.defineMacro("__HEXAGON_V1__");
4322 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4323 if(Opts.HexagonQdsp6Compat) {
4324 Builder.defineMacro("__QDSP6_V1__");
4325 Builder.defineMacro("__QDSP6_ARCH__", "1");
4326 }
4327 }
4328 else if(CPU == "hexagonv2") {
4329 Builder.defineMacro("__HEXAGON_V2__");
4330 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4331 if(Opts.HexagonQdsp6Compat) {
4332 Builder.defineMacro("__QDSP6_V2__");
4333 Builder.defineMacro("__QDSP6_ARCH__", "2");
4334 }
4335 }
4336 else if(CPU == "hexagonv3") {
4337 Builder.defineMacro("__HEXAGON_V3__");
4338 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4339 if(Opts.HexagonQdsp6Compat) {
4340 Builder.defineMacro("__QDSP6_V3__");
4341 Builder.defineMacro("__QDSP6_ARCH__", "3");
4342 }
4343 }
4344 else if(CPU == "hexagonv4") {
4345 Builder.defineMacro("__HEXAGON_V4__");
4346 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4347 if(Opts.HexagonQdsp6Compat) {
4348 Builder.defineMacro("__QDSP6_V4__");
4349 Builder.defineMacro("__QDSP6_ARCH__", "4");
4350 }
4351 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004352 else if(CPU == "hexagonv5") {
4353 Builder.defineMacro("__HEXAGON_V5__");
4354 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4355 if(Opts.HexagonQdsp6Compat) {
4356 Builder.defineMacro("__QDSP6_V5__");
4357 Builder.defineMacro("__QDSP6_ARCH__", "5");
4358 }
4359 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004360}
4361
4362const char * const HexagonTargetInfo::GCCRegNames[] = {
4363 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4364 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4365 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4366 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4367 "p0", "p1", "p2", "p3",
4368 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4369};
4370
4371void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4372 unsigned &NumNames) const {
4373 Names = GCCRegNames;
4374 NumNames = llvm::array_lengthof(GCCRegNames);
4375}
4376
4377
4378const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4379 { { "sp" }, "r29" },
4380 { { "fp" }, "r30" },
4381 { { "lr" }, "r31" },
4382 };
4383
4384void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4385 unsigned &NumAliases) const {
4386 Aliases = GCCRegAliases;
4387 NumAliases = llvm::array_lengthof(GCCRegAliases);
4388}
4389
4390
4391const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4392#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4393#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4394 ALL_LANGUAGES },
4395#include "clang/Basic/BuiltinsHexagon.def"
4396};
4397}
4398
4399
Chris Lattner5ba61f02006-10-14 07:39:34 +00004400namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004401// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4402class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004403 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4404 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004405 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004406public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004407 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004408
Eric Christopher3ff21b32013-10-16 21:26:26 +00004409 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004410 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004411 SoftFloat = false;
4412 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4413 if (Features[i] == "+soft-float")
4414 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004415 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004416 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004417 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004418 MacroBuilder &Builder) const {
4419 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004420 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004421
4422 if (SoftFloat)
4423 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004424 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004425
4426 virtual bool hasFeature(StringRef Feature) const {
4427 return llvm::StringSwitch<bool>(Feature)
4428 .Case("softfloat", SoftFloat)
4429 .Case("sparc", true)
4430 .Default(false);
4431 }
4432
Gabor Greif49991682008-02-21 16:29:08 +00004433 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4434 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004435 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004436 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004437 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4438 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004439 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004440 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004441 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004442 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004443 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004444 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004445 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004446 // FIXME: Implement!
4447 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004448 }
4449 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004450 // FIXME: Implement!
4451 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004452 }
4453};
4454
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004455const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004456 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4457 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4458 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4459 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4460};
4461
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004462void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4463 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004464 Names = GCCRegNames;
4465 NumNames = llvm::array_lengthof(GCCRegNames);
4466}
4467
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004468const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004469 { { "g0" }, "r0" },
4470 { { "g1" }, "r1" },
4471 { { "g2" }, "r2" },
4472 { { "g3" }, "r3" },
4473 { { "g4" }, "r4" },
4474 { { "g5" }, "r5" },
4475 { { "g6" }, "r6" },
4476 { { "g7" }, "r7" },
4477 { { "o0" }, "r8" },
4478 { { "o1" }, "r9" },
4479 { { "o2" }, "r10" },
4480 { { "o3" }, "r11" },
4481 { { "o4" }, "r12" },
4482 { { "o5" }, "r13" },
4483 { { "o6", "sp" }, "r14" },
4484 { { "o7" }, "r15" },
4485 { { "l0" }, "r16" },
4486 { { "l1" }, "r17" },
4487 { { "l2" }, "r18" },
4488 { { "l3" }, "r19" },
4489 { { "l4" }, "r20" },
4490 { { "l5" }, "r21" },
4491 { { "l6" }, "r22" },
4492 { { "l7" }, "r23" },
4493 { { "i0" }, "r24" },
4494 { { "i1" }, "r25" },
4495 { { "i2" }, "r26" },
4496 { { "i3" }, "r27" },
4497 { { "i4" }, "r28" },
4498 { { "i5" }, "r29" },
4499 { { "i6", "fp" }, "r30" },
4500 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004501};
4502
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004503void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4504 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004505 Aliases = GCCRegAliases;
4506 NumAliases = llvm::array_lengthof(GCCRegAliases);
4507}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004508
4509// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4510class SparcV8TargetInfo : public SparcTargetInfo {
4511public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004512 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindoladc265ed2013-12-19 03:03:04 +00004513 DescriptionString = "E-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004514 }
4515
4516 virtual void getTargetDefines(const LangOptions &Opts,
4517 MacroBuilder &Builder) const {
4518 SparcTargetInfo::getTargetDefines(Opts, Builder);
4519 Builder.defineMacro("__sparcv8");
4520 }
4521};
4522
4523// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4524class SparcV9TargetInfo : public SparcTargetInfo {
4525public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004526 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004527 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola47debc02013-12-16 21:59:14 +00004528 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00004529 "i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004530 // This is an LP64 platform.
4531 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004532
4533 // OpenBSD uses long long for int64_t and intmax_t.
4534 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4535 IntMaxType = SignedLongLong;
4536 UIntMaxType = UnsignedLongLong;
4537 } else {
4538 IntMaxType = SignedLong;
4539 UIntMaxType = UnsignedLong;
4540 }
4541 Int64Type = IntMaxType;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004542 }
4543
4544 virtual void getTargetDefines(const LangOptions &Opts,
4545 MacroBuilder &Builder) const {
4546 SparcTargetInfo::getTargetDefines(Opts, Builder);
4547 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004548 Builder.defineMacro("__arch64__");
4549 // Solaris and its derivative AuroraUX don't need these variants, but the
4550 // BSDs do.
4551 if (getTriple().getOS() != llvm::Triple::Solaris &&
4552 getTriple().getOS() != llvm::Triple::AuroraUX) {
4553 Builder.defineMacro("__sparc64__");
4554 Builder.defineMacro("__sparc_v9__");
4555 Builder.defineMacro("__sparcv9__");
4556 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004557 }
4558};
4559
Gabor Greif49991682008-02-21 16:29:08 +00004560} // end anonymous namespace.
4561
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004562namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004563class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4564public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004565 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4566 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004567 SizeType = UnsignedInt;
4568 PtrDiffType = SignedInt;
4569 }
4570};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004571class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004572public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004573 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4574 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004575 SizeType = UnsignedInt;
4576 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004577 }
4578};
4579} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004580
Chris Lattnerb781dc792008-05-08 05:58:21 +00004581namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004582 class SystemZTargetInfo : public TargetInfo {
4583 static const char *const GCCRegNames[];
4584
4585 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004586 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004587 TLSSupported = true;
4588 IntWidth = IntAlign = 32;
4589 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4590 PointerWidth = PointerAlign = 64;
4591 LongDoubleWidth = 128;
4592 LongDoubleAlign = 64;
4593 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4594 MinGlobalAlign = 16;
Rafael Espindola04c685b2013-12-16 22:50:41 +00004595 DescriptionString = "E-i1:8:16-i8:8:16-i64:64"
4596 "-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004597 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4598 }
4599 virtual void getTargetDefines(const LangOptions &Opts,
4600 MacroBuilder &Builder) const {
4601 Builder.defineMacro("__s390__");
4602 Builder.defineMacro("__s390x__");
4603 Builder.defineMacro("__zarch__");
4604 Builder.defineMacro("__LONG_DOUBLE_128__");
4605 }
4606 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4607 unsigned &NumRecords) const {
4608 // FIXME: Implement.
4609 Records = 0;
4610 NumRecords = 0;
4611 }
4612
4613 virtual void getGCCRegNames(const char *const *&Names,
4614 unsigned &NumNames) const;
4615 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4616 unsigned &NumAliases) const {
4617 // No aliases.
4618 Aliases = 0;
4619 NumAliases = 0;
4620 }
4621 virtual bool validateAsmConstraint(const char *&Name,
4622 TargetInfo::ConstraintInfo &info) const;
4623 virtual const char *getClobbers() const {
4624 // FIXME: Is this really right?
4625 return "";
4626 }
4627 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4628 return TargetInfo::SystemZBuiltinVaList;
4629 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004630 virtual bool setCPU(const std::string &Name) {
4631 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4632 .Case("z10", true)
4633 .Case("z196", true)
4634 .Case("zEC12", true)
4635 .Default(false);
4636
4637 // No need to store the CPU yet. There aren't any CPU-specific
4638 // macros to define.
4639 return CPUKnown;
4640 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004641 };
4642
4643 const char *const SystemZTargetInfo::GCCRegNames[] = {
4644 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4645 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4646 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4647 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4648 };
4649
4650 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4651 unsigned &NumNames) const {
4652 Names = GCCRegNames;
4653 NumNames = llvm::array_lengthof(GCCRegNames);
4654 }
4655
4656 bool SystemZTargetInfo::
4657 validateAsmConstraint(const char *&Name,
4658 TargetInfo::ConstraintInfo &Info) const {
4659 switch (*Name) {
4660 default:
4661 return false;
4662
4663 case 'a': // Address register
4664 case 'd': // Data register (equivalent to 'r')
4665 case 'f': // Floating-point register
4666 Info.setAllowsRegister();
4667 return true;
4668
4669 case 'I': // Unsigned 8-bit constant
4670 case 'J': // Unsigned 12-bit constant
4671 case 'K': // Signed 16-bit constant
4672 case 'L': // Signed 20-bit displacement (on all targets we support)
4673 case 'M': // 0x7fffffff
4674 return true;
4675
4676 case 'Q': // Memory with base and unsigned 12-bit displacement
4677 case 'R': // Likewise, plus an index
4678 case 'S': // Memory with base and signed 20-bit displacement
4679 case 'T': // Likewise, plus an index
4680 Info.setAllowsMemory();
4681 return true;
4682 }
4683 }
4684}
4685
4686namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004687 class MSP430TargetInfo : public TargetInfo {
4688 static const char * const GCCRegNames[];
4689 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004690 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004691 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004692 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004693 IntWidth = 16; IntAlign = 16;
4694 LongWidth = 32; LongLongWidth = 64;
4695 LongAlign = LongLongAlign = 16;
4696 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004697 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004698 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004699 IntMaxType = SignedLongLong;
4700 UIntMaxType = UnsignedLongLong;
4701 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004702 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004703 SigAtomicType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00004704 DescriptionString = "e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004705 }
4706 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004707 MacroBuilder &Builder) const {
4708 Builder.defineMacro("MSP430");
4709 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004710 // FIXME: defines for different 'flavours' of MCU
4711 }
4712 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4713 unsigned &NumRecords) const {
4714 // FIXME: Implement.
4715 Records = 0;
4716 NumRecords = 0;
4717 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004718 virtual bool hasFeature(StringRef Feature) const {
4719 return Feature == "msp430";
4720 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004721 virtual void getGCCRegNames(const char * const *&Names,
4722 unsigned &NumNames) const;
4723 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4724 unsigned &NumAliases) const {
4725 // No aliases.
4726 Aliases = 0;
4727 NumAliases = 0;
4728 }
4729 virtual bool validateAsmConstraint(const char *&Name,
4730 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004731 // No target constraints for now.
4732 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004733 }
4734 virtual const char *getClobbers() const {
4735 // FIXME: Is this really right?
4736 return "";
4737 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004738 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004739 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004740 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004741 }
4742 };
4743
4744 const char * const MSP430TargetInfo::GCCRegNames[] = {
4745 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4746 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4747 };
4748
4749 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4750 unsigned &NumNames) const {
4751 Names = GCCRegNames;
4752 NumNames = llvm::array_lengthof(GCCRegNames);
4753 }
4754}
4755
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004756namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004757
Mike Stump11289f42009-09-09 15:08:12 +00004758 // LLVM and Clang cannot be used directly to output native binaries for
4759 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004760 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004761 //
4762 // TCE uses the llvm bitcode as input and uses it for generating customized
4763 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004764 // publicly available in http://tce.cs.tut.fi
4765
Eli Friedman1f191002011-10-07 19:51:42 +00004766 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4767 3, // opencl_global
4768 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004769 5, // opencl_constant
4770 0, // cuda_device
4771 0, // cuda_constant
4772 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004773 };
4774
Eli Friedmana9c3d712009-08-19 20:47:07 +00004775 class TCETargetInfo : public TargetInfo{
4776 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004777 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004778 TLSSupported = false;
4779 IntWidth = 32;
4780 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004781 PointerWidth = 32;
4782 IntAlign = 32;
4783 LongAlign = LongLongAlign = 32;
4784 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004785 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004786 SizeType = UnsignedInt;
4787 IntMaxType = SignedLong;
4788 UIntMaxType = UnsignedLong;
4789 IntPtrType = SignedInt;
4790 PtrDiffType = SignedInt;
4791 FloatWidth = 32;
4792 FloatAlign = 32;
4793 DoubleWidth = 32;
4794 DoubleAlign = 32;
4795 LongDoubleWidth = 32;
4796 LongDoubleAlign = 32;
4797 FloatFormat = &llvm::APFloat::IEEEsingle;
4798 DoubleFormat = &llvm::APFloat::IEEEsingle;
4799 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola2da35322013-12-16 23:27:41 +00004800 DescriptionString = "E-p:32:32-i8:8:32-"
4801 "i16:16:32-i64:32"
4802 "-f64:32-v64:32-"
4803 "v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004804 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004805 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004806 }
4807
4808 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004809 MacroBuilder &Builder) const {
4810 DefineStd(Builder, "tce", Opts);
4811 Builder.defineMacro("__TCE__");
4812 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004813 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004814 virtual bool hasFeature(StringRef Feature) const {
4815 return Feature == "tce";
4816 }
4817
Eli Friedmana9c3d712009-08-19 20:47:07 +00004818 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4819 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004820 virtual const char *getClobbers() const {
4821 return "";
4822 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004823 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4824 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004825 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004826 virtual void getGCCRegNames(const char * const *&Names,
4827 unsigned &NumNames) const {}
4828 virtual bool validateAsmConstraint(const char *&Name,
4829 TargetInfo::ConstraintInfo &info) const {
4830 return true;
4831 }
4832 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4833 unsigned &NumAliases) const {}
4834 };
4835}
4836
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004837namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004838class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004839 virtual void setDescriptionString() = 0;
4840
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004841 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004842 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004843 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004844 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004845 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004846 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004847 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004848 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004849 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004850 enum DspRevEnum {
4851 NoDSP, DSP1, DSP2
4852 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004853 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004854
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004855protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004856 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004857 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004858
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004859public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004860 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4861 const std::string &CPUStr)
4862 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004863 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004864 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004865
Eric Christopher0b26a612010-03-02 02:41:08 +00004866 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004867 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004868 virtual bool setCPU(const std::string &Name) {
4869 CPU = Name;
4870 return true;
4871 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004872 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004873 Features[ABI] = true;
4874 Features[CPU] = true;
4875 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004876
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004877 virtual void getTargetDefines(const LangOptions &Opts,
4878 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004879 DefineStd(Builder, "mips", Opts);
4880 Builder.defineMacro("_mips");
4881 Builder.defineMacro("__REGISTER_PREFIX__", "");
4882
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004883 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004884 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004885 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004886 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004887 case SoftFloat:
4888 Builder.defineMacro("__mips_soft_float", Twine(1));
4889 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004890 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004891
Simon Atanasyan16071912013-04-14 14:07:30 +00004892 if (IsSingleFloat)
4893 Builder.defineMacro("__mips_single_float", Twine(1));
4894
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004895 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4896 Builder.defineMacro("_MIPS_FPSET",
4897 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4898
Simon Atanasyan72244b62012-07-05 16:06:06 +00004899 if (IsMips16)
4900 Builder.defineMacro("__mips16", Twine(1));
4901
Simon Atanasyan60777612013-04-14 14:07:51 +00004902 if (IsMicromips)
4903 Builder.defineMacro("__mips_micromips", Twine(1));
4904
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004905 if (IsNan2008)
4906 Builder.defineMacro("__mips_nan2008", Twine(1));
4907
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004908 switch (DspRev) {
4909 default:
4910 break;
4911 case DSP1:
4912 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4913 Builder.defineMacro("__mips_dsp", Twine(1));
4914 break;
4915 case DSP2:
4916 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4917 Builder.defineMacro("__mips_dspr2", Twine(1));
4918 Builder.defineMacro("__mips_dsp", Twine(1));
4919 break;
4920 }
4921
Jack Carter44ff1e52013-08-12 17:20:29 +00004922 if (HasMSA)
4923 Builder.defineMacro("__mips_msa", Twine(1));
4924
Simon Atanasyan26f19672012-04-05 19:28:31 +00004925 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4926 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4927 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004928
4929 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4930 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004931 }
4932
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004933 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4934 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004935 Records = BuiltinInfo;
4936 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004937 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004938 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004939 return llvm::StringSwitch<bool>(Feature)
4940 .Case("mips", true)
4941 .Case("fp64", HasFP64)
4942 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004943 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004944 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4945 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004946 }
4947 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004948 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004949 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004950 // CPU register names
4951 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004952 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4953 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4954 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004955 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4956 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004957 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4958 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4959 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4960 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004961 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004962 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004963 "$fcc5","$fcc6","$fcc7",
4964 // MSA register names
4965 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4966 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4967 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4968 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4969 // MSA control register names
4970 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4971 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004972 };
4973 Names = GCCRegNames;
4974 NumNames = llvm::array_lengthof(GCCRegNames);
4975 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004976 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004977 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004978 virtual bool validateAsmConstraint(const char *&Name,
4979 TargetInfo::ConstraintInfo &Info) const {
4980 switch (*Name) {
4981 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004982 return false;
4983
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004984 case 'r': // CPU registers.
4985 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4986 case 'y': // Equivalent to "r", backwards compatibility only.
4987 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004988 case 'c': // $25 for indirect jumps
4989 case 'l': // lo register
4990 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004991 Info.setAllowsRegister();
4992 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004993 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004994 Info.setAllowsMemory();
4995 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004996 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004997 }
4998
4999 virtual const char *getClobbers() const {
5000 // FIXME: Implement!
5001 return "";
5002 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005003
Eric Christopher3ff21b32013-10-16 21:26:26 +00005004 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00005005 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005006 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005007 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005008 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005009 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005010 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005011 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005012 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005013
5014 for (std::vector<std::string>::iterator it = Features.begin(),
5015 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005016 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005017 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005018 else if (*it == "+soft-float")
5019 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005020 else if (*it == "+mips16")
5021 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005022 else if (*it == "+micromips")
5023 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005024 else if (*it == "+dsp")
5025 DspRev = std::max(DspRev, DSP1);
5026 else if (*it == "+dspr2")
5027 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005028 else if (*it == "+msa")
5029 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005030 else if (*it == "+fp64")
5031 HasFP64 = true;
5032 else if (*it == "-fp64")
5033 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005034 else if (*it == "+nan2008")
5035 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005036 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005037
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005038 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005039 std::vector<std::string>::iterator it =
5040 std::find(Features.begin(), Features.end(), "+soft-float");
5041 if (it != Features.end())
5042 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005043 it = std::find(Features.begin(), Features.end(), "+nan2008");
5044 if (it != Features.end())
5045 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005046
Akira Hatanaka9064e362013-10-29 18:30:33 +00005047 setDescriptionString();
5048
Rafael Espindolaeb265472013-08-21 21:59:03 +00005049 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005050 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005051
5052 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5053 if (RegNo == 0) return 4;
5054 if (RegNo == 1) return 5;
5055 return -1;
5056 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005057};
5058
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005059const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5060#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5061#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5062 ALL_LANGUAGES },
5063#include "clang/Basic/BuiltinsMips.def"
5064};
5065
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005066class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005067public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005068 Mips32TargetInfoBase(const llvm::Triple &Triple)
5069 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005070 SizeType = UnsignedInt;
5071 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005072 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005073 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005074 virtual bool setABI(const std::string &Name) {
5075 if ((Name == "o32") || (Name == "eabi")) {
5076 ABI = Name;
5077 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005078 } else if (Name == "32") {
5079 ABI = "o32";
5080 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005081 } else
5082 return false;
5083 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005084 virtual void getTargetDefines(const LangOptions &Opts,
5085 MacroBuilder &Builder) const {
5086 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005087
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005088 if (ABI == "o32") {
5089 Builder.defineMacro("__mips_o32");
5090 Builder.defineMacro("_ABIO32", "1");
5091 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5092 }
5093 else if (ABI == "eabi")
5094 Builder.defineMacro("__mips_eabi");
5095 else
David Blaikie83d382b2011-09-23 05:06:16 +00005096 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005097 }
5098 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5099 unsigned &NumAliases) const {
5100 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5101 { { "at" }, "$1" },
5102 { { "v0" }, "$2" },
5103 { { "v1" }, "$3" },
5104 { { "a0" }, "$4" },
5105 { { "a1" }, "$5" },
5106 { { "a2" }, "$6" },
5107 { { "a3" }, "$7" },
5108 { { "t0" }, "$8" },
5109 { { "t1" }, "$9" },
5110 { { "t2" }, "$10" },
5111 { { "t3" }, "$11" },
5112 { { "t4" }, "$12" },
5113 { { "t5" }, "$13" },
5114 { { "t6" }, "$14" },
5115 { { "t7" }, "$15" },
5116 { { "s0" }, "$16" },
5117 { { "s1" }, "$17" },
5118 { { "s2" }, "$18" },
5119 { { "s3" }, "$19" },
5120 { { "s4" }, "$20" },
5121 { { "s5" }, "$21" },
5122 { { "s6" }, "$22" },
5123 { { "s7" }, "$23" },
5124 { { "t8" }, "$24" },
5125 { { "t9" }, "$25" },
5126 { { "k0" }, "$26" },
5127 { { "k1" }, "$27" },
5128 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005129 { { "sp","$sp" }, "$29" },
5130 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005131 { { "ra" }, "$31" }
5132 };
5133 Aliases = GCCRegAliases;
5134 NumAliases = llvm::array_lengthof(GCCRegAliases);
5135 }
5136};
5137
5138class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005139 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005140 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5141 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005142 }
5143
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005144public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005145 Mips32EBTargetInfo(const llvm::Triple &Triple)
5146 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005147 }
5148 virtual void getTargetDefines(const LangOptions &Opts,
5149 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005150 DefineStd(Builder, "MIPSEB", Opts);
5151 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005152 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005153 }
5154};
5155
5156class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005157 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005158 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5159 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005160 }
5161
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005162public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005163 Mips32ELTargetInfo(const llvm::Triple &Triple)
5164 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005165 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005166 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005167 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005168 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005169 DefineStd(Builder, "MIPSEL", Opts);
5170 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005171 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005172 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005173};
Akira Hatanakabef17452011-09-20 19:21:49 +00005174
5175class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005176public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005177 Mips64TargetInfoBase(const llvm::Triple &Triple)
5178 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005179 LongWidth = LongAlign = 64;
5180 PointerWidth = PointerAlign = 64;
5181 LongDoubleWidth = LongDoubleAlign = 128;
5182 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005183 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5184 LongDoubleWidth = LongDoubleAlign = 64;
5185 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5186 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005187 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005188 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005189 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005190 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005191 if (Name == "n32") {
5192 LongWidth = LongAlign = 32;
5193 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005194 ABI = Name;
5195 return true;
5196 } else if (Name == "n64") {
5197 ABI = Name;
5198 return true;
5199 } else if (Name == "64") {
5200 ABI = "n64";
5201 return true;
5202 } else
5203 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005204 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005205 virtual void getTargetDefines(const LangOptions &Opts,
5206 MacroBuilder &Builder) const {
5207 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005208
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005209 Builder.defineMacro("__mips64");
5210 Builder.defineMacro("__mips64__");
5211
Akira Hatanakabef17452011-09-20 19:21:49 +00005212 if (ABI == "n32") {
5213 Builder.defineMacro("__mips_n32");
5214 Builder.defineMacro("_ABIN32", "2");
5215 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5216 }
5217 else if (ABI == "n64") {
5218 Builder.defineMacro("__mips_n64");
5219 Builder.defineMacro("_ABI64", "3");
5220 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5221 }
5222 else
David Blaikie83d382b2011-09-23 05:06:16 +00005223 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005224 }
5225 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5226 unsigned &NumAliases) const {
5227 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5228 { { "at" }, "$1" },
5229 { { "v0" }, "$2" },
5230 { { "v1" }, "$3" },
5231 { { "a0" }, "$4" },
5232 { { "a1" }, "$5" },
5233 { { "a2" }, "$6" },
5234 { { "a3" }, "$7" },
5235 { { "a4" }, "$8" },
5236 { { "a5" }, "$9" },
5237 { { "a6" }, "$10" },
5238 { { "a7" }, "$11" },
5239 { { "t0" }, "$12" },
5240 { { "t1" }, "$13" },
5241 { { "t2" }, "$14" },
5242 { { "t3" }, "$15" },
5243 { { "s0" }, "$16" },
5244 { { "s1" }, "$17" },
5245 { { "s2" }, "$18" },
5246 { { "s3" }, "$19" },
5247 { { "s4" }, "$20" },
5248 { { "s5" }, "$21" },
5249 { { "s6" }, "$22" },
5250 { { "s7" }, "$23" },
5251 { { "t8" }, "$24" },
5252 { { "t9" }, "$25" },
5253 { { "k0" }, "$26" },
5254 { { "k1" }, "$27" },
5255 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005256 { { "sp","$sp" }, "$29" },
5257 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005258 { { "ra" }, "$31" }
5259 };
5260 Aliases = GCCRegAliases;
5261 NumAliases = llvm::array_lengthof(GCCRegAliases);
5262 }
5263};
5264
5265class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005266 virtual void setDescriptionString() {
5267 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005268 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005269 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005270 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005271 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005272 DescriptionString = "E-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005273 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005274 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005275
Akira Hatanakabef17452011-09-20 19:21:49 +00005276 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005277
Akira Hatanakabef17452011-09-20 19:21:49 +00005278public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005279 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005280 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005281 virtual void getTargetDefines(const LangOptions &Opts,
5282 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005283 DefineStd(Builder, "MIPSEB", Opts);
5284 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005285 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005286 }
5287};
5288
5289class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005290 virtual void setDescriptionString() {
5291 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005292 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005293 "i64:64"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005294 "-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005295 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005296 DescriptionString = "e-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005297 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005298 "n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005299 }
5300public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005301 Mips64ELTargetInfo(const llvm::Triple &Triple)
5302 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005303 // Default ABI is n64.
5304 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005305 }
5306 virtual void getTargetDefines(const LangOptions &Opts,
5307 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005308 DefineStd(Builder, "MIPSEL", Opts);
5309 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005310 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005311 }
5312};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005313} // end anonymous namespace.
5314
Ivan Krasindd7403e2011-08-24 20:22:22 +00005315namespace {
5316class PNaClTargetInfo : public TargetInfo {
5317public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005318 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005319 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005320 this->UserLabelPrefix = "";
5321 this->LongAlign = 32;
5322 this->LongWidth = 32;
5323 this->PointerAlign = 32;
5324 this->PointerWidth = 32;
5325 this->IntMaxType = TargetInfo::SignedLongLong;
5326 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5327 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005328 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005329 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005330 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005331 this->SizeType = TargetInfo::UnsignedInt;
5332 this->PtrDiffType = TargetInfo::SignedInt;
5333 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005334 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005335 }
5336
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005337 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005338 }
5339 virtual void getArchDefines(const LangOptions &Opts,
5340 MacroBuilder &Builder) const {
5341 Builder.defineMacro("__le32__");
5342 Builder.defineMacro("__pnacl__");
5343 }
5344 virtual void getTargetDefines(const LangOptions &Opts,
5345 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005346 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005347 getArchDefines(Opts, Builder);
5348 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005349 virtual bool hasFeature(StringRef Feature) const {
5350 return Feature == "pnacl";
5351 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005352 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5353 unsigned &NumRecords) const {
5354 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005355 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5356 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005357 }
5358 virtual void getGCCRegNames(const char * const *&Names,
5359 unsigned &NumNames) const;
5360 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5361 unsigned &NumAliases) const;
5362 virtual bool validateAsmConstraint(const char *&Name,
5363 TargetInfo::ConstraintInfo &Info) const {
5364 return false;
5365 }
5366
5367 virtual const char *getClobbers() const {
5368 return "";
5369 }
5370};
5371
5372void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5373 unsigned &NumNames) const {
5374 Names = NULL;
5375 NumNames = 0;
5376}
5377
5378void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5379 unsigned &NumAliases) const {
5380 Aliases = NULL;
5381 NumAliases = 0;
5382}
5383} // end anonymous namespace.
5384
Guy Benyeib798fc92012-12-11 21:38:14 +00005385namespace {
5386 static const unsigned SPIRAddrSpaceMap[] = {
5387 1, // opencl_global
5388 3, // opencl_local
5389 2, // opencl_constant
5390 0, // cuda_device
5391 0, // cuda_constant
5392 0 // cuda_shared
5393 };
5394 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005395 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005396 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005397 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5398 "SPIR target must use unknown OS");
5399 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5400 "SPIR target must use unknown environment type");
5401 BigEndian = false;
5402 TLSSupported = false;
5403 LongWidth = LongAlign = 64;
5404 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005405 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005406 // Define available target features
5407 // These must be defined in sorted order!
5408 NoAsmVariants = true;
5409 }
5410 virtual void getTargetDefines(const LangOptions &Opts,
5411 MacroBuilder &Builder) const {
5412 DefineStd(Builder, "SPIR", Opts);
5413 }
5414 virtual bool hasFeature(StringRef Feature) const {
5415 return Feature == "spir";
5416 }
5417
5418 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5419 unsigned &NumRecords) const {}
5420 virtual const char *getClobbers() const {
5421 return "";
5422 }
5423 virtual void getGCCRegNames(const char * const *&Names,
5424 unsigned &NumNames) const {}
5425 virtual bool validateAsmConstraint(const char *&Name,
5426 TargetInfo::ConstraintInfo &info) const {
5427 return true;
5428 }
5429 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5430 unsigned &NumAliases) const {}
5431 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5432 return TargetInfo::VoidPtrBuiltinVaList;
5433 }
5434 };
5435
5436
5437 class SPIR32TargetInfo : public SPIRTargetInfo {
5438 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005439 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005440 PointerWidth = PointerAlign = 32;
5441 SizeType = TargetInfo::UnsignedInt;
5442 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5443 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005444 = "e-p:32:32-i64:64"
5445 "-v16:16-v24:32-v32:32-v48:64-"
5446 "v96:128-v192:256-v256:256-"
5447 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005448 }
5449 virtual void getTargetDefines(const LangOptions &Opts,
5450 MacroBuilder &Builder) const {
5451 DefineStd(Builder, "SPIR32", Opts);
5452 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005453 };
5454
5455 class SPIR64TargetInfo : public SPIRTargetInfo {
5456 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005457 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005458 PointerWidth = PointerAlign = 64;
5459 SizeType = TargetInfo::UnsignedLong;
5460 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5461 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005462 = "e-i64:64"
5463 "-v16:16-v24:32-v32:32-v48:64-"
5464 "v96:128-v192:256-v256:256-"
5465 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005466 }
5467 virtual void getTargetDefines(const LangOptions &Opts,
5468 MacroBuilder &Builder) const {
5469 DefineStd(Builder, "SPIR64", Opts);
5470 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005471 };
5472}
5473
Robert Lytton0e076492013-08-13 09:43:10 +00005474namespace {
5475class XCoreTargetInfo : public TargetInfo {
5476 static const Builtin::Info BuiltinInfo[];
5477public:
5478 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5479 BigEndian = false;
5480 NoAsmVariants = true;
5481 LongLongAlign = 32;
5482 SuitableAlign = 32;
5483 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005484 SizeType = UnsignedInt;
5485 PtrDiffType = SignedInt;
5486 IntPtrType = SignedInt;
5487 WCharType = UnsignedChar;
5488 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005489 UseZeroLengthBitfieldAlignment = true;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00005490 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005491 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005492 }
5493 virtual void getTargetDefines(const LangOptions &Opts,
5494 MacroBuilder &Builder) const {
5495 Builder.defineMacro("__XS1B__");
5496 }
5497 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5498 unsigned &NumRecords) const {
5499 Records = BuiltinInfo;
5500 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5501 }
5502 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5503 return TargetInfo::VoidPtrBuiltinVaList;
5504 }
5505 virtual const char *getClobbers() const {
5506 return "";
5507 }
5508 virtual void getGCCRegNames(const char * const *&Names,
5509 unsigned &NumNames) const {
5510 static const char * const GCCRegNames[] = {
5511 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5512 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5513 };
5514 Names = GCCRegNames;
5515 NumNames = llvm::array_lengthof(GCCRegNames);
5516 }
5517 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5518 unsigned &NumAliases) const {
5519 Aliases = NULL;
5520 NumAliases = 0;
5521 }
5522 virtual bool validateAsmConstraint(const char *&Name,
5523 TargetInfo::ConstraintInfo &Info) const {
5524 return false;
5525 }
5526};
5527
5528const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5529#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5530#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5531 ALL_LANGUAGES },
5532#include "clang/Basic/BuiltinsXCore.def"
5533};
5534} // end anonymous namespace.
5535
Ivan Krasindd7403e2011-08-24 20:22:22 +00005536
Chris Lattner5ba61f02006-10-14 07:39:34 +00005537//===----------------------------------------------------------------------===//
5538// Driver code
5539//===----------------------------------------------------------------------===//
5540
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005541static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005542 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005543
Daniel Dunbar52322032009-08-18 05:47:58 +00005544 switch (Triple.getArch()) {
5545 default:
5546 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005547
Robert Lytton0e076492013-08-13 09:43:10 +00005548 case llvm::Triple::xcore:
5549 return new XCoreTargetInfo(Triple);
5550
Tony Linthicum76329bf2011-12-12 21:14:55 +00005551 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005552 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005553
Tim Northover9bb857a2013-01-31 12:13:10 +00005554 case llvm::Triple::aarch64:
5555 switch (os) {
5556 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005557 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005558 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005559 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005560 }
5561
Daniel Dunbar52322032009-08-18 05:47:58 +00005562 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005563 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005564 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005565 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005566
Daniel Dunbar52322032009-08-18 05:47:58 +00005567 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005568 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005569 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005570 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005571 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005572 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005573 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005574 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005575 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005576 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005577 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005578 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005579 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005580 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005582 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005583 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005584 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005585
Daniel Dunbar52322032009-08-18 05:47:58 +00005586 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005587 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005589 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005590 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005591 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005592 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005593 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005594 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005595 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005596 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005597 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005598 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005599 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005600 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005601 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005602
5603 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005604 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005605 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005606 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005607 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005608 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005609 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005610 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005611 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005612 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005613 case llvm::Triple::NaCl:
5614 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005615 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005616 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005617 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005618
Akira Hatanakabef17452011-09-20 19:21:49 +00005619 case llvm::Triple::mips64:
5620 switch (os) {
5621 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005622 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005623 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005624 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005625 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005626 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005627 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005628 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005629 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005630 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005631 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005632 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005633 }
5634
5635 case llvm::Triple::mips64el:
5636 switch (os) {
5637 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005638 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005639 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005640 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005641 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005642 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005643 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005644 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005645 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005646 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005647 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005648 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005649 }
5650
Ivan Krasindd7403e2011-08-24 20:22:22 +00005651 case llvm::Triple::le32:
5652 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005653 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005654 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005655 default:
5656 return NULL;
5657 }
5658
Daniel Dunbar52322032009-08-18 05:47:58 +00005659 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005660 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005662 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005663 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005664 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005665 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005666 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005667 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005668 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005669 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005670 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005671 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005672 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005673 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005674 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005675 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005676
5677 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005678 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005679 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005680 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005681 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005682 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005683 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005684 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005685 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005686 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005687 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005688 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005689 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005690 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005691 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005692
Bill Schmidt778d3872013-07-26 01:36:11 +00005693 case llvm::Triple::ppc64le:
5694 switch (os) {
5695 case llvm::Triple::Linux:
5696 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5697 default:
5698 return new PPC64TargetInfo(Triple);
5699 }
5700
Peter Collingbournec947aae2012-05-20 23:28:41 +00005701 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005702 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005703 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005704 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005705
Eli Friedmand13b41e2012-10-12 23:32:00 +00005706 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005708
Daniel Dunbar52322032009-08-18 05:47:58 +00005709 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005710 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005711 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005713 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005714 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005715 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005716 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005717 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005718 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005719 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005720 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005721 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005722 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005723 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005724 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005725 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005726
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005727 case llvm::Triple::sparcv9:
5728 switch (os) {
5729 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005730 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005731 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005732 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005733 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005734 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005735 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005736 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005737 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005738 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005739 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005741 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005742 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005743 }
5744
Ulrich Weigand47445072013-05-06 16:26:41 +00005745 case llvm::Triple::systemz:
5746 switch (os) {
5747 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005749 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005750 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005751 }
5752
Eli Friedmana9c3d712009-08-19 20:47:07 +00005753 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005754 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005755
Daniel Dunbar52322032009-08-18 05:47:58 +00005756 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005757 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005758 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005759
Daniel Dunbar52322032009-08-18 05:47:58 +00005760 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005761 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005762 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005763 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005764 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005765 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005766 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005767 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005768 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005769 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005770 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005771 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005772 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005773 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005774 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005775 case llvm::Triple::KFreeBSD:
5776 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005777 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005778 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005779 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005780 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005781 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005782 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005783 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005784 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005785 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005787 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005789 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005790 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005791 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005793 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005794 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005795 }
5796
5797 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005798 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005799 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005800
Daniel Dunbar52322032009-08-18 05:47:58 +00005801 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005802 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005804 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005806 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005807 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005808 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005809 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005810 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005811 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005812 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005813 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005814 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005815 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005816 case llvm::Triple::KFreeBSD:
5817 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005818 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005819 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005820 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005821 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005822 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005824 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005825 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005826 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005827 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005828 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005829
5830 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005831 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005832 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005833 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005834 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005835 }
5836 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005837 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005838 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005839 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005840 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005841 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005842 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005843}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005844
5845/// CreateTargetInfo - Return the target info object for the specified target
5846/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005847TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005848 TargetOptions *Opts) {
5849 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005850
5851 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005852 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005853 if (!Target) {
5854 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5855 return 0;
5856 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005857 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005858
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005859 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005860 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5861 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005862 return 0;
5863 }
5864
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005865 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005866 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5867 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005868 return 0;
5869 }
5870
Charles Davis95a546e2010-06-11 01:06:47 +00005871 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005872 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5873 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005874 return 0;
5875 }
5876
Rafael Espindolaeb265472013-08-21 21:59:03 +00005877 // Set the fp math unit.
5878 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5879 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5880 return 0;
5881 }
5882
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005883 // Compute the default target features, we need the target to handle this
5884 // because features may have dependencies on one another.
5885 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005886 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005887
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005888 // Apply the user specified deltas.
5889 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5890 I < N; ++I) {
5891 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005892 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005893 bool Enabled = Name[0] == '+';
5894 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005895 }
5896
5897 // Add the features to the compile options.
5898 //
5899 // FIXME: If we are completely confident that we have the right set, we only
5900 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005901 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005902 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5903 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005904 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005905 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005906 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005907
5908 return Target.take();
5909}