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