blob: 3a80d0f2ac0a358416ebf6790f91c8f05d4ddc98 [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 Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000024#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000026#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000027#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
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) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000097
John McCall5d36a8c2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000107
John McCall31168b02011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000112 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000113
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000131
Sebastian Pop422377c2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Evan Cheng31dd9a62014-01-26 23:12:43 +0000140 // Set the appropriate OS version define.
141 if (Triple.isiOS()) {
142 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151 Str);
152 } else if (Triple.isMacOSX()) {
153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
157 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[5];
159 Str[0] = '0' + (Maj / 10);
160 Str[1] = '0' + (Maj % 10);
161 Str[2] = '0' + std::min(Min, 9U);
162 Str[3] = '0' + std::min(Rev, 9U);
163 Str[4] = '\0';
164 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000165 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000166
Tim Northover157d9112014-01-16 08:48:16 +0000167 // Tell users about the kernel if there is one.
168 if (Triple.isOSDarwin())
169 Builder.defineMacro("__MACH__");
170
Daniel Dunbarecf13562011-04-19 21:40:34 +0000171 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000172}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000173
Chris Lattner30ba6742009-08-10 19:03:04 +0000174namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000175template<typename Target>
176class DarwinTargetInfo : public OSTargetInfo<Target> {
177protected:
Craig Topper3164f332014-03-11 03:39:26 +0000178 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
179 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000180 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000181 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000182 }
Mike Stump11289f42009-09-09 15:08:12 +0000183
Torok Edwinb2b37c62009-06-30 17:10:35 +0000184public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000185 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
186 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
187 this->MCountName = "\01mcount";
188 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189
Craig Topper3164f332014-03-11 03:39:26 +0000190 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000191 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000192 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000193 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000194 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000195 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000196 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000197 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000198
Craig Topper3164f332014-03-11 03:39:26 +0000199 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000200 // FIXME: We should return 0 when building kexts.
201 return "__TEXT,__StaticInit,regular,pure_instructions";
202 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000203
John McCalleed64c72012-01-29 01:20:30 +0000204 /// Darwin does not support protected visibility. Darwin's "default"
205 /// is very similar to ELF's "protected"; Darwin requires a "weak"
206 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000207 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000208 return false;
209 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210};
211
Chris Lattner30ba6742009-08-10 19:03:04 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213// DragonFlyBSD Target
214template<typename Target>
215class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
216protected:
Craig Topper3164f332014-03-11 03:39:26 +0000217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
218 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000220 Builder.defineMacro("__DragonFly__");
221 Builder.defineMacro("__DragonFly_cc_version", "100001");
222 Builder.defineMacro("__ELF__");
223 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
224 Builder.defineMacro("__tune_i386__");
225 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226 }
227public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000228 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
229 : OSTargetInfo<Target>(Triple) {
230 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000231
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000239 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Craig Topper3164f332014-03-11 03:39:26 +0000246 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000259
260 // On FreeBSD, wchar_t contains the number of the code point as
261 // used by the character set of the locale. These character sets are
262 // not necessarily a superset of ASCII.
263 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264 }
265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
267 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000268
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 switch (Triple.getArch()) {
270 default:
271 case llvm::Triple::x86:
272 case llvm::Triple::x86_64:
273 this->MCountName = ".mcount";
274 break;
275 case llvm::Triple::mips:
276 case llvm::Triple::mipsel:
277 case llvm::Triple::ppc:
278 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000279 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000280 this->MCountName = "_mcount";
281 break;
282 case llvm::Triple::arm:
283 this->MCountName = "__mcount";
284 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000285 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000286 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287};
288
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000289// GNU/kFreeBSD Target
290template<typename Target>
291class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
292protected:
Craig Topper3164f332014-03-11 03:39:26 +0000293 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
294 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000295 // GNU/kFreeBSD defines; list based off of gcc output
296
297 DefineStd(Builder, "unix", Opts);
298 Builder.defineMacro("__FreeBSD_kernel__");
299 Builder.defineMacro("__GLIBC__");
300 Builder.defineMacro("__ELF__");
301 if (Opts.POSIXThreads)
302 Builder.defineMacro("_REENTRANT");
303 if (Opts.CPlusPlus)
304 Builder.defineMacro("_GNU_SOURCE");
305 }
306public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000307 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 this->UserLabelPrefix = "";
309 }
310};
311
Chris Lattner3e2ee142010-07-07 16:01:42 +0000312// Minix Target
313template<typename Target>
314class MinixTargetInfo : public OSTargetInfo<Target> {
315protected:
Craig Topper3164f332014-03-11 03:39:26 +0000316 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000318 // Minix defines
319
320 Builder.defineMacro("__minix", "3");
321 Builder.defineMacro("_EM_WSIZE", "4");
322 Builder.defineMacro("_EM_PSIZE", "4");
323 Builder.defineMacro("_EM_SSIZE", "2");
324 Builder.defineMacro("_EM_LSIZE", "4");
325 Builder.defineMacro("_EM_FSIZE", "4");
326 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000327 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000328 DefineStd(Builder, "unix", Opts);
329 }
330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000331 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
332 this->UserLabelPrefix = "";
333 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000334};
335
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336// Linux target
337template<typename Target>
338class LinuxTargetInfo : public OSTargetInfo<Target> {
339protected:
Craig Topper3164f332014-03-11 03:39:26 +0000340 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
341 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 DefineStd(Builder, "unix", Opts);
344 DefineStd(Builder, "linux", Opts);
345 Builder.defineMacro("__gnu_linux__");
346 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000347 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000348 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000349 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000350 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000351 if (Opts.CPlusPlus)
352 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000353 }
354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000355 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000357 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000358
359 switch (Triple.getArch()) {
360 default:
361 break;
362 case llvm::Triple::ppc:
363 case llvm::Triple::ppc64:
364 case llvm::Triple::ppc64le:
365 this->MCountName = "_mcount";
366 break;
367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000369
Craig Topper3164f332014-03-11 03:39:26 +0000370 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000371 return ".text.startup";
372 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373};
374
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000375// NetBSD Target
376template<typename Target>
377class NetBSDTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000381 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 Builder.defineMacro("__NetBSD__");
383 Builder.defineMacro("__unix__");
384 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000387
388 switch (Triple.getArch()) {
389 default:
390 break;
391 case llvm::Triple::arm:
392 case llvm::Triple::armeb:
393 case llvm::Triple::thumb:
394 case llvm::Triple::thumbeb:
395 Builder.defineMacro("__ARM_DWARF_EH__");
396 break;
397 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000398 }
399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000400 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
401 this->UserLabelPrefix = "";
402 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000403};
404
Torok Edwinb2b37c62009-06-30 17:10:35 +0000405// OpenBSD Target
406template<typename Target>
407class OpenBSDTargetInfo : public OSTargetInfo<Target> {
408protected:
Craig Topper3164f332014-03-11 03:39:26 +0000409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000411 // OpenBSD defines; list based off of gcc output
412
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000413 Builder.defineMacro("__OpenBSD__");
414 DefineStd(Builder, "unix", Opts);
415 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000416 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000417 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000423
Eli Friedman3715d1f2011-12-15 02:15:56 +0000424 switch (Triple.getArch()) {
425 default:
426 case llvm::Triple::x86:
427 case llvm::Triple::x86_64:
428 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000429 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000430 this->MCountName = "__mcount";
431 break;
432 case llvm::Triple::mips64:
433 case llvm::Triple::mips64el:
434 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000435 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000436 this->MCountName = "_mcount";
437 break;
438 }
439 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000440};
441
Eli Friedman9fa28852012-08-08 23:57:20 +0000442// Bitrig Target
443template<typename Target>
444class BitrigTargetInfo : public OSTargetInfo<Target> {
445protected:
Craig Topper3164f332014-03-11 03:39:26 +0000446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000448 // Bitrig defines; list based off of gcc output
449
450 Builder.defineMacro("__Bitrig__");
451 DefineStd(Builder, "unix", Opts);
452 Builder.defineMacro("__ELF__");
453 if (Opts.POSIXThreads)
454 Builder.defineMacro("_REENTRANT");
455 }
456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000457 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
458 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000459 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000460 }
461};
462
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463// PSP Target
464template<typename Target>
465class PSPTargetInfo : public OSTargetInfo<Target> {
466protected:
Craig Topper3164f332014-03-11 03:39:26 +0000467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000469 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("PSP");
471 Builder.defineMacro("_PSP");
472 Builder.defineMacro("__psp__");
473 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000474 }
475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000476 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000477 this->UserLabelPrefix = "";
478 }
479};
480
John Thompsone467e192009-11-19 17:18:50 +0000481// PS3 PPU Target
482template<typename Target>
483class PS3PPUTargetInfo : public OSTargetInfo<Target> {
484protected:
Craig Topper3164f332014-03-11 03:39:26 +0000485 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
486 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000487 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000488 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("__PPU__");
490 Builder.defineMacro("__CELLOS_LV2__");
491 Builder.defineMacro("__ELF__");
492 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000493 Builder.defineMacro("_ARCH_PPC64");
494 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000495 }
496public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000497 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000498 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000499 this->LongWidth = this->LongAlign = 32;
500 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000501 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000502 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000503 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000504 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000505 }
506};
507
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000508// AuroraUX target
509template<typename Target>
510class AuroraUXTargetInfo : public OSTargetInfo<Target> {
511protected:
Craig Topper3164f332014-03-11 03:39:26 +0000512 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
513 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000514 DefineStd(Builder, "sun", Opts);
515 DefineStd(Builder, "unix", Opts);
516 Builder.defineMacro("__ELF__");
517 Builder.defineMacro("__svr4__");
518 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000519 }
520public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000521 AuroraUXTargetInfo(const llvm::Triple &Triple)
522 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000523 this->UserLabelPrefix = "";
524 this->WCharType = this->SignedLong;
525 // FIXME: WIntType should be SignedLong
526 }
527};
528
Torok Edwinb2b37c62009-06-30 17:10:35 +0000529// Solaris target
530template<typename Target>
531class SolarisTargetInfo : public OSTargetInfo<Target> {
532protected:
Craig Topper3164f332014-03-11 03:39:26 +0000533 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
534 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000535 DefineStd(Builder, "sun", Opts);
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__svr4__");
539 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000540 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
541 // newer, but to 500 for everything else. feature_test.h has a check to
542 // ensure that you are not using C99 with an old version of X/Open or C89
543 // with a new version.
544 if (Opts.C99 || Opts.C11)
545 Builder.defineMacro("_XOPEN_SOURCE", "600");
546 else
547 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000548 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000549 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000550 Builder.defineMacro("_LARGEFILE_SOURCE");
551 Builder.defineMacro("_LARGEFILE64_SOURCE");
552 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000553 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000554 }
555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000556 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000557 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000558 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000559 // FIXME: WIntType should be SignedLong
560 }
561};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000562
563// Windows target
564template<typename Target>
565class WindowsTargetInfo : public OSTargetInfo<Target> {
566protected:
Craig Topper3164f332014-03-11 03:39:26 +0000567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000569 Builder.defineMacro("_WIN32");
570 }
571 void getVisualStudioDefines(const LangOptions &Opts,
572 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000573 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000574 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000575 Builder.defineMacro("_CPPRTTI");
576
577 if (Opts.Exceptions)
578 Builder.defineMacro("_CPPUNWIND");
579 }
580
581 if (!Opts.CharIsSigned)
582 Builder.defineMacro("_CHAR_UNSIGNED");
583
584 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
585 // but it works for now.
586 if (Opts.POSIXThreads)
587 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000588
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000589 if (Opts.MSCompatibilityVersion) {
590 Builder.defineMacro("_MSC_VER",
591 Twine(Opts.MSCompatibilityVersion / 100000));
592 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000593 // FIXME We cannot encode the revision information into 32-bits
594 Builder.defineMacro("_MSC_BUILD", Twine(1));
595 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000596
597 if (Opts.MicrosoftExt) {
598 Builder.defineMacro("_MSC_EXTENSIONS");
599
600 if (Opts.CPlusPlus11) {
601 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
602 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
603 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
604 }
605 }
606
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000607 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000608 }
609
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000610public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000611 WindowsTargetInfo(const llvm::Triple &Triple)
612 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000613};
614
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000615template <typename Target>
616class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000617protected:
Craig Topper3164f332014-03-11 03:39:26 +0000618 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
619 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000620 if (Opts.POSIXThreads)
621 Builder.defineMacro("_REENTRANT");
622 if (Opts.CPlusPlus)
623 Builder.defineMacro("_GNU_SOURCE");
624
625 DefineStd(Builder, "unix", Opts);
626 Builder.defineMacro("__ELF__");
627 Builder.defineMacro("__native_client__");
628 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000629
630public:
631 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000632 this->UserLabelPrefix = "";
633 this->LongAlign = 32;
634 this->LongWidth = 32;
635 this->PointerAlign = 32;
636 this->PointerWidth = 32;
637 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000638 this->Int64Type = TargetInfo::SignedLongLong;
639 this->DoubleAlign = 64;
640 this->LongDoubleWidth = 64;
641 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000642 this->LongLongWidth = 64;
643 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000644 this->SizeType = TargetInfo::UnsignedInt;
645 this->PtrDiffType = TargetInfo::SignedInt;
646 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000647 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000648 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000649 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000650 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000651 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000652 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000653 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000654 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000655 } else if (Triple.getArch() == llvm::Triple::mipsel) {
656 // Handled on mips' setDescriptionString.
657 } else {
658 assert(Triple.getArch() == llvm::Triple::le32);
659 this->DescriptionString = "e-p:32:32-i64:64";
660 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661 }
Craig Topper3164f332014-03-11 03:39:26 +0000662 typename Target::CallingConvCheckResult checkCallingConvention(
663 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000664 return CC == CC_PnaclCall ? Target::CCCR_OK :
665 Target::checkCallingConvention(CC);
666 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000667};
Mike Stump11289f42009-09-09 15:08:12 +0000668} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000669
Chris Lattner09d98f52008-10-05 21:50:58 +0000670//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000671// Specific target implementations.
672//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000673
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000674namespace {
675// PPC abstract base class
676class PPCTargetInfo : public TargetInfo {
677 static const Builtin::Info BuiltinInfo[];
678 static const char * const GCCRegNames[];
679 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000680 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000681
682 // Target cpu features.
683 bool HasVSX;
684
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000685public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000686 PPCTargetInfo(const llvm::Triple &Triple)
687 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000688 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000689 LongDoubleWidth = LongDoubleAlign = 128;
690 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
691 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000692
Hal Finkel6b984f02012-07-03 16:51:04 +0000693 /// \brief Flags for architecture specific defines.
694 typedef enum {
695 ArchDefineNone = 0,
696 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
697 ArchDefinePpcgr = 1 << 1,
698 ArchDefinePpcsq = 1 << 2,
699 ArchDefine440 = 1 << 3,
700 ArchDefine603 = 1 << 4,
701 ArchDefine604 = 1 << 5,
702 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000703 ArchDefinePwr5 = 1 << 7,
704 ArchDefinePwr5x = 1 << 8,
705 ArchDefinePwr6 = 1 << 9,
706 ArchDefinePwr6x = 1 << 10,
707 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000708 ArchDefinePwr8 = 1 << 12,
709 ArchDefineA2 = 1 << 13,
710 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000711 } ArchDefineTypes;
712
Bill Schmidt38378a02013-02-01 20:23:10 +0000713 // Note: GCC recognizes the following additional cpus:
714 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
715 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
716 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000717 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000718 bool CPUKnown = llvm::StringSwitch<bool>(Name)
719 .Case("generic", true)
720 .Case("440", true)
721 .Case("450", true)
722 .Case("601", true)
723 .Case("602", true)
724 .Case("603", true)
725 .Case("603e", true)
726 .Case("603ev", true)
727 .Case("604", true)
728 .Case("604e", true)
729 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000730 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000731 .Case("g3", true)
732 .Case("7400", true)
733 .Case("g4", true)
734 .Case("7450", true)
735 .Case("g4+", true)
736 .Case("750", true)
737 .Case("970", true)
738 .Case("g5", true)
739 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000740 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000741 .Case("e500mc", true)
742 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000743 .Case("power3", true)
744 .Case("pwr3", true)
745 .Case("power4", true)
746 .Case("pwr4", true)
747 .Case("power5", true)
748 .Case("pwr5", true)
749 .Case("power5x", true)
750 .Case("pwr5x", true)
751 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000752 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000753 .Case("power6x", true)
754 .Case("pwr6x", true)
755 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000756 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000757 .Case("power8", true)
758 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000759 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000761 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000762 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000763 .Case("powerpc64le", true)
764 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000765 .Default(false);
766
767 if (CPUKnown)
768 CPU = Name;
769
770 return CPUKnown;
771 }
772
Craig Topper3164f332014-03-11 03:39:26 +0000773 void getTargetBuiltins(const Builtin::Info *&Records,
774 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000775 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000776 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000777 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000778
Craig Topper3164f332014-03-11 03:39:26 +0000779 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000780
Craig Topper3164f332014-03-11 03:39:26 +0000781 void getTargetDefines(const LangOptions &Opts,
782 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000783
Craig Topper3164f332014-03-11 03:39:26 +0000784 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000785
Craig Topper3164f332014-03-11 03:39:26 +0000786 bool handleTargetFeatures(std::vector<std::string> &Features,
787 DiagnosticsEngine &Diags) override;
788 bool hasFeature(StringRef Feature) const override;
789
790 void getGCCRegNames(const char * const *&Names,
791 unsigned &NumNames) const override;
792 void getGCCRegAliases(const GCCRegAlias *&Aliases,
793 unsigned &NumAliases) const override;
794 bool validateAsmConstraint(const char *&Name,
795 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000796 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000797 default: return false;
798 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000799 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000800 case 'b': // Base register
801 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000802 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000803 break;
804 // FIXME: The following are added to allow parsing.
805 // I just took a guess at what the actions should be.
806 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000807 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000808 case 'v': // Altivec vector register
809 Info.setAllowsRegister();
810 break;
811 case 'w':
812 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000813 case 'd':// VSX vector register to hold vector double data
814 case 'f':// VSX vector register to hold vector float data
815 case 's':// VSX vector register to hold scalar float data
816 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000817 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000818 break;
819 default:
820 return false;
821 }
822 Info.setAllowsRegister();
823 Name++; // Skip over 'w'.
824 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000825 case 'h': // `MQ', `CTR', or `LINK' register
826 case 'q': // `MQ' register
827 case 'c': // `CTR' register
828 case 'l': // `LINK' register
829 case 'x': // `CR' register (condition register) number 0
830 case 'y': // `CR' register (condition register)
831 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000832 Info.setAllowsRegister();
833 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000834 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000835 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 // (use `L' instead for SImode constants)
837 case 'K': // Unsigned 16-bit constant
838 case 'L': // Signed 16-bit constant shifted left 16 bits
839 case 'M': // Constant larger than 31
840 case 'N': // Exact power of 2
841 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000842 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000843 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000844 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000845 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000846 break;
847 case 'm': // Memory operand. Note that on PowerPC targets, m can
848 // include addresses that update the base register. It
849 // is therefore only safe to use `m' in an asm statement
850 // if that asm statement accesses the operand exactly once.
851 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000852 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000854 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000855 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000856 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
857 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000858 // register to be updated.
859 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000860 if (Name[1] != 's')
861 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000862 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000863 // include any automodification of the base register. Unlike
864 // `m', this constraint can be used in asm statements that
865 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000866 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000867 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000868 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000869 break;
870 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000871 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000872 case 'Z': // Memory operand that is an indexed or indirect from a
873 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000874 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000875 Info.setAllowsMemory();
876 Info.setAllowsRegister();
877 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000878 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000879 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000880 // register (`p' is preferable for asm statements)
881 case 'S': // Constant suitable as a 64-bit mask operand
882 case 'T': // Constant suitable as a 32-bit mask operand
883 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000884 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000885 // instructions
886 case 'W': // Vector constant that does not require memory
887 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000888 break;
889 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000890 }
John Thompson07a61a42010-06-24 22:44:13 +0000891 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000892 }
Craig Topper3164f332014-03-11 03:39:26 +0000893 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000894 std::string R;
895 switch (*Constraint) {
896 case 'e':
897 case 'w':
898 // Two-character constraint; add "^" hint for later parsing.
899 R = std::string("^") + std::string(Constraint, 2);
900 Constraint++;
901 break;
902 default:
903 return TargetInfo::convertConstraint(Constraint);
904 }
905 return R;
906 }
Craig Topper3164f332014-03-11 03:39:26 +0000907 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000908 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000909 }
Craig Topper3164f332014-03-11 03:39:26 +0000910 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000911 if (RegNo == 0) return 3;
912 if (RegNo == 1) return 4;
913 return -1;
914 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000915};
Anders Carlssonf511f642007-11-27 04:11:28 +0000916
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000917const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000918#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000919#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000920 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000921#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000922};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000923
Eric Christopher3ff21b32013-10-16 21:26:26 +0000924 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000925/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000926bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000927 DiagnosticsEngine &Diags) {
928 // Remember the maximum enabled sselevel.
929 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
930 // Ignore disabled features.
931 if (Features[i][0] == '-')
932 continue;
933
934 StringRef Feature = StringRef(Features[i]).substr(1);
935
936 if (Feature == "vsx") {
937 HasVSX = true;
938 continue;
939 }
940
941 // TODO: Finish this list and add an assert that we've handled them
942 // all.
943 }
944
945 return true;
946}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000947
Chris Lattnerecd49032009-03-02 22:27:17 +0000948/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
949/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000950void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000951 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000952 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000953 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000954 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000955 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000956 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000957 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000958 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000960 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000961 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000962 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000964
Chris Lattnerecd49032009-03-02 22:27:17 +0000965 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000966 if (getTriple().getArch() == llvm::Triple::ppc64le) {
967 Builder.defineMacro("_LITTLE_ENDIAN");
Will Schmidt22d24352014-03-24 17:27:03 +0000968 Builder.defineMacro("_CALL_ELF","2");
Bill Schmidt778d3872013-07-26 01:36:11 +0000969 } else {
970 if (getTriple().getOS() != llvm::Triple::NetBSD &&
971 getTriple().getOS() != llvm::Triple::OpenBSD)
972 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000973 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000974
Chris Lattnerecd49032009-03-02 22:27:17 +0000975 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000976 Builder.defineMacro("__NATURAL_ALIGNMENT__");
977 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Chris Lattnerecd49032009-03-02 22:27:17 +0000979 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000980 if (LongDoubleWidth == 128)
981 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982
John Thompsone467e192009-11-19 17:18:50 +0000983 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000984 Builder.defineMacro("__VEC__", "10206");
985 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000986 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000987
988 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000989 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
990 .Case("440", ArchDefineName)
991 .Case("450", ArchDefineName | ArchDefine440)
992 .Case("601", ArchDefineName)
993 .Case("602", ArchDefineName | ArchDefinePpcgr)
994 .Case("603", ArchDefineName | ArchDefinePpcgr)
995 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
996 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
997 .Case("604", ArchDefineName | ArchDefinePpcgr)
998 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
999 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001000 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001001 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1002 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1003 .Case("750", ArchDefineName | ArchDefinePpcgr)
1004 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1005 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001006 .Case("a2", ArchDefineA2)
1007 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001008 .Case("pwr3", ArchDefinePpcgr)
1009 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1010 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1011 | ArchDefinePpcsq)
1012 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1013 | ArchDefinePpcgr | ArchDefinePpcsq)
1014 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1015 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1016 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1017 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1018 | ArchDefinePpcsq)
1019 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1020 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001021 | ArchDefinePpcgr | ArchDefinePpcsq)
1022 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1023 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1024 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001025 .Case("power3", ArchDefinePpcgr)
1026 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1027 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1030 | ArchDefinePpcgr | ArchDefinePpcsq)
1031 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1032 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1033 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1034 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1035 | ArchDefinePpcsq)
1036 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1037 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001038 | ArchDefinePpcgr | ArchDefinePpcsq)
1039 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1040 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1041 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001042 .Default(ArchDefineNone);
1043
1044 if (defs & ArchDefineName)
1045 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1046 if (defs & ArchDefinePpcgr)
1047 Builder.defineMacro("_ARCH_PPCGR");
1048 if (defs & ArchDefinePpcsq)
1049 Builder.defineMacro("_ARCH_PPCSQ");
1050 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001051 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001052 if (defs & ArchDefine603)
1053 Builder.defineMacro("_ARCH_603");
1054 if (defs & ArchDefine604)
1055 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001056 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001057 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001058 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001059 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001060 if (defs & ArchDefinePwr5x)
1061 Builder.defineMacro("_ARCH_PWR5X");
1062 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001063 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001064 if (defs & ArchDefinePwr6x)
1065 Builder.defineMacro("_ARCH_PWR6X");
1066 if (defs & ArchDefinePwr7)
1067 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001068 if (defs & ArchDefinePwr8)
1069 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001070 if (defs & ArchDefineA2)
1071 Builder.defineMacro("_ARCH_A2");
1072 if (defs & ArchDefineA2q) {
1073 Builder.defineMacro("_ARCH_A2Q");
1074 Builder.defineMacro("_ARCH_QP");
1075 }
1076
1077 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1078 Builder.defineMacro("__bg__");
1079 Builder.defineMacro("__THW_BLUEGENE__");
1080 Builder.defineMacro("__bgq__");
1081 Builder.defineMacro("__TOS_BGQ__");
1082 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001083
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001084 if (HasVSX)
1085 Builder.defineMacro("__VSX__");
1086
Bill Schmidt38378a02013-02-01 20:23:10 +00001087 // FIXME: The following are not yet generated here by Clang, but are
1088 // generated by GCC:
1089 //
1090 // _SOFT_FLOAT_
1091 // __RECIP_PRECISION__
1092 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001093 // __RECIP__
1094 // __RECIPF__
1095 // __RSQRTE__
1096 // __RSQRTEF__
1097 // _SOFT_DOUBLE_
1098 // __NO_LWSYNC__
1099 // __HAVE_BSWAP__
1100 // __LONGDOUBLE128
1101 // __CMODEL_MEDIUM__
1102 // __CMODEL_LARGE__
1103 // _CALL_SYSV
1104 // _CALL_DARWIN
1105 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001106}
1107
1108void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1109 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1110 .Case("7400", true)
1111 .Case("g4", true)
1112 .Case("7450", true)
1113 .Case("g4+", true)
1114 .Case("970", true)
1115 .Case("g5", true)
1116 .Case("pwr6", true)
1117 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001118 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001119 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001120 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001121 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001122
1123 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001124}
1125
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001126bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1127 return Feature == "powerpc";
1128}
Chris Lattner17df24e2008-04-21 18:56:49 +00001129
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001130
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001131const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001132 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1133 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1134 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1135 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1136 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1137 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1138 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1139 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001140 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001141 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001142 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001143 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1144 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1145 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1146 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001147 "vrsave", "vscr",
1148 "spe_acc", "spefscr",
1149 "sfp"
1150};
Chris Lattner10a5b382007-01-29 05:24:35 +00001151
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001152void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001153 unsigned &NumNames) const {
1154 Names = GCCRegNames;
1155 NumNames = llvm::array_lengthof(GCCRegNames);
1156}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001157
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1159 // While some of these aliases do map to different registers
1160 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001161 { { "0" }, "r0" },
1162 { { "1"}, "r1" },
1163 { { "2" }, "r2" },
1164 { { "3" }, "r3" },
1165 { { "4" }, "r4" },
1166 { { "5" }, "r5" },
1167 { { "6" }, "r6" },
1168 { { "7" }, "r7" },
1169 { { "8" }, "r8" },
1170 { { "9" }, "r9" },
1171 { { "10" }, "r10" },
1172 { { "11" }, "r11" },
1173 { { "12" }, "r12" },
1174 { { "13" }, "r13" },
1175 { { "14" }, "r14" },
1176 { { "15" }, "r15" },
1177 { { "16" }, "r16" },
1178 { { "17" }, "r17" },
1179 { { "18" }, "r18" },
1180 { { "19" }, "r19" },
1181 { { "20" }, "r20" },
1182 { { "21" }, "r21" },
1183 { { "22" }, "r22" },
1184 { { "23" }, "r23" },
1185 { { "24" }, "r24" },
1186 { { "25" }, "r25" },
1187 { { "26" }, "r26" },
1188 { { "27" }, "r27" },
1189 { { "28" }, "r28" },
1190 { { "29" }, "r29" },
1191 { { "30" }, "r30" },
1192 { { "31" }, "r31" },
1193 { { "fr0" }, "f0" },
1194 { { "fr1" }, "f1" },
1195 { { "fr2" }, "f2" },
1196 { { "fr3" }, "f3" },
1197 { { "fr4" }, "f4" },
1198 { { "fr5" }, "f5" },
1199 { { "fr6" }, "f6" },
1200 { { "fr7" }, "f7" },
1201 { { "fr8" }, "f8" },
1202 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001203 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001204 { { "fr11" }, "f11" },
1205 { { "fr12" }, "f12" },
1206 { { "fr13" }, "f13" },
1207 { { "fr14" }, "f14" },
1208 { { "fr15" }, "f15" },
1209 { { "fr16" }, "f16" },
1210 { { "fr17" }, "f17" },
1211 { { "fr18" }, "f18" },
1212 { { "fr19" }, "f19" },
1213 { { "fr20" }, "f20" },
1214 { { "fr21" }, "f21" },
1215 { { "fr22" }, "f22" },
1216 { { "fr23" }, "f23" },
1217 { { "fr24" }, "f24" },
1218 { { "fr25" }, "f25" },
1219 { { "fr26" }, "f26" },
1220 { { "fr27" }, "f27" },
1221 { { "fr28" }, "f28" },
1222 { { "fr29" }, "f29" },
1223 { { "fr30" }, "f30" },
1224 { { "fr31" }, "f31" },
1225 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001226};
1227
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001229 unsigned &NumAliases) const {
1230 Aliases = GCCRegAliases;
1231 NumAliases = llvm::array_lengthof(GCCRegAliases);
1232}
1233} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001234
Chris Lattner5ba61f02006-10-14 07:39:34 +00001235namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001236class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001237public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001238 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001239 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001240
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001241 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001242 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001243 case llvm::Triple::FreeBSD:
1244 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001245 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001246 PtrDiffType = SignedInt;
1247 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001248 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001249 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001250 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001251 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001252
Roman Divacky3ffe7462012-03-13 19:20:17 +00001253 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1254 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001255 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001256 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001257
1258 // PPC32 supports atomics up to 4 bytes.
1259 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001260 }
1261
Craig Topper3164f332014-03-11 03:39:26 +00001262 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001263 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001264 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001265 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001266};
1267} // end anonymous namespace.
1268
Bill Schmidt778d3872013-07-26 01:36:11 +00001269// Note: ABI differences may eventually require us to have a separate
1270// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001271namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001274 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001275 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001276 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001277 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001278
Roman Divacky3ffe7462012-03-13 19:20:17 +00001279 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1280 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001281 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001282 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001283 } else {
1284 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1285 DescriptionString = "e-m:e-i64:64-n32:64";
1286 } else {
1287 DescriptionString = "E-m:e-i64:64-n32:64";
1288 }
1289}
Benjamin Kramer37196de2012-11-17 17:30:55 +00001290
1291 // PPC64 supports atomics up to 8 bytes.
1292 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001293 }
Craig Topper3164f332014-03-11 03:39:26 +00001294 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001295 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001296 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001297};
1298} // end anonymous namespace.
1299
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001300
1301namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001302class DarwinPPC32TargetInfo :
1303 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001304public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001305 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1306 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001307 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001308 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001309 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001310 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001311 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001312 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001313 }
Craig Topper3164f332014-03-11 03:39:26 +00001314 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001315 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001316 }
1317};
1318
1319class DarwinPPC64TargetInfo :
1320 public DarwinTargetInfo<PPC64TargetInfo> {
1321public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001322 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1323 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001324 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001325 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001326 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001327 }
1328};
1329} // end anonymous namespace.
1330
Chris Lattner5ba61f02006-10-14 07:39:34 +00001331namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001332 static const unsigned NVPTXAddrSpaceMap[] = {
1333 1, // opencl_global
1334 3, // opencl_local
1335 4, // opencl_constant
1336 1, // cuda_device
1337 4, // cuda_constant
1338 3, // cuda_shared
1339 };
1340 class NVPTXTargetInfo : public TargetInfo {
1341 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001342 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001343 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001344 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001345 BigEndian = false;
1346 TLSSupported = false;
1347 LongWidth = LongAlign = 64;
1348 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001349 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001350 // Define available target features
1351 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001352 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001353 }
Craig Topper3164f332014-03-11 03:39:26 +00001354 void getTargetDefines(const LangOptions &Opts,
1355 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001356 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001357 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001358 }
Craig Topper3164f332014-03-11 03:39:26 +00001359 void getTargetBuiltins(const Builtin::Info *&Records,
1360 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001361 Records = BuiltinInfo;
1362 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001363 }
Craig Topper3164f332014-03-11 03:39:26 +00001364 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001365 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001366 }
Craig Topper3164f332014-03-11 03:39:26 +00001367
1368 void getGCCRegNames(const char * const *&Names,
1369 unsigned &NumNames) const override;
1370 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1371 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001372 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001373 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001374 NumAliases = 0;
1375 }
Craig Topper3164f332014-03-11 03:39:26 +00001376 bool validateAsmConstraint(const char *&Name,
1377 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001378 switch (*Name) {
1379 default: return false;
1380 case 'c':
1381 case 'h':
1382 case 'r':
1383 case 'l':
1384 case 'f':
1385 case 'd':
1386 Info.setAllowsRegister();
1387 return true;
1388 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001389 }
Craig Topper3164f332014-03-11 03:39:26 +00001390 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001391 // FIXME: Is this really right?
1392 return "";
1393 }
Craig Topper3164f332014-03-11 03:39:26 +00001394 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001396 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 }
Craig Topper3164f332014-03-11 03:39:26 +00001398 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001399 bool Valid = llvm::StringSwitch<bool>(Name)
1400 .Case("sm_20", true)
1401 .Case("sm_21", true)
1402 .Case("sm_30", true)
1403 .Case("sm_35", true)
1404 .Default(false);
1405
1406 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001407 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001408 };
1409
1410 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1411#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1412#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1413 ALL_LANGUAGES },
1414#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001415 };
1416
1417 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1418 "r0"
1419 };
1420
1421 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1422 unsigned &NumNames) const {
1423 Names = GCCRegNames;
1424 NumNames = llvm::array_lengthof(GCCRegNames);
1425 }
1426
1427 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1428 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001429 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001430 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001431 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1432 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001433 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001434 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001435 };
1436
1437 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1438 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001439 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001440 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001441 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1442 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001443 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001444 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001445 };
1446}
1447
1448namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001449
1450static const unsigned R600AddrSpaceMap[] = {
1451 1, // opencl_global
1452 3, // opencl_local
1453 2, // opencl_constant
1454 1, // cuda_device
1455 2, // cuda_constant
1456 3 // cuda_shared
1457};
1458
Tom Stellardc74b1e02013-03-04 17:40:53 +00001459static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001460 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1461 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001462
1463static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001464 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1465 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001466
1467static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001468 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001469 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1470 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001471
Eli Friedmand13b41e2012-10-12 23:32:00 +00001472class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001473 static const Builtin::Info BuiltinInfo[];
1474
Tom Stellardc74b1e02013-03-04 17:40:53 +00001475 /// \brief The GPU profiles supported by the R600 target.
1476 enum GPUKind {
1477 GK_NONE,
1478 GK_R600,
1479 GK_R600_DOUBLE_OPS,
1480 GK_R700,
1481 GK_R700_DOUBLE_OPS,
1482 GK_EVERGREEN,
1483 GK_EVERGREEN_DOUBLE_OPS,
1484 GK_NORTHERN_ISLANDS,
1485 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001486 GK_SOUTHERN_ISLANDS,
1487 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001488 } GPU;
1489
Eli Friedmand13b41e2012-10-12 23:32:00 +00001490public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001491 R600TargetInfo(const llvm::Triple &Triple)
1492 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001493 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001494 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001495 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001496 }
1497
Craig Topper3164f332014-03-11 03:39:26 +00001498 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001499 return "";
1500 }
1501
Craig Topper3164f332014-03-11 03:39:26 +00001502 void getGCCRegNames(const char * const *&Names,
1503 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001504 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001505 numNames = 0;
1506 }
1507
Craig Topper3164f332014-03-11 03:39:26 +00001508 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1509 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001510 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001511 NumAliases = 0;
1512 }
1513
Craig Topper3164f332014-03-11 03:39:26 +00001514 bool validateAsmConstraint(const char *&Name,
1515 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001516 return true;
1517 }
1518
Craig Topper3164f332014-03-11 03:39:26 +00001519 void getTargetBuiltins(const Builtin::Info *&Records,
1520 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001521 Records = BuiltinInfo;
1522 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001523 }
1524
Craig Topper3164f332014-03-11 03:39:26 +00001525 void getTargetDefines(const LangOptions &Opts,
1526 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001527 Builder.defineMacro("__R600__");
1528 }
1529
Craig Topper3164f332014-03-11 03:39:26 +00001530 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001531 return TargetInfo::CharPtrBuiltinVaList;
1532 }
1533
Craig Topper3164f332014-03-11 03:39:26 +00001534 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001535 GPU = llvm::StringSwitch<GPUKind>(Name)
1536 .Case("r600" , GK_R600)
1537 .Case("rv610", GK_R600)
1538 .Case("rv620", GK_R600)
1539 .Case("rv630", GK_R600)
1540 .Case("rv635", GK_R600)
1541 .Case("rs780", GK_R600)
1542 .Case("rs880", GK_R600)
1543 .Case("rv670", GK_R600_DOUBLE_OPS)
1544 .Case("rv710", GK_R700)
1545 .Case("rv730", GK_R700)
1546 .Case("rv740", GK_R700_DOUBLE_OPS)
1547 .Case("rv770", GK_R700_DOUBLE_OPS)
1548 .Case("palm", GK_EVERGREEN)
1549 .Case("cedar", GK_EVERGREEN)
1550 .Case("sumo", GK_EVERGREEN)
1551 .Case("sumo2", GK_EVERGREEN)
1552 .Case("redwood", GK_EVERGREEN)
1553 .Case("juniper", GK_EVERGREEN)
1554 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1555 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1556 .Case("barts", GK_NORTHERN_ISLANDS)
1557 .Case("turks", GK_NORTHERN_ISLANDS)
1558 .Case("caicos", GK_NORTHERN_ISLANDS)
1559 .Case("cayman", GK_CAYMAN)
1560 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001561 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001562 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1563 .Case("verde", GK_SOUTHERN_ISLANDS)
1564 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001565 .Case("bonaire", GK_SEA_ISLANDS)
1566 .Case("kabini", GK_SEA_ISLANDS)
1567 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001568 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001569 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001570 .Default(GK_NONE);
1571
1572 if (GPU == GK_NONE) {
1573 return false;
1574 }
1575
1576 // Set the correct data layout
1577 switch (GPU) {
1578 case GK_NONE:
1579 case GK_R600:
1580 case GK_R700:
1581 case GK_EVERGREEN:
1582 case GK_NORTHERN_ISLANDS:
1583 DescriptionString = DescriptionStringR600;
1584 break;
1585 case GK_R600_DOUBLE_OPS:
1586 case GK_R700_DOUBLE_OPS:
1587 case GK_EVERGREEN_DOUBLE_OPS:
1588 case GK_CAYMAN:
1589 DescriptionString = DescriptionStringR600DoubleOps;
1590 break;
1591 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001592 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001593 DescriptionString = DescriptionStringSI;
1594 break;
1595 }
1596
1597 return true;
1598 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001599};
1600
Matt Arsenault56f008d2014-06-24 20:45:01 +00001601const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1602#define BUILTIN(ID, TYPE, ATTRS) \
1603 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1604#include "clang/Basic/BuiltinsR600.def"
1605};
1606
Eli Friedmand13b41e2012-10-12 23:32:00 +00001607} // end anonymous namespace
1608
1609namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001610// Namespace for x86 abstract base class
1611const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001612#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001613#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001614 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001615#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001616};
Eli Friedmanb5366062008-05-20 14:21:01 +00001617
Nuno Lopescfca1f02009-12-23 17:49:57 +00001618static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001619 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1620 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001621 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001622 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1623 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1624 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001625 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001626 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1627 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001628};
1629
Eric Christophercdd36352011-06-21 00:05:20 +00001630const TargetInfo::AddlRegName AddlRegNames[] = {
1631 { { "al", "ah", "eax", "rax" }, 0 },
1632 { { "bl", "bh", "ebx", "rbx" }, 3 },
1633 { { "cl", "ch", "ecx", "rcx" }, 2 },
1634 { { "dl", "dh", "edx", "rdx" }, 1 },
1635 { { "esi", "rsi" }, 4 },
1636 { { "edi", "rdi" }, 5 },
1637 { { "esp", "rsp" }, 7 },
1638 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001639};
1640
1641// X86 target abstract base class; x86-32 and x86-64 are very close, so
1642// most of the implementation can be shared.
1643class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001644 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001645 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001646 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001647 enum MMX3DNowEnum {
1648 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1649 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001650 enum XOPEnum {
1651 NoXOP,
1652 SSE4A,
1653 FMA4,
1654 XOP
1655 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001656
Eric Christophere1ddaf92010-04-02 23:50:19 +00001657 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001658 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001659 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001660 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001661 bool HasBMI;
1662 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001663 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001664 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001665 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001666 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001667 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001668 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001669 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001670 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001671 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001672 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001673
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001674 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1675 ///
1676 /// Each enumeration represents a particular CPU supported by Clang. These
1677 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1678 enum CPUKind {
1679 CK_Generic,
1680
1681 /// \name i386
1682 /// i386-generation processors.
1683 //@{
1684 CK_i386,
1685 //@}
1686
1687 /// \name i486
1688 /// i486-generation processors.
1689 //@{
1690 CK_i486,
1691 CK_WinChipC6,
1692 CK_WinChip2,
1693 CK_C3,
1694 //@}
1695
1696 /// \name i586
1697 /// i586-generation processors, P5 microarchitecture based.
1698 //@{
1699 CK_i586,
1700 CK_Pentium,
1701 CK_PentiumMMX,
1702 //@}
1703
1704 /// \name i686
1705 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1706 //@{
1707 CK_i686,
1708 CK_PentiumPro,
1709 CK_Pentium2,
1710 CK_Pentium3,
1711 CK_Pentium3M,
1712 CK_PentiumM,
1713 CK_C3_2,
1714
1715 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1716 /// Clang however has some logic to suport this.
1717 // FIXME: Warn, deprecate, and potentially remove this.
1718 CK_Yonah,
1719 //@}
1720
1721 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001722 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001723 //@{
1724 CK_Pentium4,
1725 CK_Pentium4M,
1726 CK_Prescott,
1727 CK_Nocona,
1728 //@}
1729
1730 /// \name Core
1731 /// Core microarchitecture based processors.
1732 //@{
1733 CK_Core2,
1734
1735 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1736 /// codename which GCC no longer accepts as an option to -march, but Clang
1737 /// has some logic for recognizing it.
1738 // FIXME: Warn, deprecate, and potentially remove this.
1739 CK_Penryn,
1740 //@}
1741
1742 /// \name Atom
1743 /// Atom processors
1744 //@{
1745 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001746 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001747 //@}
1748
1749 /// \name Nehalem
1750 /// Nehalem microarchitecture based processors.
1751 //@{
1752 CK_Corei7,
1753 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001754 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001755 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001756 //@}
1757
Craig Topper449314e2013-08-20 07:09:39 +00001758 /// \name Knights Landing
1759 /// Knights Landing processor.
1760 CK_KNL,
1761
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001762 /// \name K6
1763 /// K6 architecture processors.
1764 //@{
1765 CK_K6,
1766 CK_K6_2,
1767 CK_K6_3,
1768 //@}
1769
1770 /// \name K7
1771 /// K7 architecture processors.
1772 //@{
1773 CK_Athlon,
1774 CK_AthlonThunderbird,
1775 CK_Athlon4,
1776 CK_AthlonXP,
1777 CK_AthlonMP,
1778 //@}
1779
1780 /// \name K8
1781 /// K8 architecture processors.
1782 //@{
1783 CK_Athlon64,
1784 CK_Athlon64SSE3,
1785 CK_AthlonFX,
1786 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001787 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001788 CK_Opteron,
1789 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001790 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001791 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001792
Benjamin Kramer569f2152012-01-10 11:50:18 +00001793 /// \name Bobcat
1794 /// Bobcat architecture processors.
1795 //@{
1796 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001797 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001798 //@}
1799
1800 /// \name Bulldozer
1801 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001802 //@{
1803 CK_BDVER1,
1804 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001805 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001806 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001807 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001808
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001809 /// This specification is deprecated and will be removed in the future.
1810 /// Users should prefer \see CK_K8.
1811 // FIXME: Warn on this when the CPU is set to it.
1812 CK_x86_64,
1813 //@}
1814
1815 /// \name Geode
1816 /// Geode processors.
1817 //@{
1818 CK_Geode
1819 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001820 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001821
Rafael Espindolaeb265472013-08-21 21:59:03 +00001822 enum FPMathKind {
1823 FP_Default,
1824 FP_SSE,
1825 FP_387
1826 } FPMath;
1827
Eli Friedman3fd920a2008-08-20 02:34:37 +00001828public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001829 X86TargetInfo(const llvm::Triple &Triple)
1830 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001831 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1832 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001833 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1834 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001835 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1836 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001837 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001838 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001839 }
Craig Topper3164f332014-03-11 03:39:26 +00001840 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001841 // X87 evaluates with 80 bits "long double" precision.
1842 return SSELevel == NoSSE ? 2 : 0;
1843 }
Craig Topper3164f332014-03-11 03:39:26 +00001844 void getTargetBuiltins(const Builtin::Info *&Records,
1845 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001846 Records = BuiltinInfo;
1847 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001848 }
Craig Topper3164f332014-03-11 03:39:26 +00001849 void getGCCRegNames(const char * const *&Names,
1850 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001851 Names = GCCRegNames;
1852 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001853 }
Craig Topper3164f332014-03-11 03:39:26 +00001854 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1855 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001856 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001857 NumAliases = 0;
1858 }
Craig Topper3164f332014-03-11 03:39:26 +00001859 void getGCCAddlRegNames(const AddlRegName *&Names,
1860 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001861 Names = AddlRegNames;
1862 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001863 }
Craig Topper3164f332014-03-11 03:39:26 +00001864 bool validateAsmConstraint(const char *&Name,
1865 TargetInfo::ConstraintInfo &info) const override;
1866 std::string convertConstraint(const char *&Constraint) const override;
1867 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001868 return "~{dirflag},~{fpsr},~{flags}";
1869 }
Craig Topper3164f332014-03-11 03:39:26 +00001870 void getTargetDefines(const LangOptions &Opts,
1871 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001872 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1873 bool Enabled);
1874 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1875 bool Enabled);
1876 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1877 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001878 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1879 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001880 setFeatureEnabledImpl(Features, Name, Enabled);
1881 }
1882 // This exists purely to cut down on the number of virtual calls in
1883 // getDefaultFeatures which calls this repeatedly.
1884 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1885 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001886 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1887 bool hasFeature(StringRef Feature) const override;
1888 bool handleTargetFeatures(std::vector<std::string> &Features,
1889 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001890 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001891 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001892 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001893 else if (getTriple().getArch() == llvm::Triple::x86 &&
1894 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001895 return "no-mmx";
1896 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001897 }
Craig Topper3164f332014-03-11 03:39:26 +00001898 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001899 CPU = llvm::StringSwitch<CPUKind>(Name)
1900 .Case("i386", CK_i386)
1901 .Case("i486", CK_i486)
1902 .Case("winchip-c6", CK_WinChipC6)
1903 .Case("winchip2", CK_WinChip2)
1904 .Case("c3", CK_C3)
1905 .Case("i586", CK_i586)
1906 .Case("pentium", CK_Pentium)
1907 .Case("pentium-mmx", CK_PentiumMMX)
1908 .Case("i686", CK_i686)
1909 .Case("pentiumpro", CK_PentiumPro)
1910 .Case("pentium2", CK_Pentium2)
1911 .Case("pentium3", CK_Pentium3)
1912 .Case("pentium3m", CK_Pentium3M)
1913 .Case("pentium-m", CK_PentiumM)
1914 .Case("c3-2", CK_C3_2)
1915 .Case("yonah", CK_Yonah)
1916 .Case("pentium4", CK_Pentium4)
1917 .Case("pentium4m", CK_Pentium4M)
1918 .Case("prescott", CK_Prescott)
1919 .Case("nocona", CK_Nocona)
1920 .Case("core2", CK_Core2)
1921 .Case("penryn", CK_Penryn)
1922 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001923 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001924 .Case("corei7", CK_Corei7)
1925 .Case("corei7-avx", CK_Corei7AVX)
1926 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001927 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001928 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001929 .Case("k6", CK_K6)
1930 .Case("k6-2", CK_K6_2)
1931 .Case("k6-3", CK_K6_3)
1932 .Case("athlon", CK_Athlon)
1933 .Case("athlon-tbird", CK_AthlonThunderbird)
1934 .Case("athlon-4", CK_Athlon4)
1935 .Case("athlon-xp", CK_AthlonXP)
1936 .Case("athlon-mp", CK_AthlonMP)
1937 .Case("athlon64", CK_Athlon64)
1938 .Case("athlon64-sse3", CK_Athlon64SSE3)
1939 .Case("athlon-fx", CK_AthlonFX)
1940 .Case("k8", CK_K8)
1941 .Case("k8-sse3", CK_K8SSE3)
1942 .Case("opteron", CK_Opteron)
1943 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001944 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001945 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001946 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001947 .Case("bdver1", CK_BDVER1)
1948 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001949 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001950 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001951 .Case("x86-64", CK_x86_64)
1952 .Case("geode", CK_Geode)
1953 .Default(CK_Generic);
1954
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001955 // Perform any per-CPU checks necessary to determine if this CPU is
1956 // acceptable.
1957 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1958 // invalid without explaining *why*.
1959 switch (CPU) {
1960 case CK_Generic:
1961 // No processor selected!
1962 return false;
1963
1964 case CK_i386:
1965 case CK_i486:
1966 case CK_WinChipC6:
1967 case CK_WinChip2:
1968 case CK_C3:
1969 case CK_i586:
1970 case CK_Pentium:
1971 case CK_PentiumMMX:
1972 case CK_i686:
1973 case CK_PentiumPro:
1974 case CK_Pentium2:
1975 case CK_Pentium3:
1976 case CK_Pentium3M:
1977 case CK_PentiumM:
1978 case CK_Yonah:
1979 case CK_C3_2:
1980 case CK_Pentium4:
1981 case CK_Pentium4M:
1982 case CK_Prescott:
1983 case CK_K6:
1984 case CK_K6_2:
1985 case CK_K6_3:
1986 case CK_Athlon:
1987 case CK_AthlonThunderbird:
1988 case CK_Athlon4:
1989 case CK_AthlonXP:
1990 case CK_AthlonMP:
1991 case CK_Geode:
1992 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001993 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001994 return false;
1995
1996 // Fallthrough
1997 case CK_Nocona:
1998 case CK_Core2:
1999 case CK_Penryn:
2000 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002001 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002002 case CK_Corei7:
2003 case CK_Corei7AVX:
2004 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002005 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002006 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002007 case CK_Athlon64:
2008 case CK_Athlon64SSE3:
2009 case CK_AthlonFX:
2010 case CK_K8:
2011 case CK_K8SSE3:
2012 case CK_Opteron:
2013 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002014 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002015 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002016 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002017 case CK_BDVER1:
2018 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002019 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002020 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002021 case CK_x86_64:
2022 return true;
2023 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002024 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002025 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002026
Craig Topper3164f332014-03-11 03:39:26 +00002027 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002028
Craig Topper3164f332014-03-11 03:39:26 +00002029 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002030 // We accept all non-ARM calling conventions
2031 return (CC == CC_X86ThisCall ||
2032 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002033 CC == CC_X86StdCall ||
2034 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002035 CC == CC_X86Pascal ||
2036 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002037 }
2038
Craig Topper3164f332014-03-11 03:39:26 +00002039 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002040 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002041 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002042};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002043
Rafael Espindolaeb265472013-08-21 21:59:03 +00002044bool X86TargetInfo::setFPMath(StringRef Name) {
2045 if (Name == "387") {
2046 FPMath = FP_387;
2047 return true;
2048 }
2049 if (Name == "sse") {
2050 FPMath = FP_SSE;
2051 return true;
2052 }
2053 return false;
2054}
2055
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002056void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002057 // FIXME: This *really* should not be here.
2058
2059 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002060 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002061 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002062
Chandler Carruth212334f2011-09-28 08:55:37 +00002063 switch (CPU) {
2064 case CK_Generic:
2065 case CK_i386:
2066 case CK_i486:
2067 case CK_i586:
2068 case CK_Pentium:
2069 case CK_i686:
2070 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002071 break;
2072 case CK_PentiumMMX:
2073 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002074 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 break;
2076 case CK_Pentium3:
2077 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002078 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002079 break;
2080 case CK_PentiumM:
2081 case CK_Pentium4:
2082 case CK_Pentium4M:
2083 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002084 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002085 break;
2086 case CK_Yonah:
2087 case CK_Prescott:
2088 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002089 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002090 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002091 break;
2092 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002093 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002094 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002095 break;
2096 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002097 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002098 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002099 break;
2100 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002101 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002102 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002103 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002104 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002105 setFeatureEnabledImpl(Features, "sse4.2", true);
2106 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002107 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002108 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002109 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002110 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002111 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002112 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002113 break;
2114 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002115 setFeatureEnabledImpl(Features, "avx", true);
2116 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002117 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002118 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002119 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002121 setFeatureEnabledImpl(Features, "avx", true);
2122 setFeatureEnabledImpl(Features, "aes", true);
2123 setFeatureEnabledImpl(Features, "pclmul", true);
2124 setFeatureEnabledImpl(Features, "rdrnd", true);
2125 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 break;
Craig Topper865fff52011-12-17 19:55:21 +00002127 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002128 setFeatureEnabledImpl(Features, "avx2", true);
2129 setFeatureEnabledImpl(Features, "aes", true);
2130 setFeatureEnabledImpl(Features, "pclmul", true);
2131 setFeatureEnabledImpl(Features, "lzcnt", true);
2132 setFeatureEnabledImpl(Features, "rdrnd", true);
2133 setFeatureEnabledImpl(Features, "f16c", true);
2134 setFeatureEnabledImpl(Features, "bmi", true);
2135 setFeatureEnabledImpl(Features, "bmi2", true);
2136 setFeatureEnabledImpl(Features, "rtm", true);
2137 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002138 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002139 break;
Craig Topper449314e2013-08-20 07:09:39 +00002140 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002141 setFeatureEnabledImpl(Features, "avx512f", true);
2142 setFeatureEnabledImpl(Features, "avx512cd", true);
2143 setFeatureEnabledImpl(Features, "avx512er", true);
2144 setFeatureEnabledImpl(Features, "avx512pf", true);
2145 setFeatureEnabledImpl(Features, "aes", true);
2146 setFeatureEnabledImpl(Features, "pclmul", true);
2147 setFeatureEnabledImpl(Features, "lzcnt", true);
2148 setFeatureEnabledImpl(Features, "rdrnd", true);
2149 setFeatureEnabledImpl(Features, "f16c", true);
2150 setFeatureEnabledImpl(Features, "bmi", true);
2151 setFeatureEnabledImpl(Features, "bmi2", true);
2152 setFeatureEnabledImpl(Features, "rtm", true);
2153 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002154 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002155 case CK_K6:
2156 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002158 break;
2159 case CK_K6_2:
2160 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002161 case CK_WinChip2:
2162 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002163 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002164 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002165 case CK_Athlon:
2166 case CK_AthlonThunderbird:
2167 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002168 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002169 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002170 case CK_Athlon4:
2171 case CK_AthlonXP:
2172 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "sse", true);
2174 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002175 break;
2176 case CK_K8:
2177 case CK_Opteron:
2178 case CK_Athlon64:
2179 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002180 setFeatureEnabledImpl(Features, "sse2", true);
2181 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002182 break;
2183 case CK_K8SSE3:
2184 case CK_OpteronSSE3:
2185 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002186 setFeatureEnabledImpl(Features, "sse3", true);
2187 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002188 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002189 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002190 setFeatureEnabledImpl(Features, "sse3", true);
2191 setFeatureEnabledImpl(Features, "sse4a", true);
2192 setFeatureEnabledImpl(Features, "3dnowa", true);
2193 setFeatureEnabledImpl(Features, "lzcnt", true);
2194 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002195 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002196 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002197 setFeatureEnabledImpl(Features, "ssse3", true);
2198 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002199 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002200 setFeatureEnabledImpl(Features, "lzcnt", true);
2201 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002202 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002203 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002204 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002205 setFeatureEnabledImpl(Features, "avx", true);
2206 setFeatureEnabledImpl(Features, "sse4a", true);
2207 setFeatureEnabledImpl(Features, "lzcnt", true);
2208 setFeatureEnabledImpl(Features, "aes", true);
2209 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002210 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002211 setFeatureEnabledImpl(Features, "bmi", true);
2212 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002213 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002214 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002215 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002216 setFeatureEnabledImpl(Features, "xop", true);
2217 setFeatureEnabledImpl(Features, "lzcnt", true);
2218 setFeatureEnabledImpl(Features, "aes", true);
2219 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002220 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002221 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002222 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002223 case CK_BDVER4:
2224 setFeatureEnabledImpl(Features, "avx2", true);
2225 setFeatureEnabledImpl(Features, "bmi2", true);
2226 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002227 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002228 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002229 setFeatureEnabledImpl(Features, "xop", true);
2230 setFeatureEnabledImpl(Features, "lzcnt", true);
2231 setFeatureEnabledImpl(Features, "aes", true);
2232 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002233 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002234 setFeatureEnabledImpl(Features, "bmi", true);
2235 setFeatureEnabledImpl(Features, "fma", true);
2236 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002237 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002238 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002239 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002240 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002241 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002242 break;
Eli Friedman33465822011-07-08 23:31:17 +00002243 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002244}
2245
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002247 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002248 if (Enabled) {
2249 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002250 case AVX512F:
2251 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002252 case AVX2:
2253 Features["avx2"] = true;
2254 case AVX:
2255 Features["avx"] = true;
2256 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002257 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002258 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002259 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002260 case SSSE3:
2261 Features["ssse3"] = true;
2262 case SSE3:
2263 Features["sse3"] = true;
2264 case SSE2:
2265 Features["sse2"] = true;
2266 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002267 Features["sse"] = true;
2268 case NoSSE:
2269 break;
2270 }
2271 return;
2272 }
2273
2274 switch (Level) {
2275 case NoSSE:
2276 case SSE1:
2277 Features["sse"] = false;
2278 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002279 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2280 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002281 case SSE3:
2282 Features["sse3"] = false;
2283 setXOPLevel(Features, NoXOP, false);
2284 case SSSE3:
2285 Features["ssse3"] = false;
2286 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002287 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002288 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002289 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002290 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002291 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002292 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002293 case AVX2:
2294 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002295 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002296 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2297 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002298 }
2299}
2300
2301void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002302 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002303 if (Enabled) {
2304 switch (Level) {
2305 case AMD3DNowAthlon:
2306 Features["3dnowa"] = true;
2307 case AMD3DNow:
2308 Features["3dnow"] = true;
2309 case MMX:
2310 Features["mmx"] = true;
2311 case NoMMX3DNow:
2312 break;
2313 }
2314 return;
2315 }
2316
2317 switch (Level) {
2318 case NoMMX3DNow:
2319 case MMX:
2320 Features["mmx"] = false;
2321 case AMD3DNow:
2322 Features["3dnow"] = false;
2323 case AMD3DNowAthlon:
2324 Features["3dnowa"] = false;
2325 }
2326}
2327
2328void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002329 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 if (Enabled) {
2331 switch (Level) {
2332 case XOP:
2333 Features["xop"] = true;
2334 case FMA4:
2335 Features["fma4"] = true;
2336 setSSELevel(Features, AVX, true);
2337 case SSE4A:
2338 Features["sse4a"] = true;
2339 setSSELevel(Features, SSE3, true);
2340 case NoXOP:
2341 break;
2342 }
2343 return;
2344 }
2345
2346 switch (Level) {
2347 case NoXOP:
2348 case SSE4A:
2349 Features["sse4a"] = false;
2350 case FMA4:
2351 Features["fma4"] = false;
2352 case XOP:
2353 Features["xop"] = false;
2354 }
2355}
2356
Craig Topper86d79ef2013-09-17 04:51:29 +00002357void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2358 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002359 // FIXME: This *really* should not be here. We need some way of translating
2360 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002361 if (Name == "sse4")
2362 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002363
Rafael Espindolae62e2792013-08-20 13:44:29 +00002364 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002365
Craig Topper29561122013-09-19 01:13:07 +00002366 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002367 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002368 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002369 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002370 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002371 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002372 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002373 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002374 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002375 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002376 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002377 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002378 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002379 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002380 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002381 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002382 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002383 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002384 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002385 if (Enabled)
2386 setSSELevel(Features, SSE2, Enabled);
2387 } else if (Name == "pclmul") {
2388 if (Enabled)
2389 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002390 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002391 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002392 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002393 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002394 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002395 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002396 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002397 if (Enabled)
2398 setSSELevel(Features, AVX512F, Enabled);
2399 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002400 if (Enabled)
2401 setSSELevel(Features, AVX, Enabled);
2402 } else if (Name == "fma4") {
2403 setXOPLevel(Features, FMA4, Enabled);
2404 } else if (Name == "xop") {
2405 setXOPLevel(Features, XOP, Enabled);
2406 } else if (Name == "sse4a") {
2407 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002408 } else if (Name == "f16c") {
2409 if (Enabled)
2410 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002411 } else if (Name == "sha") {
2412 if (Enabled)
2413 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002414 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002415}
2416
Eric Christopher3ff21b32013-10-16 21:26:26 +00002417/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002418/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002419bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002420 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002421 // Remember the maximum enabled sselevel.
2422 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2423 // Ignore disabled features.
2424 if (Features[i][0] == '-')
2425 continue;
2426
Benjamin Kramer27402c62012-03-05 15:10:44 +00002427 StringRef Feature = StringRef(Features[i]).substr(1);
2428
2429 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002430 HasAES = true;
2431 continue;
2432 }
2433
Craig Topper3f122a72012-05-31 05:18:48 +00002434 if (Feature == "pclmul") {
2435 HasPCLMUL = true;
2436 continue;
2437 }
2438
Benjamin Kramer27402c62012-03-05 15:10:44 +00002439 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002440 HasLZCNT = true;
2441 continue;
2442 }
2443
Rafael Espindola89049822013-08-23 20:21:37 +00002444 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002445 HasRDRND = true;
2446 continue;
2447 }
2448
Benjamin Kramer27402c62012-03-05 15:10:44 +00002449 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002450 HasBMI = true;
2451 continue;
2452 }
2453
Benjamin Kramer27402c62012-03-05 15:10:44 +00002454 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002455 HasBMI2 = true;
2456 continue;
2457 }
2458
Benjamin Kramer27402c62012-03-05 15:10:44 +00002459 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002460 HasPOPCNT = true;
2461 continue;
2462 }
2463
Michael Liao625a8752012-11-10 05:17:46 +00002464 if (Feature == "rtm") {
2465 HasRTM = true;
2466 continue;
2467 }
2468
Michael Liao74f4eaf2013-03-26 17:52:08 +00002469 if (Feature == "prfchw") {
2470 HasPRFCHW = true;
2471 continue;
2472 }
2473
Michael Liaoffaae352013-03-29 05:17:55 +00002474 if (Feature == "rdseed") {
2475 HasRDSEED = true;
2476 continue;
2477 }
2478
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002479 if (Feature == "tbm") {
2480 HasTBM = true;
2481 continue;
2482 }
2483
Craig Topperbba778b2012-06-03 21:46:30 +00002484 if (Feature == "fma") {
2485 HasFMA = true;
2486 continue;
2487 }
2488
Manman Rena45358c2012-10-11 00:59:55 +00002489 if (Feature == "f16c") {
2490 HasF16C = true;
2491 continue;
2492 }
2493
Craig Topper679b53a2013-08-21 05:29:10 +00002494 if (Feature == "avx512cd") {
2495 HasAVX512CD = true;
2496 continue;
2497 }
2498
2499 if (Feature == "avx512er") {
2500 HasAVX512ER = true;
2501 continue;
2502 }
2503
2504 if (Feature == "avx512pf") {
2505 HasAVX512PF = true;
2506 continue;
2507 }
2508
Ben Langmuir58078d02013-09-19 13:22:04 +00002509 if (Feature == "sha") {
2510 HasSHA = true;
2511 continue;
2512 }
2513
Nick Lewycky50e8f482013-10-05 20:14:27 +00002514 if (Feature == "cx16") {
2515 HasCX16 = true;
2516 continue;
2517 }
2518
Daniel Dunbar979586e2009-11-11 09:38:56 +00002519 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002520 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002521 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002522 .Case("avx2", AVX2)
2523 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002524 .Case("sse4.2", SSE42)
2525 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002526 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002527 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002528 .Case("sse2", SSE2)
2529 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002530 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002531 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002532
Eli Friedman33465822011-07-08 23:31:17 +00002533 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002534 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002535 .Case("3dnowa", AMD3DNowAthlon)
2536 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002537 .Case("mmx", MMX)
2538 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002539 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002540
2541 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2542 .Case("xop", XOP)
2543 .Case("fma4", FMA4)
2544 .Case("sse4a", SSE4A)
2545 .Default(NoXOP);
2546 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002547 }
Eli Friedman33465822011-07-08 23:31:17 +00002548
Craig Topper7481d8a2013-09-10 06:55:47 +00002549 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2550 // Can't do this earlier because we need to be able to explicitly enable
2551 // popcnt and still disable sse4.2.
2552 if (!HasPOPCNT && SSELevel >= SSE42 &&
2553 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2554 HasPOPCNT = true;
2555 Features.push_back("+popcnt");
2556 }
2557
Yunzhong Gao61089362013-10-16 19:07:02 +00002558 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2559 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2560 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2561 HasPRFCHW = true;
2562 Features.push_back("+prfchw");
2563 }
2564
Rafael Espindolaeb265472013-08-21 21:59:03 +00002565 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2566 // matches the selected sse level.
2567 if (FPMath == FP_SSE && SSELevel < SSE1) {
2568 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2569 return false;
2570 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2571 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2572 return false;
2573 }
2574
Eli Friedman33465822011-07-08 23:31:17 +00002575 // Don't tell the backend if we're turning off mmx; it will end up disabling
2576 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002577 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2578 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002579 std::vector<std::string>::iterator it;
2580 it = std::find(Features.begin(), Features.end(), "-mmx");
2581 if (it != Features.end())
2582 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002583 else if (SSELevel > NoSSE)
2584 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002585 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002586}
Chris Lattnerecd49032009-03-02 22:27:17 +00002587
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002588/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2589/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002590void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002591 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002592 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002593 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002594 Builder.defineMacro("__amd64__");
2595 Builder.defineMacro("__amd64");
2596 Builder.defineMacro("__x86_64");
2597 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002598 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002599 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002600 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002601
Chris Lattnerecd49032009-03-02 22:27:17 +00002602 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002603 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2604 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 switch (CPU) {
2606 case CK_Generic:
2607 break;
2608 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002609 // The rest are coming from the i386 define above.
2610 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 break;
2612 case CK_i486:
2613 case CK_WinChipC6:
2614 case CK_WinChip2:
2615 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002616 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002618 case CK_PentiumMMX:
2619 Builder.defineMacro("__pentium_mmx__");
2620 Builder.defineMacro("__tune_pentium_mmx__");
2621 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 case CK_i586:
2623 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002624 defineCPUMacros(Builder, "i586");
2625 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002627 case CK_Pentium3:
2628 case CK_Pentium3M:
2629 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002630 Builder.defineMacro("__tune_pentium3__");
2631 // Fallthrough
2632 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002634 Builder.defineMacro("__tune_pentium2__");
2635 // Fallthrough
2636 case CK_PentiumPro:
2637 Builder.defineMacro("__tune_i686__");
2638 Builder.defineMacro("__tune_pentiumpro__");
2639 // Fallthrough
2640 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002641 Builder.defineMacro("__i686");
2642 Builder.defineMacro("__i686__");
2643 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2644 Builder.defineMacro("__pentiumpro");
2645 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002646 break;
2647 case CK_Pentium4:
2648 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002649 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002650 break;
2651 case CK_Yonah:
2652 case CK_Prescott:
2653 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002654 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002655 break;
2656 case CK_Core2:
2657 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002658 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
2660 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002661 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002662 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002663 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002664 defineCPUMacros(Builder, "slm");
2665 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 case CK_Corei7:
2667 case CK_Corei7AVX:
2668 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002669 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002670 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002671 break;
Craig Topper449314e2013-08-20 07:09:39 +00002672 case CK_KNL:
2673 defineCPUMacros(Builder, "knl");
2674 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002675 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002676 Builder.defineMacro("__k6_2__");
2677 Builder.defineMacro("__tune_k6_2__");
2678 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002679 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002680 if (CPU != CK_K6_2) { // In case of fallthrough
2681 // FIXME: GCC may be enabling these in cases where some other k6
2682 // architecture is specified but -m3dnow is explicitly provided. The
2683 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002684 Builder.defineMacro("__k6_3__");
2685 Builder.defineMacro("__tune_k6_3__");
2686 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002687 // Fallthrough
2688 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002689 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 break;
2691 case CK_Athlon:
2692 case CK_AthlonThunderbird:
2693 case CK_Athlon4:
2694 case CK_AthlonXP:
2695 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002696 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002697 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002698 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002699 Builder.defineMacro("__tune_athlon_sse__");
2700 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002701 break;
2702 case CK_K8:
2703 case CK_K8SSE3:
2704 case CK_x86_64:
2705 case CK_Opteron:
2706 case CK_OpteronSSE3:
2707 case CK_Athlon64:
2708 case CK_Athlon64SSE3:
2709 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002710 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002711 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002712 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002713 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002714 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002715 case CK_BTVER1:
2716 defineCPUMacros(Builder, "btver1");
2717 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002718 case CK_BTVER2:
2719 defineCPUMacros(Builder, "btver2");
2720 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002721 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002722 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002723 break;
2724 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002725 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002726 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002727 case CK_BDVER3:
2728 defineCPUMacros(Builder, "bdver3");
2729 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002730 case CK_BDVER4:
2731 defineCPUMacros(Builder, "bdver4");
2732 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002733 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002734 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002735 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002736 }
Chris Lattner96e43572009-03-02 22:40:39 +00002737
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002738 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002739 Builder.defineMacro("__REGISTER_PREFIX__", "");
2740
Chris Lattner6df41af2009-04-19 17:32:33 +00002741 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2742 // functions in glibc header files that use FP Stack inline asm which the
2743 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002744 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002745
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002746 if (HasAES)
2747 Builder.defineMacro("__AES__");
2748
Craig Topper3f122a72012-05-31 05:18:48 +00002749 if (HasPCLMUL)
2750 Builder.defineMacro("__PCLMUL__");
2751
Craig Topper22967d42011-12-25 05:06:45 +00002752 if (HasLZCNT)
2753 Builder.defineMacro("__LZCNT__");
2754
Benjamin Kramer1e250392012-07-07 09:39:18 +00002755 if (HasRDRND)
2756 Builder.defineMacro("__RDRND__");
2757
Craig Topper22967d42011-12-25 05:06:45 +00002758 if (HasBMI)
2759 Builder.defineMacro("__BMI__");
2760
2761 if (HasBMI2)
2762 Builder.defineMacro("__BMI2__");
2763
Craig Topper1de83482011-12-29 16:10:46 +00002764 if (HasPOPCNT)
2765 Builder.defineMacro("__POPCNT__");
2766
Michael Liao625a8752012-11-10 05:17:46 +00002767 if (HasRTM)
2768 Builder.defineMacro("__RTM__");
2769
Michael Liao74f4eaf2013-03-26 17:52:08 +00002770 if (HasPRFCHW)
2771 Builder.defineMacro("__PRFCHW__");
2772
Michael Liaoffaae352013-03-29 05:17:55 +00002773 if (HasRDSEED)
2774 Builder.defineMacro("__RDSEED__");
2775
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002776 if (HasTBM)
2777 Builder.defineMacro("__TBM__");
2778
Rafael Espindolae62e2792013-08-20 13:44:29 +00002779 switch (XOPLevel) {
2780 case XOP:
2781 Builder.defineMacro("__XOP__");
2782 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002783 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002784 case SSE4A:
2785 Builder.defineMacro("__SSE4A__");
2786 case NoXOP:
2787 break;
2788 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002789
Craig Topperbba778b2012-06-03 21:46:30 +00002790 if (HasFMA)
2791 Builder.defineMacro("__FMA__");
2792
Manman Rena45358c2012-10-11 00:59:55 +00002793 if (HasF16C)
2794 Builder.defineMacro("__F16C__");
2795
Craig Topper679b53a2013-08-21 05:29:10 +00002796 if (HasAVX512CD)
2797 Builder.defineMacro("__AVX512CD__");
2798 if (HasAVX512ER)
2799 Builder.defineMacro("__AVX512ER__");
2800 if (HasAVX512PF)
2801 Builder.defineMacro("__AVX512PF__");
2802
Ben Langmuir58078d02013-09-19 13:22:04 +00002803 if (HasSHA)
2804 Builder.defineMacro("__SHA__");
2805
Nick Lewycky50e8f482013-10-05 20:14:27 +00002806 if (HasCX16)
2807 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2808
Chris Lattner96e43572009-03-02 22:40:39 +00002809 // Each case falls through to the previous one here.
2810 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002811 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002812 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002813 case AVX2:
2814 Builder.defineMacro("__AVX2__");
2815 case AVX:
2816 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002817 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002818 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002819 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002820 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002821 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002822 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002823 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002824 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002825 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002826 Builder.defineMacro("__SSE2__");
2827 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002828 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002829 Builder.defineMacro("__SSE__");
2830 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002831 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002832 break;
2833 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002834
Derek Schuffc7dd7222012-10-11 15:52:22 +00002835 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002836 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002837 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002838 case AVX2:
2839 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002840 case SSE42:
2841 case SSE41:
2842 case SSSE3:
2843 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002844 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002845 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002846 break;
2847 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002848 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002849 break;
2850 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002851 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002852 }
2853 }
2854
Anders Carlssone437c682010-01-27 03:47:49 +00002855 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002856 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002857 case AMD3DNowAthlon:
2858 Builder.defineMacro("__3dNOW_A__");
2859 case AMD3DNow:
2860 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002861 case MMX:
2862 Builder.defineMacro("__MMX__");
2863 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002864 break;
2865 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002866
2867 if (CPU >= CK_i486) {
2868 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2869 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2870 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2871 }
2872 if (CPU >= CK_i586)
2873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002874}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002875
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002876bool X86TargetInfo::hasFeature(StringRef Feature) const {
2877 return llvm::StringSwitch<bool>(Feature)
2878 .Case("aes", HasAES)
2879 .Case("avx", SSELevel >= AVX)
2880 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002881 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002882 .Case("avx512cd", HasAVX512CD)
2883 .Case("avx512er", HasAVX512ER)
2884 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002885 .Case("bmi", HasBMI)
2886 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002887 .Case("cx16", HasCX16)
2888 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002889 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002890 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002891 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002892 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002893 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002894 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2895 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2896 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002897 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002898 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002899 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002900 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002901 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002902 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002903 .Case("sse", SSELevel >= SSE1)
2904 .Case("sse2", SSELevel >= SSE2)
2905 .Case("sse3", SSELevel >= SSE3)
2906 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002907 .Case("sse4.1", SSELevel >= SSE41)
2908 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002909 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002910 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002911 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2912 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002913 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002914 .Default(false);
2915}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002916
Eli Friedman3fd920a2008-08-20 02:34:37 +00002917bool
Anders Carlsson58436352009-02-28 17:11:49 +00002918X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002919 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002920 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002921 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002922 case 'Y': // first letter of a pair:
2923 switch (*(Name+1)) {
2924 default: return false;
2925 case '0': // First SSE register.
2926 case 't': // Any SSE register, when SSE2 is enabled.
2927 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2928 case 'm': // any MMX register, when inter-unit moves enabled.
2929 break; // falls through to setAllowsRegister.
2930 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00002931 case 'f': // any x87 floating point stack register.
2932 // Constraint 'f' cannot be used for output operands.
2933 if (Info.ConstraintStr[0] == '=')
2934 return false;
2935
2936 Info.setAllowsRegister();
2937 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002938 case 'a': // eax.
2939 case 'b': // ebx.
2940 case 'c': // ecx.
2941 case 'd': // edx.
2942 case 'S': // esi.
2943 case 'D': // edi.
2944 case 'A': // edx:eax.
2945 case 't': // top of floating point stack.
2946 case 'u': // second from top of floating point stack.
2947 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002948 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002949 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002950 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002951 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2952 case 'l': // "Index" registers: any general register that can be used as an
2953 // index in a base+index memory access.
2954 Info.setAllowsRegister();
2955 return true;
2956 case 'C': // SSE floating point constant.
2957 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002958 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002959 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002960 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002961 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002962 return true;
2963 }
2964}
2965
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002966
Eli Friedman3fd920a2008-08-20 02:34:37 +00002967std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002968X86TargetInfo::convertConstraint(const char *&Constraint) const {
2969 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002970 case 'a': return std::string("{ax}");
2971 case 'b': return std::string("{bx}");
2972 case 'c': return std::string("{cx}");
2973 case 'd': return std::string("{dx}");
2974 case 'S': return std::string("{si}");
2975 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002976 case 'p': // address
2977 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002978 case 't': // top of floating point stack.
2979 return std::string("{st}");
2980 case 'u': // second from top of floating point stack.
2981 return std::string("{st(1)}"); // second from top of floating point stack.
2982 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002983 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002984 }
2985}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002986} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002987
2988namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002989// X86-32 generic target
2990class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002991public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002992 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002993 DoubleAlign = LongLongAlign = 32;
2994 LongDoubleWidth = 96;
2995 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002996 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002997 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002998 SizeType = UnsignedInt;
2999 PtrDiffType = SignedInt;
3000 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003001 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003002
3003 // Use fpret for all types.
3004 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3005 (1 << TargetInfo::Double) |
3006 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003007
3008 // x86-32 has atomics up to 8 bytes
3009 // FIXME: Check that we actually have cmpxchg8b before setting
3010 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3011 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003012 }
Craig Topper3164f332014-03-11 03:39:26 +00003013 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003014 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003015 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003016
Craig Topper3164f332014-03-11 03:39:26 +00003017 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003018 if (RegNo == 0) return 0;
3019 if (RegNo == 1) return 2;
3020 return -1;
3021 }
Craig Topper3164f332014-03-11 03:39:26 +00003022 bool validateInputSize(StringRef Constraint,
3023 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003024 switch (Constraint[0]) {
3025 default: break;
3026 case 'a':
3027 case 'b':
3028 case 'c':
3029 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003030 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00003031 }
3032
3033 return true;
3034 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003035};
3036} // end anonymous namespace
3037
3038namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003039class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3040public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003041 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3042 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003043
Craig Topper3164f332014-03-11 03:39:26 +00003044 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003045 unsigned Major, Minor, Micro;
3046 getTriple().getOSVersion(Major, Minor, Micro);
3047 // New NetBSD uses the default rounding mode.
3048 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3049 return X86_32TargetInfo::getFloatEvalMethod();
3050 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003051 return 1;
3052 }
3053};
3054} // end anonymous namespace
3055
3056namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003057class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3058public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003059 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3060 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003061 SizeType = UnsignedLong;
3062 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003063 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003064 }
3065};
3066} // end anonymous namespace
3067
3068namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003069class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3070public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003071 BitrigI386TargetInfo(const llvm::Triple &Triple)
3072 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003073 SizeType = UnsignedLong;
3074 IntPtrType = SignedLong;
3075 PtrDiffType = SignedLong;
3076 }
3077};
3078} // end anonymous namespace
3079
3080namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003081class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003082public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003083 DarwinI386TargetInfo(const llvm::Triple &Triple)
3084 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003085 LongDoubleWidth = 128;
3086 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003087 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003088 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003089 SizeType = UnsignedLong;
3090 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003091 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003092 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003093 }
3094
Eli Friedman3fd920a2008-08-20 02:34:37 +00003095};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003096} // end anonymous namespace
3097
3098namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003099// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003100class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003101public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003102 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3103 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003104 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003105 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003106 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003107 }
Craig Topper3164f332014-03-11 03:39:26 +00003108 void getTargetDefines(const LangOptions &Opts,
3109 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003110 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3111 }
3112};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003113
3114// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003115class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003116public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003117 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003118 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003119 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003120 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3121 }
Craig Topper3164f332014-03-11 03:39:26 +00003122 void getTargetDefines(const LangOptions &Opts,
3123 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003124 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3125 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3126 // The value of the following reflects processor type.
3127 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3128 // We lost the original triple, so we use the default.
3129 Builder.defineMacro("_M_IX86", "600");
3130 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003131};
3132} // end anonymous namespace
3133
Reid Kleckner47606832014-04-21 20:58:00 +00003134static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3135 Builder.defineMacro("__MSVCRT__");
3136 Builder.defineMacro("__MINGW32__");
3137
3138 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3139 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3140 // macro anyway for pre-processor compatibility.
3141 if (Opts.MicrosoftExt)
3142 Builder.defineMacro("__declspec", "__declspec");
3143 else
3144 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3145
3146 if (!Opts.MicrosoftExt) {
3147 // Provide macros for all the calling convention keywords. Provide both
3148 // single and double underscore prefixed variants. These are available on
3149 // x64 as well as x86, even though they have no effect.
3150 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3151 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003152 std::string GCCSpelling = "__attribute__((__";
3153 GCCSpelling += CC;
3154 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003155 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3156 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3157 }
3158 }
3159}
3160
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003161namespace {
3162// x86-32 MinGW target
3163class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3164public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003165 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3166 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003167 void getTargetDefines(const LangOptions &Opts,
3168 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003169 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003170 DefineStd(Builder, "WIN32", Opts);
3171 DefineStd(Builder, "WINNT", Opts);
3172 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003173 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003174 }
3175};
3176} // end anonymous namespace
3177
3178namespace {
3179// x86-32 Cygwin target
3180class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3181public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003182 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3183 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003184 TLSSupported = false;
3185 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003186 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003187 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003188 }
Craig Topper3164f332014-03-11 03:39:26 +00003189 void getTargetDefines(const LangOptions &Opts,
3190 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003191 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003192 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003193 Builder.defineMacro("__CYGWIN__");
3194 Builder.defineMacro("__CYGWIN32__");
3195 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003196 if (Opts.CPlusPlus)
3197 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003198 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003199};
3200} // end anonymous namespace
3201
3202namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003203// x86-32 Haiku target
3204class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3205public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003206 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003207 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003208 IntPtrType = SignedLong;
3209 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003210 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003211 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003212 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003213 }
Craig Topper3164f332014-03-11 03:39:26 +00003214 void getTargetDefines(const LangOptions &Opts,
3215 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003216 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3217 Builder.defineMacro("__INTEL__");
3218 Builder.defineMacro("__HAIKU__");
3219 }
3220};
3221} // end anonymous namespace
3222
Douglas Gregor9fabd852011-07-01 22:41:14 +00003223// RTEMS Target
3224template<typename Target>
3225class RTEMSTargetInfo : public OSTargetInfo<Target> {
3226protected:
Craig Topper3164f332014-03-11 03:39:26 +00003227 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3228 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003229 // RTEMS defines; list based off of gcc output
3230
Douglas Gregor9fabd852011-07-01 22:41:14 +00003231 Builder.defineMacro("__rtems__");
3232 Builder.defineMacro("__ELF__");
3233 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003234
Douglas Gregor9fabd852011-07-01 22:41:14 +00003235public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003236 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3237 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003238
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003239 switch (Triple.getArch()) {
3240 default:
3241 case llvm::Triple::x86:
3242 // this->MCountName = ".mcount";
3243 break;
3244 case llvm::Triple::mips:
3245 case llvm::Triple::mipsel:
3246 case llvm::Triple::ppc:
3247 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003248 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003249 // this->MCountName = "_mcount";
3250 break;
3251 case llvm::Triple::arm:
3252 // this->MCountName = "__mcount";
3253 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003254 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003255 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003256};
3257
3258namespace {
3259// x86-32 RTEMS target
3260class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003262 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003263 SizeType = UnsignedLong;
3264 IntPtrType = SignedLong;
3265 PtrDiffType = SignedLong;
3266 this->UserLabelPrefix = "";
3267 }
Craig Topper3164f332014-03-11 03:39:26 +00003268 void getTargetDefines(const LangOptions &Opts,
3269 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003270 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3271 Builder.defineMacro("__INTEL__");
3272 Builder.defineMacro("__rtems__");
3273 }
3274};
3275} // end anonymous namespace
3276
Chris Lattnerb986aba2010-04-11 19:29:39 +00003277namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003278// x86-64 generic target
3279class X86_64TargetInfo : public X86TargetInfo {
3280public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003281 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003282 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003283 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003284 LongDoubleWidth = 128;
3285 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003286 LargeArrayMinWidth = 128;
3287 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003288 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003289 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3290 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3291 IntPtrType = IsX32 ? SignedInt : SignedLong;
3292 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003293 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003294 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003295
Zinovy Nis1db95732014-07-10 15:27:19 +00003296 DescriptionString = (IsX32)
3297 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3298 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003299
3300 // Use fpret only for long double.
3301 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003302
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003303 // Use fp2ret for _Complex long double.
3304 ComplexLongDoubleUsesFP2Ret = true;
3305
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003306 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003307 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003308 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003309 }
Craig Topper3164f332014-03-11 03:39:26 +00003310 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003311 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003312 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003313
Craig Topper3164f332014-03-11 03:39:26 +00003314 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003315 if (RegNo == 0) return 0;
3316 if (RegNo == 1) return 1;
3317 return -1;
3318 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003319
Craig Topper3164f332014-03-11 03:39:26 +00003320 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003321 return (CC == CC_C ||
3322 CC == CC_IntelOclBicc ||
3323 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003324 }
3325
Craig Topper3164f332014-03-11 03:39:26 +00003326 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003327 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003328 }
3329
Eli Friedman3fd920a2008-08-20 02:34:37 +00003330};
3331} // end anonymous namespace
3332
3333namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003334// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003335class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003337 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3338 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003339 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003340 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003341 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003342 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003343 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003344 SizeType = UnsignedLongLong;
3345 PtrDiffType = SignedLongLong;
3346 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003347 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003348 }
Craig Topper3164f332014-03-11 03:39:26 +00003349 void getTargetDefines(const LangOptions &Opts,
3350 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003351 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003352 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003353 }
Craig Topper3164f332014-03-11 03:39:26 +00003354 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003355 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003356 }
Craig Topper3164f332014-03-11 03:39:26 +00003357 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003358 return (CC == CC_C ||
3359 CC == CC_IntelOclBicc ||
3360 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3361 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003362};
3363} // end anonymous namespace
3364
3365namespace {
3366// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003367class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003368public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003369 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003370 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003371 LongDoubleWidth = LongDoubleAlign = 64;
3372 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003373 }
Craig Topper3164f332014-03-11 03:39:26 +00003374 void getTargetDefines(const LangOptions &Opts,
3375 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003376 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3377 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003378 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003379 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003380 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003381};
3382} // end anonymous namespace
3383
3384namespace {
3385// x86-64 MinGW target
3386class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3387public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003388 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3389 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003390 void getTargetDefines(const LangOptions &Opts,
3391 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003392 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003393 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003394 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003395 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003396 }
3397};
3398} // end anonymous namespace
3399
3400namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003401class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3402public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003403 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3404 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003405 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003406 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003407 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3408 llvm::Triple T = llvm::Triple(Triple);
3409 if (T.getOS() == llvm::Triple::IOS)
3410 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003411 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003412 }
3413};
3414} // end anonymous namespace
3415
3416namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003417class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3418public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003419 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3420 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003421 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003422 Int64Type = SignedLongLong;
3423 }
3424};
3425} // end anonymous namespace
3426
3427namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003428class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3429public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003430 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3431 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3432 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003433 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003434 }
3435};
Tim Northover9bb857a2013-01-31 12:13:10 +00003436}
3437
Eli Friedman9fa28852012-08-08 23:57:20 +00003438
3439namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003440class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003441 // Possible FPU choices.
3442 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003443 VFP2FPU = (1 << 0),
3444 VFP3FPU = (1 << 1),
3445 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003446 NeonFPU = (1 << 3),
3447 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003448 };
3449
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003450 // Possible HWDiv features.
3451 enum HWDivMode {
3452 HWDivThumb = (1 << 0),
3453 HWDivARM = (1 << 1)
3454 };
3455
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003456 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003457 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003458 }
3459
3460 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3461 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003462
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003463 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003464
Rafael Espindolaeb265472013-08-21 21:59:03 +00003465 enum {
3466 FP_Default,
3467 FP_VFP,
3468 FP_Neon
3469 } FPMath;
3470
Bernard Ogdenda13af32013-10-24 18:32:51 +00003471 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003472
Logan Chien57086ce2012-10-10 06:56:20 +00003473 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003474 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003475 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003476
3477 // Initialized via features.
3478 unsigned SoftFloat : 1;
3479 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003480
Bernard Ogden18b57012013-10-29 09:47:51 +00003481 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003482 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003483
Chris Lattner5cc15e02010-03-03 19:03:45 +00003484 static const Builtin::Info BuiltinInfo[];
3485
Rafael Espindola101d5b92013-05-13 20:09:47 +00003486 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003487 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003488 if (T.getArch() == llvm::Triple::arm ||
3489 T.getArch() == llvm::Triple::armeb) {
3490 StringRef VersionStr;
3491 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003492 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003493 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003494 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003495 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003496 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003497 unsigned Version;
3498 if (VersionStr.getAsInteger(10, Version))
3499 return false;
3500 return Version >= 6;
3501 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003502 assert(T.getArch() == llvm::Triple::thumb ||
3503 T.getArch() == llvm::Triple::thumbeb);
3504 StringRef VersionStr;
3505 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003506 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003507 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003508 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003509 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003510 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003511 unsigned Version;
3512 if (VersionStr.getAsInteger(10, Version))
3513 return false;
3514 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003515 }
3516
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003517 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003518 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003519
3520 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003521 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003522
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003523 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003524 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003525 SizeType = UnsignedLong;
3526 else
3527 SizeType = UnsignedInt;
3528
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003529 switch (T.getOS()) {
3530 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003531 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003532 break;
3533 case llvm::Triple::Win32:
3534 WCharType = UnsignedShort;
3535 break;
3536 case llvm::Triple::Linux:
3537 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003538 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3539 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003540 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003541 }
3542
3543 UseBitFieldTypeAlignment = true;
3544
3545 ZeroLengthBitfieldBoundary = 0;
3546
3547 if (IsThumb) {
3548 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3549 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003550 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003551 DescriptionString = BigEndian ?
3552 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3553 "v128:64:128-a:0:32-n32-S64" :
3554 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3555 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003556 } else if (T.isOSWindows()) {
3557 // FIXME: this is invalid for WindowsCE
3558 assert(!BigEndian && "Windows on ARM does not support big endian");
3559 DescriptionString = "e"
3560 "-m:e"
3561 "-p:32:32"
3562 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3563 "-v128:64:128"
3564 "-a:0:32"
3565 "-n32"
3566 "-S64";
3567 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003568 DescriptionString = BigEndian ?
3569 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3570 "v128:64:128-a:0:32-n32-S64" :
3571 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3572 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003573 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003574 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003575 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003576 DescriptionString = BigEndian ?
3577 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3578 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003579 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003580 DescriptionString = BigEndian ?
3581 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3582 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003583 }
3584
3585 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003586 }
3587
3588 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003589 const llvm::Triple &T = getTriple();
3590
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003591 IsAAPCS = false;
3592
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003593 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003594
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003595 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003596 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003597 SizeType = UnsignedInt;
3598 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003599 SizeType = UnsignedLong;
3600
3601 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3602 WCharType = SignedInt;
3603
3604 // Do not respect the alignment of bit-field types when laying out
3605 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3606 UseBitFieldTypeAlignment = false;
3607
3608 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3609 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3610 /// gcc.
3611 ZeroLengthBitfieldBoundary = 32;
3612
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003613 if (IsThumb) {
3614 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3615 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003616 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003617 DescriptionString = BigEndian ?
3618 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3619 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3620 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3621 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003622 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003623 DescriptionString = BigEndian ?
3624 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3625 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3626 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3627 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003628 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003629 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003630 DescriptionString = BigEndian ?
3631 "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003632 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3633 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003634 DescriptionString = BigEndian ?
3635 "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003636 "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003637 }
3638
3639 // FIXME: Override "preferred align" for double and long long.
3640 }
3641
Chris Lattner17df24e2008-04-21 18:56:49 +00003642public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003643 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003644 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3645 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003646 BigEndian = IsBigEndian;
3647
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003648 switch (getTriple().getOS()) {
3649 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003650 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003651 break;
3652 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003653 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003654 break;
3655 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003656
Chris Lattner1a8f3942010-04-23 16:29:58 +00003657 // {} in inline assembly are neon specifiers, not assembly variant
3658 // specifiers.
3659 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003660
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003661 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003662 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003663
3664 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003665
3666 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003667 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003668
3669 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003670 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003671 if (shouldUseInlineAtomic(getTriple()))
3672 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003673
3674 // Do force alignment of members that follow zero length bitfields. If
3675 // the alignment of the zero-length bitfield is greater than the member
3676 // that follows it, `bar', `bar' will be aligned as the type of the
3677 // zero length bitfield.
3678 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003679 }
Alp Toker4925ba72014-06-07 23:30:42 +00003680 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003681 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003682 ABI = Name;
3683
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003684 // The defaults (above) are for AAPCS, check if we need to change them.
3685 //
3686 // FIXME: We need support for -meabi... we could just mangle it into the
3687 // name.
3688 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003689 setABIAPCS();
3690 return true;
3691 }
3692 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3693 setABIAAPCS();
3694 return true;
3695 }
3696 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003697 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003698
Craig Topper3164f332014-03-11 03:39:26 +00003699 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003700 if (IsAAPCS)
3701 Features["aapcs"] = true;
3702 else
3703 Features["apcs"] = true;
3704
Silviu Barangae5690462013-10-21 10:59:33 +00003705 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003706 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3707 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003708 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3709 CPU == "cortex-a9-mp") {
3710 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003711 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003712 }
3713 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003714 Features["vfp4"] = true;
3715 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003716 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3717 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3718 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003719 Features["vfp4"] = true;
3720 Features["neon"] = true;
3721 Features["hwdiv"] = true;
3722 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003723 } else if (CPU == "cyclone") {
3724 Features["v8fp"] = true;
3725 Features["neon"] = true;
3726 Features["hwdiv"] = true;
3727 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003728 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3729 Features["fp-armv8"] = true;
3730 Features["neon"] = true;
3731 Features["hwdiv"] = true;
3732 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003733 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003734 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003735 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003736 // Enable the hwdiv extension for all v8a AArch32 cores by
3737 // default.
3738 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003739 ArchName == "armebv8a" || ArchName == "armebv8" ||
3740 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3741 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003742 Features["hwdiv"] = true;
3743 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003744 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3745 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003746 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003747 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003748
Craig Topper3164f332014-03-11 03:39:26 +00003749 bool handleTargetFeatures(std::vector<std::string> &Features,
3750 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003751 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003752 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003753 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003754 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003755 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003756 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3757 if (Features[i] == "+soft-float")
3758 SoftFloat = true;
3759 else if (Features[i] == "+soft-float-abi")
3760 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003761 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003762 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003763 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003764 FPU |= VFP3FPU;
3765 else if (Features[i] == "+vfp4")
3766 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003767 else if (Features[i] == "+fp-armv8")
3768 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003769 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003770 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003771 else if (Features[i] == "+hwdiv")
3772 HWDiv |= HWDivThumb;
3773 else if (Features[i] == "+hwdiv-arm")
3774 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003775 else if (Features[i] == "+crc")
3776 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003777 else if (Features[i] == "+crypto")
3778 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003779 }
3780
Rafael Espindolaeb265472013-08-21 21:59:03 +00003781 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3782 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3783 return false;
3784 }
3785
3786 if (FPMath == FP_Neon)
3787 Features.push_back("+neonfp");
3788 else if (FPMath == FP_VFP)
3789 Features.push_back("-neonfp");
3790
Daniel Dunbar893d4752009-12-19 04:15:38 +00003791 // Remove front-end specific options which the backend handles differently.
3792 std::vector<std::string>::iterator it;
3793 it = std::find(Features.begin(), Features.end(), "+soft-float");
3794 if (it != Features.end())
3795 Features.erase(it);
3796 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3797 if (it != Features.end())
3798 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003799 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003800 }
3801
Craig Topper3164f332014-03-11 03:39:26 +00003802 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003803 return llvm::StringSwitch<bool>(Feature)
3804 .Case("arm", true)
3805 .Case("softfloat", SoftFloat)
3806 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003807 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003808 .Case("hwdiv", HWDiv & HWDivThumb)
3809 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003810 .Default(false);
3811 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003812 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003813 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003814 return llvm::StringSwitch<const char*>(Name)
3815 .Cases("arm8", "arm810", "4")
3816 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3817 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3818 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3819 .Case("ep9312", "4T")
3820 .Cases("arm10tdmi", "arm1020t", "5T")
3821 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3822 .Case("arm926ej-s", "5TEJ")
3823 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3824 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003825 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003826 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003827 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003828 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003829 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003830 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003831 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003832 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003833 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003834 .Case("cortex-m3", "7M")
3835 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003836 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003837 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003838 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003839 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003840 static const char *getCPUProfile(StringRef Name) {
3841 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003842 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003843 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003844 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003845 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003846 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003847 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003848 }
Craig Topper3164f332014-03-11 03:39:26 +00003849 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003850 if (!getCPUDefineSuffix(Name))
3851 return false;
3852
Tim Northovere8c37212014-07-09 09:24:43 +00003853 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3854 StringRef Profile = getCPUProfile(Name);
3855 if (Profile == "M" && MaxAtomicInlineWidth) {
3856 MaxAtomicPromoteWidth = 32;
3857 MaxAtomicInlineWidth = 32;
3858 }
3859
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003860 CPU = Name;
3861 return true;
3862 }
Craig Topper3164f332014-03-11 03:39:26 +00003863 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003864 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3865 unsigned CPUArchVer) const {
3866 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3867 (CPUArch.find('M') != StringRef::npos);
3868 }
3869 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3870 unsigned CPUArchVer) const {
3871 // We check both CPUArchVer and ArchName because when only triple is
3872 // specified, the default CPU is arm1136j-s.
3873 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3874 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3875 }
Craig Topper3164f332014-03-11 03:39:26 +00003876 void getTargetDefines(const LangOptions &Opts,
3877 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00003878 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003879 Builder.defineMacro("__arm");
3880 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003881
Chris Lattnerecd49032009-03-02 22:27:17 +00003882 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003883 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003884
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003885 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003886 unsigned int CPUArchVer;
3887 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3888 llvm_unreachable("Invalid char for architecture version number");
3889 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003890 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003891
3892 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003893 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003894 StringRef ArchName = getTriple().getArchName();
3895
3896 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3897 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3898
3899 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3900 // is not defined for the M-profile.
3901 // NOTE that the deffault profile is assumed to be 'A'
3902 if (CPUProfile.empty() || CPUProfile != "M")
3903 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3904
3905 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3906 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3907 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3908 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3909 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3910 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3911 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3912
3913 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3914 // instruction set such as ARM or Thumb.
3915 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3916
3917 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3918
3919 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003920 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003921 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003922
Yi Konga44c4d72014-06-27 21:25:42 +00003923 // ACLE predefines.
3924 Builder.defineMacro("__ARM_ACLE", "200");
3925
Mike Stump9d54bd72009-04-08 02:07:04 +00003926 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003927
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003928 // FIXME: It's more complicated than this and we don't really support
3929 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003930 // Windows on ARM does not "support" interworking
3931 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003932 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003933
David Tweed8f676532012-10-25 13:33:01 +00003934 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003935 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003936 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
3937 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003938 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003939 Builder.defineMacro("__ARM_PCS", "1");
3940
David Tweed8f676532012-10-25 13:33:01 +00003941 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003942 Builder.defineMacro("__ARM_PCS_VFP", "1");
3943 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003944
Daniel Dunbar893d4752009-12-19 04:15:38 +00003945 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003946 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003947
3948 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003949 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003950
3951 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003952 Builder.defineMacro("__THUMBEL__");
3953 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003954 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003955 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003956 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003957 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3958 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003959
3960 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003961 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003962
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003963 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003964 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003965 if (FPU & VFP2FPU)
3966 Builder.defineMacro("__ARM_VFPV2__");
3967 if (FPU & VFP3FPU)
3968 Builder.defineMacro("__ARM_VFPV3__");
3969 if (FPU & VFP4FPU)
3970 Builder.defineMacro("__ARM_VFPV4__");
3971 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003972
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003973 // This only gets set when Neon instructions are actually available, unlike
3974 // the VFP define, hence the soft float and arch check. This is subtly
3975 // different from gcc, we follow the intent which was that it should be set
3976 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00003977 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
3978 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003979 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00003980 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00003981
Bradley Smith0f28f0c2014-01-20 10:52:00 +00003982 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
3983 Opts.ShortWChar ? "2" : "4");
3984
3985 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
3986 Opts.ShortEnums ? "1" : "4");
3987
Bernard Ogden18b57012013-10-29 09:47:51 +00003988 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00003989 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00003990
Tim Northover02e38602014-02-03 17:28:04 +00003991 if (Crypto)
3992 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
3993
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003994 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00003995 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3996 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3997 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3998 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3999 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004000 }
Craig Topper3164f332014-03-11 03:39:26 +00004001 void getTargetBuiltins(const Builtin::Info *&Records,
4002 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004003 Records = BuiltinInfo;
4004 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004005 }
Craig Topper3164f332014-03-11 03:39:26 +00004006 bool isCLZForZeroUndef() const override { return false; }
4007 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004008 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004009 }
Craig Topper3164f332014-03-11 03:39:26 +00004010 void getGCCRegNames(const char * const *&Names,
4011 unsigned &NumNames) const override;
4012 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4013 unsigned &NumAliases) const override;
4014 bool validateAsmConstraint(const char *&Name,
4015 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004016 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004017 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004018 case 'l': // r0-r7
4019 case 'h': // r8-r15
4020 case 'w': // VFP Floating point register single precision
4021 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004022 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004023 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004024 case 'Q': // A memory address that is a single base register.
4025 Info.setAllowsMemory();
4026 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004027 case 'U': // a memory reference...
4028 switch (Name[1]) {
4029 case 'q': // ...ARMV4 ldrsb
4030 case 'v': // ...VFP load/store (reg+constant offset)
4031 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004032 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004033 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004034 case 'n': // valid address for Neon doubleword vector load/store
4035 case 'm': // valid address for Neon element and structure load/store
4036 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004037 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004038 Info.setAllowsMemory();
4039 Name++;
4040 return true;
4041 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004042 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004043 return false;
4044 }
Craig Topper3164f332014-03-11 03:39:26 +00004045 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004046 std::string R;
4047 switch (*Constraint) {
4048 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004049 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004050 Constraint++;
4051 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004052 case 'p': // 'p' should be translated to 'r' by default.
4053 R = std::string("r");
4054 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004055 default:
4056 return std::string(1, *Constraint);
4057 }
4058 return R;
4059 }
Craig Topper3164f332014-03-11 03:39:26 +00004060 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4061 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004062 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004063 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004064
Bill Wendling9d1ee112012-10-25 23:28:48 +00004065 // Strip off constraint modifiers.
4066 while (Constraint[0] == '=' ||
4067 Constraint[0] == '+' ||
4068 Constraint[0] == '&')
4069 Constraint = Constraint.substr(1);
4070
4071 switch (Constraint[0]) {
4072 default: break;
4073 case 'r': {
4074 switch (Modifier) {
4075 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004076 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004077 case 'q':
4078 // A register of size 32 cannot fit a vector type.
4079 return false;
4080 }
4081 }
4082 }
4083
4084 return true;
4085 }
Craig Topper3164f332014-03-11 03:39:26 +00004086 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004087 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004088 return "";
4089 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004090
Craig Topper3164f332014-03-11 03:39:26 +00004091 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004092 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4093 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004094
Craig Topper3164f332014-03-11 03:39:26 +00004095 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004096 if (RegNo == 0) return 0;
4097 if (RegNo == 1) return 1;
4098 return -1;
4099 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004100};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004101
Rafael Espindolaeb265472013-08-21 21:59:03 +00004102bool ARMTargetInfo::setFPMath(StringRef Name) {
4103 if (Name == "neon") {
4104 FPMath = FP_Neon;
4105 return true;
4106 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4107 Name == "vfp4") {
4108 FPMath = FP_VFP;
4109 return true;
4110 }
4111 return false;
4112}
4113
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004114const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004115 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004116 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004117 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4118
4119 // Float registers
4120 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4121 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4122 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004123 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004124
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004125 // Double registers
4126 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4127 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004128 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4129 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004130
4131 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004132 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4133 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004134};
4135
4136void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004137 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004138 Names = GCCRegNames;
4139 NumNames = llvm::array_lengthof(GCCRegNames);
4140}
4141
4142const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004143 { { "a1" }, "r0" },
4144 { { "a2" }, "r1" },
4145 { { "a3" }, "r2" },
4146 { { "a4" }, "r3" },
4147 { { "v1" }, "r4" },
4148 { { "v2" }, "r5" },
4149 { { "v3" }, "r6" },
4150 { { "v4" }, "r7" },
4151 { { "v5" }, "r8" },
4152 { { "v6", "rfp" }, "r9" },
4153 { { "sl" }, "r10" },
4154 { { "fp" }, "r11" },
4155 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004156 { { "r13" }, "sp" },
4157 { { "r14" }, "lr" },
4158 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004159 // The S, D and Q registers overlap, but aren't really aliases; we
4160 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004161};
4162
4163void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4164 unsigned &NumAliases) const {
4165 Aliases = GCCRegAliases;
4166 NumAliases = llvm::array_lengthof(GCCRegAliases);
4167}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004168
4169const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004170#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004171#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004172 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004173#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004174
4175#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004176#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004177#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4178 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004179#include "clang/Basic/BuiltinsARM.def"
4180};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004181
4182class ARMleTargetInfo : public ARMTargetInfo {
4183public:
4184 ARMleTargetInfo(const llvm::Triple &Triple)
4185 : ARMTargetInfo(Triple, false) { }
4186 virtual void getTargetDefines(const LangOptions &Opts,
4187 MacroBuilder &Builder) const {
4188 Builder.defineMacro("__ARMEL__");
4189 ARMTargetInfo::getTargetDefines(Opts, Builder);
4190 }
4191};
4192
4193class ARMbeTargetInfo : public ARMTargetInfo {
4194public:
4195 ARMbeTargetInfo(const llvm::Triple &Triple)
4196 : ARMTargetInfo(Triple, true) { }
4197 virtual void getTargetDefines(const LangOptions &Opts,
4198 MacroBuilder &Builder) const {
4199 Builder.defineMacro("__ARMEB__");
4200 Builder.defineMacro("__ARM_BIG_ENDIAN");
4201 ARMTargetInfo::getTargetDefines(Opts, Builder);
4202 }
4203};
Chris Lattner17df24e2008-04-21 18:56:49 +00004204} // end anonymous namespace.
4205
Eli Friedmanf05b7722008-08-20 07:44:10 +00004206namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004207class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4208 const llvm::Triple Triple;
4209public:
4210 WindowsARMTargetInfo(const llvm::Triple &Triple)
4211 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4212 TLSSupported = false;
4213 WCharType = UnsignedShort;
4214 SizeType = UnsignedInt;
4215 UserLabelPrefix = "";
4216 }
4217 void getVisualStudioDefines(const LangOptions &Opts,
4218 MacroBuilder &Builder) const {
4219 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4220
4221 // FIXME: this is invalid for WindowsCE
4222 Builder.defineMacro("_M_ARM_NT", "1");
4223 Builder.defineMacro("_M_ARMT", "_M_ARM");
4224 Builder.defineMacro("_M_THUMB", "_M_ARM");
4225
4226 assert((Triple.getArch() == llvm::Triple::arm ||
4227 Triple.getArch() == llvm::Triple::thumb) &&
4228 "invalid architecture for Windows ARM target info");
4229 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4230 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4231
4232 // TODO map the complete set of values
4233 // 31: VFPv3 40: VFPv4
4234 Builder.defineMacro("_M_ARM_FP", "31");
4235 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004236 BuiltinVaListKind getBuiltinVaListKind() const override {
4237 return TargetInfo::CharPtrBuiltinVaList;
4238 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004239};
4240
4241// Windows ARM + Itanium C++ ABI Target
4242class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4243public:
4244 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4245 : WindowsARMTargetInfo(Triple) {
4246 TheCXXABI.set(TargetCXXABI::GenericARM);
4247 }
4248
4249 void getTargetDefines(const LangOptions &Opts,
4250 MacroBuilder &Builder) const override {
4251 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4252
4253 if (Opts.MSVCCompat)
4254 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4255 }
4256};
4257
4258// Windows ARM, MS (C++) ABI
4259class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4260public:
4261 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4262 : WindowsARMTargetInfo(Triple) {
4263 TheCXXABI.set(TargetCXXABI::Microsoft);
4264 }
4265
4266 void getTargetDefines(const LangOptions &Opts,
4267 MacroBuilder &Builder) const override {
4268 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4269 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4270 }
4271};
4272}
4273
4274
4275namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004276class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004277 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004278protected:
Craig Topper3164f332014-03-11 03:39:26 +00004279 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4280 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004281 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004282 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004283
Torok Edwinb2b37c62009-06-30 17:10:35 +00004284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004285 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004286 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004287 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004288 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004289 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004290 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004291
4292 // Darwin on iOS uses a variant of the ARM C++ ABI.
4293 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004294 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004295};
4296} // end anonymous namespace.
4297
Tony Linthicum76329bf2011-12-12 21:14:55 +00004298
4299namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004300class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004301 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004302 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4303 static const char *const GCCRegNames[];
4304
James Molloy75f5f9e2014-04-16 15:33:48 +00004305 enum FPUModeEnum {
4306 FPUMode,
4307 NeonMode
4308 };
4309
4310 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004311 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004312 unsigned Crypto;
4313
Tim Northovera2ee4332014-03-29 15:09:45 +00004314 static const Builtin::Info BuiltinInfo[];
4315
4316 std::string ABI;
4317
4318public:
Tim Northover573cbee2014-05-24 12:52:07 +00004319 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004320 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004321
4322 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4323 WCharType = SignedInt;
4324
4325 // NetBSD apparently prefers consistency across ARM targets to consistency
4326 // across 64-bit targets.
4327 Int64Type = SignedLongLong;
4328 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004329 } else {
4330 WCharType = UnsignedInt;
4331 Int64Type = SignedLong;
4332 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004333 }
4334
Tim Northovera2ee4332014-03-29 15:09:45 +00004335 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004336 MaxVectorAlign = 128;
4337 RegParmMax = 8;
4338 MaxAtomicInlineWidth = 128;
4339 MaxAtomicPromoteWidth = 128;
4340
4341 LongDoubleWidth = LongDoubleAlign = 128;
4342 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4343
Tim Northovera2ee4332014-03-29 15:09:45 +00004344 // {} in inline assembly are neon specifiers, not assembly variant
4345 // specifiers.
4346 NoAsmVariants = true;
4347
Tim Northover573cbee2014-05-24 12:52:07 +00004348 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004349 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4350 }
4351
Alp Toker4925ba72014-06-07 23:30:42 +00004352 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004353 virtual bool setABI(const std::string &Name) {
4354 if (Name != "aapcs" && Name != "darwinpcs")
4355 return false;
4356
4357 ABI = Name;
4358 return true;
4359 }
4360
4361 virtual bool setCPU(const std::string &Name) {
4362 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004363 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004364 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004365 .Case("cyclone", true)
4366 .Default(false);
4367 return CPUKnown;
4368 }
4369
4370 virtual void getTargetDefines(const LangOptions &Opts,
4371 MacroBuilder &Builder) const {
4372 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004373 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004374
4375 // Target properties.
4376 Builder.defineMacro("_LP64");
4377 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004378
4379 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4380 Builder.defineMacro("__ARM_ACLE", "200");
4381 Builder.defineMacro("__ARM_ARCH", "8");
4382 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4383
4384 Builder.defineMacro("__ARM_64BIT_STATE");
4385 Builder.defineMacro("__ARM_PCS_AAPCS64");
4386 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4387
4388 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4389 Builder.defineMacro("__ARM_FEATURE_CLZ");
4390 Builder.defineMacro("__ARM_FEATURE_FMA");
4391 Builder.defineMacro("__ARM_FEATURE_DIV");
4392
4393 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4394
4395 // 0xe implies support for half, single and double precision operations.
4396 Builder.defineMacro("__ARM_FP", "0xe");
4397
4398 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4399 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4400 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4401
4402 if (Opts.FastMath || Opts.FiniteMathOnly)
4403 Builder.defineMacro("__ARM_FP_FAST");
4404
4405 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4406 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4407
4408 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4409
4410 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4411 Opts.ShortEnums ? "1" : "4");
4412
James Molloy75f5f9e2014-04-16 15:33:48 +00004413 if (FPU == NeonMode) {
4414 Builder.defineMacro("__ARM_NEON");
4415 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004416 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004417 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004418
Bradley Smith418c5932014-05-02 15:17:51 +00004419 if (CRC)
4420 Builder.defineMacro("__ARM_FEATURE_CRC32");
4421
James Molloy75f5f9e2014-04-16 15:33:48 +00004422 if (Crypto)
4423 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004424 }
4425
4426 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4427 unsigned &NumRecords) const {
4428 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004429 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004430 }
4431
4432 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004433 return Feature == "aarch64" ||
4434 Feature == "arm64" ||
4435 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004436 }
4437
James Molloy5e73df52014-04-16 15:06:20 +00004438 bool handleTargetFeatures(std::vector<std::string> &Features,
4439 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004440 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004441 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004442 Crypto = 0;
4443 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4444 if (Features[i] == "+neon")
4445 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004446 if (Features[i] == "+crc")
4447 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004448 if (Features[i] == "+crypto")
4449 Crypto = 1;
4450 }
4451
James Molloy5e73df52014-04-16 15:06:20 +00004452 setDescriptionString();
4453
4454 return true;
4455 }
4456
Tim Northovera2ee4332014-03-29 15:09:45 +00004457 virtual bool isCLZForZeroUndef() const { return false; }
4458
4459 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4460 return TargetInfo::AArch64ABIBuiltinVaList;
4461 }
4462
4463 virtual void getGCCRegNames(const char *const *&Names,
4464 unsigned &NumNames) const;
4465 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4466 unsigned &NumAliases) const;
4467
4468 virtual bool validateAsmConstraint(const char *&Name,
4469 TargetInfo::ConstraintInfo &Info) const {
4470 switch (*Name) {
4471 default:
4472 return false;
4473 case 'w': // Floating point and SIMD registers (V0-V31)
4474 Info.setAllowsRegister();
4475 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004476 case 'I': // Constant that can be used with an ADD instruction
4477 case 'J': // Constant that can be used with a SUB instruction
4478 case 'K': // Constant that can be used with a 32-bit logical instruction
4479 case 'L': // Constant that can be used with a 64-bit logical instruction
4480 case 'M': // Constant that can be used as a 32-bit MOV immediate
4481 case 'N': // Constant that can be used as a 64-bit MOV immediate
4482 case 'Y': // Floating point constant zero
4483 case 'Z': // Integer constant zero
4484 return true;
4485 case 'Q': // A memory reference with base register and no offset
4486 Info.setAllowsMemory();
4487 return true;
4488 case 'S': // A symbolic address
4489 Info.setAllowsRegister();
4490 return true;
4491 case 'U':
4492 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4493 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4494 // Usa: An absolute symbolic address
4495 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4496 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004497 case 'z': // Zero register, wzr or xzr
4498 Info.setAllowsRegister();
4499 return true;
4500 case 'x': // Floating point and SIMD registers (V0-V15)
4501 Info.setAllowsRegister();
4502 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004503 }
4504 return false;
4505 }
4506
James Molloy8a157bf2014-07-25 10:19:47 +00004507 virtual bool validateConstraintModifier(StringRef Constraint,
4508 const char Modifier,
4509 unsigned Size) const {
4510 // Strip off constraint modifiers.
4511 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4512 Constraint = Constraint.substr(1);
4513
4514 switch (Constraint[0]) {
4515 default:
4516 return true;
4517 case 'z':
4518 case 'r': {
4519 switch (Modifier) {
4520 case 'x':
4521 case 'w':
4522 // For now assume that the person knows what they're
4523 // doing with the modifier.
4524 return true;
4525 default:
4526 // By default an 'r' constraint will be in the 'x'
4527 // registers.
4528 return Size == 64;
4529 }
4530 }
4531 }
4532 }
4533
Tim Northovera2ee4332014-03-29 15:09:45 +00004534 virtual const char *getClobbers() const { return ""; }
4535
4536 int getEHDataRegisterNumber(unsigned RegNo) const {
4537 if (RegNo == 0)
4538 return 0;
4539 if (RegNo == 1)
4540 return 1;
4541 return -1;
4542 }
4543};
4544
Tim Northover573cbee2014-05-24 12:52:07 +00004545const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004546 // 32-bit Integer registers
4547 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4548 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4549 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4550
4551 // 64-bit Integer registers
4552 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4553 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4554 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4555
4556 // 32-bit floating point regsisters
4557 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4558 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4559 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4560
4561 // 64-bit floating point regsisters
4562 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4563 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4564 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4565
4566 // Vector registers
4567 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4568 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4569 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4570};
4571
Tim Northover573cbee2014-05-24 12:52:07 +00004572void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004573 unsigned &NumNames) const {
4574 Names = GCCRegNames;
4575 NumNames = llvm::array_lengthof(GCCRegNames);
4576}
4577
Tim Northover573cbee2014-05-24 12:52:07 +00004578const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004579 { { "w31" }, "wsp" },
4580 { { "x29" }, "fp" },
4581 { { "x30" }, "lr" },
4582 { { "x31" }, "sp" },
4583 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4584 // don't want to substitute one of these for a different-sized one.
4585};
4586
Tim Northover573cbee2014-05-24 12:52:07 +00004587void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004588 unsigned &NumAliases) const {
4589 Aliases = GCCRegAliases;
4590 NumAliases = llvm::array_lengthof(GCCRegAliases);
4591}
4592
Tim Northover573cbee2014-05-24 12:52:07 +00004593const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004594#define BUILTIN(ID, TYPE, ATTRS) \
4595 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4596#include "clang/Basic/BuiltinsNEON.def"
4597
4598#define BUILTIN(ID, TYPE, ATTRS) \
4599 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004600#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004601};
James Molloy5e73df52014-04-16 15:06:20 +00004602
Tim Northover573cbee2014-05-24 12:52:07 +00004603class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004604 void setDescriptionString() override {
4605 if (getTriple().isOSBinFormatMachO())
4606 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4607 else
4608 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4609 }
4610
4611public:
Tim Northover573cbee2014-05-24 12:52:07 +00004612 AArch64leTargetInfo(const llvm::Triple &Triple)
4613 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004614 BigEndian = false;
4615 }
4616 void getTargetDefines(const LangOptions &Opts,
4617 MacroBuilder &Builder) const override {
4618 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004619 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004620 }
4621};
4622
Tim Northover573cbee2014-05-24 12:52:07 +00004623class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004624 void setDescriptionString() override {
4625 assert(!getTriple().isOSBinFormatMachO());
4626 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4627 }
4628
4629public:
Tim Northover573cbee2014-05-24 12:52:07 +00004630 AArch64beTargetInfo(const llvm::Triple &Triple)
4631 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004632 void getTargetDefines(const LangOptions &Opts,
4633 MacroBuilder &Builder) const override {
4634 Builder.defineMacro("__AARCH64EB__");
4635 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4636 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004637 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004638 }
4639};
Tim Northovera2ee4332014-03-29 15:09:45 +00004640} // end anonymous namespace.
4641
4642namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004643class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004644protected:
4645 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4646 MacroBuilder &Builder) const override {
4647 Builder.defineMacro("__AARCH64_SIMD__");
4648 Builder.defineMacro("__ARM64_ARCH_8__");
4649 Builder.defineMacro("__ARM_NEON__");
4650 Builder.defineMacro("__LITTLE_ENDIAN__");
4651 Builder.defineMacro("__REGISTER_PREFIX__", "");
4652 Builder.defineMacro("__arm64", "1");
4653 Builder.defineMacro("__arm64__", "1");
4654
4655 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4656 }
4657
Tim Northovera2ee4332014-03-29 15:09:45 +00004658public:
Tim Northover573cbee2014-05-24 12:52:07 +00004659 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4660 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004661 Int64Type = SignedLongLong;
4662 WCharType = SignedInt;
4663 UseSignedCharForObjCBool = false;
4664
4665 LongDoubleWidth = LongDoubleAlign = 64;
4666 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4667
4668 TheCXXABI.set(TargetCXXABI::iOS64);
4669 }
4670
4671 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4672 return TargetInfo::CharPtrBuiltinVaList;
4673 }
4674};
4675} // end anonymous namespace
4676
4677namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004678// Hexagon abstract base class
4679class HexagonTargetInfo : public TargetInfo {
4680 static const Builtin::Info BuiltinInfo[];
4681 static const char * const GCCRegNames[];
4682 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4683 std::string CPU;
4684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004685 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004686 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004687 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004688
4689 // {} in inline assembly are packet specifiers, not assembly variant
4690 // specifiers.
4691 NoAsmVariants = true;
4692 }
4693
Craig Topper3164f332014-03-11 03:39:26 +00004694 void getTargetBuiltins(const Builtin::Info *&Records,
4695 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004696 Records = BuiltinInfo;
4697 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4698 }
4699
Craig Topper3164f332014-03-11 03:39:26 +00004700 bool validateAsmConstraint(const char *&Name,
4701 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004702 return true;
4703 }
4704
Craig Topper3164f332014-03-11 03:39:26 +00004705 void getTargetDefines(const LangOptions &Opts,
4706 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004707
Craig Topper3164f332014-03-11 03:39:26 +00004708 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004709 return Feature == "hexagon";
4710 }
Craig Topper3164f332014-03-11 03:39:26 +00004711
4712 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004713 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004714 }
Craig Topper3164f332014-03-11 03:39:26 +00004715 void getGCCRegNames(const char * const *&Names,
4716 unsigned &NumNames) const override;
4717 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4718 unsigned &NumAliases) const override;
4719 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004720 return "";
4721 }
Sebastian Pop86500282012-01-13 20:37:10 +00004722
4723 static const char *getHexagonCPUSuffix(StringRef Name) {
4724 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004725 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004726 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004727 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004728 }
4729
Craig Topper3164f332014-03-11 03:39:26 +00004730 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004731 if (!getHexagonCPUSuffix(Name))
4732 return false;
4733
Tony Linthicum76329bf2011-12-12 21:14:55 +00004734 CPU = Name;
4735 return true;
4736 }
4737};
4738
4739void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4740 MacroBuilder &Builder) const {
4741 Builder.defineMacro("qdsp6");
4742 Builder.defineMacro("__qdsp6", "1");
4743 Builder.defineMacro("__qdsp6__", "1");
4744
4745 Builder.defineMacro("hexagon");
4746 Builder.defineMacro("__hexagon", "1");
4747 Builder.defineMacro("__hexagon__", "1");
4748
4749 if(CPU == "hexagonv1") {
4750 Builder.defineMacro("__HEXAGON_V1__");
4751 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4752 if(Opts.HexagonQdsp6Compat) {
4753 Builder.defineMacro("__QDSP6_V1__");
4754 Builder.defineMacro("__QDSP6_ARCH__", "1");
4755 }
4756 }
4757 else if(CPU == "hexagonv2") {
4758 Builder.defineMacro("__HEXAGON_V2__");
4759 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4760 if(Opts.HexagonQdsp6Compat) {
4761 Builder.defineMacro("__QDSP6_V2__");
4762 Builder.defineMacro("__QDSP6_ARCH__", "2");
4763 }
4764 }
4765 else if(CPU == "hexagonv3") {
4766 Builder.defineMacro("__HEXAGON_V3__");
4767 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4768 if(Opts.HexagonQdsp6Compat) {
4769 Builder.defineMacro("__QDSP6_V3__");
4770 Builder.defineMacro("__QDSP6_ARCH__", "3");
4771 }
4772 }
4773 else if(CPU == "hexagonv4") {
4774 Builder.defineMacro("__HEXAGON_V4__");
4775 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4776 if(Opts.HexagonQdsp6Compat) {
4777 Builder.defineMacro("__QDSP6_V4__");
4778 Builder.defineMacro("__QDSP6_ARCH__", "4");
4779 }
4780 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004781 else if(CPU == "hexagonv5") {
4782 Builder.defineMacro("__HEXAGON_V5__");
4783 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4784 if(Opts.HexagonQdsp6Compat) {
4785 Builder.defineMacro("__QDSP6_V5__");
4786 Builder.defineMacro("__QDSP6_ARCH__", "5");
4787 }
4788 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004789}
4790
4791const char * const HexagonTargetInfo::GCCRegNames[] = {
4792 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4793 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4794 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4795 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4796 "p0", "p1", "p2", "p3",
4797 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4798};
4799
4800void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4801 unsigned &NumNames) const {
4802 Names = GCCRegNames;
4803 NumNames = llvm::array_lengthof(GCCRegNames);
4804}
4805
4806
4807const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4808 { { "sp" }, "r29" },
4809 { { "fp" }, "r30" },
4810 { { "lr" }, "r31" },
4811 };
4812
4813void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4814 unsigned &NumAliases) const {
4815 Aliases = GCCRegAliases;
4816 NumAliases = llvm::array_lengthof(GCCRegAliases);
4817}
4818
4819
4820const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4821#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4822#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4823 ALL_LANGUAGES },
4824#include "clang/Basic/BuiltinsHexagon.def"
4825};
4826}
4827
4828
Chris Lattner5ba61f02006-10-14 07:39:34 +00004829namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004830// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4831class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004832 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4833 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004834 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004835public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004836 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004837
Craig Topper3164f332014-03-11 03:39:26 +00004838 bool handleTargetFeatures(std::vector<std::string> &Features,
4839 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004840 SoftFloat = false;
4841 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4842 if (Features[i] == "+soft-float")
4843 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004844 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004845 }
Craig Topper3164f332014-03-11 03:39:26 +00004846 void getTargetDefines(const LangOptions &Opts,
4847 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004848 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004849 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004850
4851 if (SoftFloat)
4852 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004853 }
Craig Topper3164f332014-03-11 03:39:26 +00004854
4855 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004856 return llvm::StringSwitch<bool>(Feature)
4857 .Case("softfloat", SoftFloat)
4858 .Case("sparc", true)
4859 .Default(false);
4860 }
Craig Topper3164f332014-03-11 03:39:26 +00004861
4862 void getTargetBuiltins(const Builtin::Info *&Records,
4863 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004864 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004865 }
Craig Topper3164f332014-03-11 03:39:26 +00004866 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004867 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004868 }
Craig Topper3164f332014-03-11 03:39:26 +00004869 void getGCCRegNames(const char * const *&Names,
4870 unsigned &NumNames) const override;
4871 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4872 unsigned &NumAliases) const override;
4873 bool validateAsmConstraint(const char *&Name,
4874 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004875 // FIXME: Implement!
4876 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004877 }
Craig Topper3164f332014-03-11 03:39:26 +00004878 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004879 // FIXME: Implement!
4880 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004881 }
4882};
4883
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004884const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004885 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4886 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4887 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4888 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4889};
4890
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004891void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4892 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004893 Names = GCCRegNames;
4894 NumNames = llvm::array_lengthof(GCCRegNames);
4895}
4896
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004897const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004898 { { "g0" }, "r0" },
4899 { { "g1" }, "r1" },
4900 { { "g2" }, "r2" },
4901 { { "g3" }, "r3" },
4902 { { "g4" }, "r4" },
4903 { { "g5" }, "r5" },
4904 { { "g6" }, "r6" },
4905 { { "g7" }, "r7" },
4906 { { "o0" }, "r8" },
4907 { { "o1" }, "r9" },
4908 { { "o2" }, "r10" },
4909 { { "o3" }, "r11" },
4910 { { "o4" }, "r12" },
4911 { { "o5" }, "r13" },
4912 { { "o6", "sp" }, "r14" },
4913 { { "o7" }, "r15" },
4914 { { "l0" }, "r16" },
4915 { { "l1" }, "r17" },
4916 { { "l2" }, "r18" },
4917 { { "l3" }, "r19" },
4918 { { "l4" }, "r20" },
4919 { { "l5" }, "r21" },
4920 { { "l6" }, "r22" },
4921 { { "l7" }, "r23" },
4922 { { "i0" }, "r24" },
4923 { { "i1" }, "r25" },
4924 { { "i2" }, "r26" },
4925 { { "i3" }, "r27" },
4926 { { "i4" }, "r28" },
4927 { { "i5" }, "r29" },
4928 { { "i6", "fp" }, "r30" },
4929 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004930};
4931
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004932void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4933 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004934 Aliases = GCCRegAliases;
4935 NumAliases = llvm::array_lengthof(GCCRegAliases);
4936}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004937
4938// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4939class SparcV8TargetInfo : public SparcTargetInfo {
4940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004941 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004942 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004943 }
4944
Craig Topper3164f332014-03-11 03:39:26 +00004945 void getTargetDefines(const LangOptions &Opts,
4946 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004947 SparcTargetInfo::getTargetDefines(Opts, Builder);
4948 Builder.defineMacro("__sparcv8");
4949 }
4950};
4951
4952// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4953class SparcV9TargetInfo : public SparcTargetInfo {
4954public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004955 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004956 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004957 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004958 // This is an LP64 platform.
4959 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004960
4961 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00004962 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004963 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00004964 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004965 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004966 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004967
4968 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4969 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4970 LongDoubleWidth = 128;
4971 LongDoubleAlign = 128;
4972 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00004973 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004974 }
4975
Craig Topper3164f332014-03-11 03:39:26 +00004976 void getTargetDefines(const LangOptions &Opts,
4977 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004978 SparcTargetInfo::getTargetDefines(Opts, Builder);
4979 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004980 Builder.defineMacro("__arch64__");
4981 // Solaris and its derivative AuroraUX don't need these variants, but the
4982 // BSDs do.
4983 if (getTriple().getOS() != llvm::Triple::Solaris &&
4984 getTriple().getOS() != llvm::Triple::AuroraUX) {
4985 Builder.defineMacro("__sparc64__");
4986 Builder.defineMacro("__sparc_v9__");
4987 Builder.defineMacro("__sparcv9__");
4988 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004989 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004990
Craig Topper3164f332014-03-11 03:39:26 +00004991 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004992 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4993 .Case("v9", true)
4994 .Case("ultrasparc", true)
4995 .Case("ultrasparc3", true)
4996 .Case("niagara", true)
4997 .Case("niagara2", true)
4998 .Case("niagara3", true)
4999 .Case("niagara4", true)
5000 .Default(false);
5001
5002 // No need to store the CPU yet. There aren't any CPU-specific
5003 // macros to define.
5004 return CPUKnown;
5005 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005006};
5007
Gabor Greif49991682008-02-21 16:29:08 +00005008} // end anonymous namespace.
5009
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005010namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005011class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5012public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005013 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5014 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005015 SizeType = UnsignedInt;
5016 PtrDiffType = SignedInt;
5017 }
5018};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005019class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005020public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005021 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5022 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005023 SizeType = UnsignedInt;
5024 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005025 }
5026};
5027} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005028
Chris Lattnerb781dc792008-05-08 05:58:21 +00005029namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005030class SystemZTargetInfo : public TargetInfo {
5031 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005032
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005033public:
5034 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5035 TLSSupported = true;
5036 IntWidth = IntAlign = 32;
5037 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5038 PointerWidth = PointerAlign = 64;
5039 LongDoubleWidth = 128;
5040 LongDoubleAlign = 64;
5041 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5042 MinGlobalAlign = 16;
5043 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5044 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5045 }
5046 void getTargetDefines(const LangOptions &Opts,
5047 MacroBuilder &Builder) const override {
5048 Builder.defineMacro("__s390__");
5049 Builder.defineMacro("__s390x__");
5050 Builder.defineMacro("__zarch__");
5051 Builder.defineMacro("__LONG_DOUBLE_128__");
5052 }
5053 void getTargetBuiltins(const Builtin::Info *&Records,
5054 unsigned &NumRecords) const override {
5055 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005056 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005057 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005058 }
5059
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005060 void getGCCRegNames(const char *const *&Names,
5061 unsigned &NumNames) const override;
5062 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5063 unsigned &NumAliases) const override {
5064 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005065 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005066 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005067 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005068 bool validateAsmConstraint(const char *&Name,
5069 TargetInfo::ConstraintInfo &info) const override;
5070 const char *getClobbers() const override {
5071 // FIXME: Is this really right?
5072 return "";
5073 }
5074 BuiltinVaListKind getBuiltinVaListKind() const override {
5075 return TargetInfo::SystemZBuiltinVaList;
5076 }
5077 bool setCPU(const std::string &Name) override {
5078 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5079 .Case("z10", true)
5080 .Case("z196", true)
5081 .Case("zEC12", true)
5082 .Default(false);
5083
5084 // No need to store the CPU yet. There aren't any CPU-specific
5085 // macros to define.
5086 return CPUKnown;
5087 }
5088};
5089
5090const char *const SystemZTargetInfo::GCCRegNames[] = {
5091 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5092 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5093 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5094 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5095};
5096
5097void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5098 unsigned &NumNames) const {
5099 Names = GCCRegNames;
5100 NumNames = llvm::array_lengthof(GCCRegNames);
5101}
5102
5103bool SystemZTargetInfo::
5104validateAsmConstraint(const char *&Name,
5105 TargetInfo::ConstraintInfo &Info) const {
5106 switch (*Name) {
5107 default:
5108 return false;
5109
5110 case 'a': // Address register
5111 case 'd': // Data register (equivalent to 'r')
5112 case 'f': // Floating-point register
5113 Info.setAllowsRegister();
5114 return true;
5115
5116 case 'I': // Unsigned 8-bit constant
5117 case 'J': // Unsigned 12-bit constant
5118 case 'K': // Signed 16-bit constant
5119 case 'L': // Signed 20-bit displacement (on all targets we support)
5120 case 'M': // 0x7fffffff
5121 return true;
5122
5123 case 'Q': // Memory with base and unsigned 12-bit displacement
5124 case 'R': // Likewise, plus an index
5125 case 'S': // Memory with base and signed 20-bit displacement
5126 case 'T': // Likewise, plus an index
5127 Info.setAllowsMemory();
5128 return true;
5129 }
5130}
Ulrich Weigand47445072013-05-06 16:26:41 +00005131}
5132
5133namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005134 class MSP430TargetInfo : public TargetInfo {
5135 static const char * const GCCRegNames[];
5136 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005137 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005138 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005139 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005140 IntWidth = 16; IntAlign = 16;
5141 LongWidth = 32; LongLongWidth = 64;
5142 LongAlign = LongLongAlign = 16;
5143 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005144 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005145 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005146 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005147 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005148 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005149 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005150 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005151 }
5152 void getTargetDefines(const LangOptions &Opts,
5153 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005154 Builder.defineMacro("MSP430");
5155 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005156 // FIXME: defines for different 'flavours' of MCU
5157 }
Craig Topper3164f332014-03-11 03:39:26 +00005158 void getTargetBuiltins(const Builtin::Info *&Records,
5159 unsigned &NumRecords) const override {
5160 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005161 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005162 NumRecords = 0;
5163 }
Craig Topper3164f332014-03-11 03:39:26 +00005164 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005165 return Feature == "msp430";
5166 }
Craig Topper3164f332014-03-11 03:39:26 +00005167 void getGCCRegNames(const char * const *&Names,
5168 unsigned &NumNames) const override;
5169 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5170 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005171 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005172 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005173 NumAliases = 0;
5174 }
Craig Topper3164f332014-03-11 03:39:26 +00005175 bool validateAsmConstraint(const char *&Name,
5176 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005177 // No target constraints for now.
5178 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005179 }
Craig Topper3164f332014-03-11 03:39:26 +00005180 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005181 // FIXME: Is this really right?
5182 return "";
5183 }
Craig Topper3164f332014-03-11 03:39:26 +00005184 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005185 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005186 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005187 }
5188 };
5189
5190 const char * const MSP430TargetInfo::GCCRegNames[] = {
5191 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5192 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5193 };
5194
5195 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5196 unsigned &NumNames) const {
5197 Names = GCCRegNames;
5198 NumNames = llvm::array_lengthof(GCCRegNames);
5199 }
5200}
5201
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005202namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005203
Mike Stump11289f42009-09-09 15:08:12 +00005204 // LLVM and Clang cannot be used directly to output native binaries for
5205 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005206 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005207 //
5208 // TCE uses the llvm bitcode as input and uses it for generating customized
5209 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005210 // publicly available in http://tce.cs.tut.fi
5211
Eli Friedman1f191002011-10-07 19:51:42 +00005212 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5213 3, // opencl_global
5214 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005215 5, // opencl_constant
5216 0, // cuda_device
5217 0, // cuda_constant
5218 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005219 };
5220
Eli Friedmana9c3d712009-08-19 20:47:07 +00005221 class TCETargetInfo : public TargetInfo{
5222 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005223 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005224 TLSSupported = false;
5225 IntWidth = 32;
5226 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005227 PointerWidth = 32;
5228 IntAlign = 32;
5229 LongAlign = LongLongAlign = 32;
5230 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005231 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005232 SizeType = UnsignedInt;
5233 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005234 IntPtrType = SignedInt;
5235 PtrDiffType = SignedInt;
5236 FloatWidth = 32;
5237 FloatAlign = 32;
5238 DoubleWidth = 32;
5239 DoubleAlign = 32;
5240 LongDoubleWidth = 32;
5241 LongDoubleAlign = 32;
5242 FloatFormat = &llvm::APFloat::IEEEsingle;
5243 DoubleFormat = &llvm::APFloat::IEEEsingle;
5244 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005245 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5246 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005247 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005248 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005249 }
5250
Craig Topper3164f332014-03-11 03:39:26 +00005251 void getTargetDefines(const LangOptions &Opts,
5252 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005253 DefineStd(Builder, "tce", Opts);
5254 Builder.defineMacro("__TCE__");
5255 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005256 }
Craig Topper3164f332014-03-11 03:39:26 +00005257 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005258 return Feature == "tce";
5259 }
Craig Topper3164f332014-03-11 03:39:26 +00005260
5261 void getTargetBuiltins(const Builtin::Info *&Records,
5262 unsigned &NumRecords) const override {}
5263 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005264 return "";
5265 }
Craig Topper3164f332014-03-11 03:39:26 +00005266 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005267 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005268 }
Craig Topper3164f332014-03-11 03:39:26 +00005269 void getGCCRegNames(const char * const *&Names,
5270 unsigned &NumNames) const override {}
5271 bool validateAsmConstraint(const char *&Name,
5272 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005273 return true;
5274 }
Craig Topper3164f332014-03-11 03:39:26 +00005275 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5276 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005277 };
5278}
5279
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005280namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005281class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005282 virtual void setDescriptionString() = 0;
5283
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005284 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005285 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005286 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005287 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005288 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005289 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005290 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005291 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005292 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005293 enum DspRevEnum {
5294 NoDSP, DSP1, DSP2
5295 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005296 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005297
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005298protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005299 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005300 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005301
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005302public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005303 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5304 const std::string &CPUStr)
5305 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005306 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005307 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005308
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005309 bool isNaN2008Default() const {
5310 return CPU == "mips32r6" || CPU == "mips64r6";
5311 }
5312
5313 bool isFP64Default() const {
5314 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5315 }
5316
Alp Toker4925ba72014-06-07 23:30:42 +00005317 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005318 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005319 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5320 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005321 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005322 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005323 .Case("mips1", IsMips32)
5324 .Case("mips2", IsMips32)
5325 .Case("mips3", true)
5326 .Case("mips4", true)
5327 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005328 .Case("mips32", IsMips32)
5329 .Case("mips32r2", IsMips32)
5330 .Case("mips32r6", IsMips32)
5331 .Case("mips64", true)
5332 .Case("mips64r2", true)
5333 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005334 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005335 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005336 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005337 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005338 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005339 // The backend enables certain ABI's by default according to the
5340 // architecture.
5341 // Disable both possible defaults so that we don't end up with multiple
5342 // ABI's selected and trigger an assertion.
5343 Features["o32"] = false;
5344 Features["n64"] = false;
5345
Eric Christopher0b26a612010-03-02 02:41:08 +00005346 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005347 if (CPU == "octeon")
5348 Features["mips64r2"] = Features["cnmips"] = true;
5349 else
5350 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005351 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005352
Craig Topper3164f332014-03-11 03:39:26 +00005353 void getTargetDefines(const LangOptions &Opts,
5354 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005355 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005356 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005357 if (Opts.GNUMode)
5358 Builder.defineMacro("mips");
5359
Simon Atanasyan683535b2012-08-29 19:14:58 +00005360 Builder.defineMacro("__REGISTER_PREFIX__", "");
5361
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005362 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005363 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005364 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005365 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005366 case SoftFloat:
5367 Builder.defineMacro("__mips_soft_float", Twine(1));
5368 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005369 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005370
Simon Atanasyan16071912013-04-14 14:07:30 +00005371 if (IsSingleFloat)
5372 Builder.defineMacro("__mips_single_float", Twine(1));
5373
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005374 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5375 Builder.defineMacro("_MIPS_FPSET",
5376 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5377
Simon Atanasyan72244b62012-07-05 16:06:06 +00005378 if (IsMips16)
5379 Builder.defineMacro("__mips16", Twine(1));
5380
Simon Atanasyan60777612013-04-14 14:07:51 +00005381 if (IsMicromips)
5382 Builder.defineMacro("__mips_micromips", Twine(1));
5383
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005384 if (IsNan2008)
5385 Builder.defineMacro("__mips_nan2008", Twine(1));
5386
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005387 switch (DspRev) {
5388 default:
5389 break;
5390 case DSP1:
5391 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5392 Builder.defineMacro("__mips_dsp", Twine(1));
5393 break;
5394 case DSP2:
5395 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5396 Builder.defineMacro("__mips_dspr2", Twine(1));
5397 Builder.defineMacro("__mips_dsp", Twine(1));
5398 break;
5399 }
5400
Jack Carter44ff1e52013-08-12 17:20:29 +00005401 if (HasMSA)
5402 Builder.defineMacro("__mips_msa", Twine(1));
5403
Simon Atanasyan26f19672012-04-05 19:28:31 +00005404 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5405 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5406 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005407
5408 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5409 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005410 }
5411
Craig Topper3164f332014-03-11 03:39:26 +00005412 void getTargetBuiltins(const Builtin::Info *&Records,
5413 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005414 Records = BuiltinInfo;
5415 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005416 }
Craig Topper3164f332014-03-11 03:39:26 +00005417 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005418 return llvm::StringSwitch<bool>(Feature)
5419 .Case("mips", true)
5420 .Case("fp64", HasFP64)
5421 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005422 }
Craig Topper3164f332014-03-11 03:39:26 +00005423 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005424 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005425 }
Craig Topper3164f332014-03-11 03:39:26 +00005426 void getGCCRegNames(const char * const *&Names,
5427 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005428 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005429 // CPU register names
5430 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005431 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5432 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5433 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005434 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5435 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005436 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5437 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5438 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5439 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005440 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005441 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005442 "$fcc5","$fcc6","$fcc7",
5443 // MSA register names
5444 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5445 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5446 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5447 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5448 // MSA control register names
5449 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5450 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005451 };
5452 Names = GCCRegNames;
5453 NumNames = llvm::array_lengthof(GCCRegNames);
5454 }
Craig Topper3164f332014-03-11 03:39:26 +00005455 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5456 unsigned &NumAliases) const override = 0;
5457 bool validateAsmConstraint(const char *&Name,
5458 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005459 switch (*Name) {
5460 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005461 return false;
5462
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005463 case 'r': // CPU registers.
5464 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005465 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005466 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005467 case 'c': // $25 for indirect jumps
5468 case 'l': // lo register
5469 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005470 Info.setAllowsRegister();
5471 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005472 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005473 Info.setAllowsMemory();
5474 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005475 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005476 }
5477
Craig Topper3164f332014-03-11 03:39:26 +00005478 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005479 // FIXME: Implement!
5480 return "";
5481 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005482
Craig Topper3164f332014-03-11 03:39:26 +00005483 bool handleTargetFeatures(std::vector<std::string> &Features,
5484 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005485 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005486 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005487 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005488 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005489 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005490 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005491 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005492
5493 for (std::vector<std::string>::iterator it = Features.begin(),
5494 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005495 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005496 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005497 else if (*it == "+soft-float")
5498 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005499 else if (*it == "+mips16")
5500 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005501 else if (*it == "+micromips")
5502 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005503 else if (*it == "+dsp")
5504 DspRev = std::max(DspRev, DSP1);
5505 else if (*it == "+dspr2")
5506 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005507 else if (*it == "+msa")
5508 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005509 else if (*it == "+fp64")
5510 HasFP64 = true;
5511 else if (*it == "-fp64")
5512 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005513 else if (*it == "+nan2008")
5514 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005515 else if (*it == "-nan2008")
5516 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005517 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005518
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005519 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005520 std::vector<std::string>::iterator it =
5521 std::find(Features.begin(), Features.end(), "+soft-float");
5522 if (it != Features.end())
5523 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005524
Akira Hatanaka9064e362013-10-29 18:30:33 +00005525 setDescriptionString();
5526
Rafael Espindolaeb265472013-08-21 21:59:03 +00005527 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005528 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005529
Craig Topper3164f332014-03-11 03:39:26 +00005530 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005531 if (RegNo == 0) return 4;
5532 if (RegNo == 1) return 5;
5533 return -1;
5534 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005535
5536 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005537};
5538
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005539const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5540#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5541#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5542 ALL_LANGUAGES },
5543#include "clang/Basic/BuiltinsMips.def"
5544};
5545
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005546class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005547public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005548 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005549 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005550 SizeType = UnsignedInt;
5551 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005552 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005553 }
Craig Topper3164f332014-03-11 03:39:26 +00005554 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005555 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005556 ABI = Name;
5557 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005558 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005559 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005560 }
Craig Topper3164f332014-03-11 03:39:26 +00005561 void getTargetDefines(const LangOptions &Opts,
5562 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005563 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005564
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005565 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005566 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5567
5568 const std::string& CPUStr = getCPU();
5569 if (CPUStr == "mips32")
5570 Builder.defineMacro("__mips_isa_rev", "1");
5571 else if (CPUStr == "mips32r2")
5572 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005573
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005574 if (ABI == "o32") {
5575 Builder.defineMacro("__mips_o32");
5576 Builder.defineMacro("_ABIO32", "1");
5577 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5578 }
5579 else if (ABI == "eabi")
5580 Builder.defineMacro("__mips_eabi");
5581 else
David Blaikie83d382b2011-09-23 05:06:16 +00005582 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005583 }
Craig Topper3164f332014-03-11 03:39:26 +00005584 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5585 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005586 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5587 { { "at" }, "$1" },
5588 { { "v0" }, "$2" },
5589 { { "v1" }, "$3" },
5590 { { "a0" }, "$4" },
5591 { { "a1" }, "$5" },
5592 { { "a2" }, "$6" },
5593 { { "a3" }, "$7" },
5594 { { "t0" }, "$8" },
5595 { { "t1" }, "$9" },
5596 { { "t2" }, "$10" },
5597 { { "t3" }, "$11" },
5598 { { "t4" }, "$12" },
5599 { { "t5" }, "$13" },
5600 { { "t6" }, "$14" },
5601 { { "t7" }, "$15" },
5602 { { "s0" }, "$16" },
5603 { { "s1" }, "$17" },
5604 { { "s2" }, "$18" },
5605 { { "s3" }, "$19" },
5606 { { "s4" }, "$20" },
5607 { { "s5" }, "$21" },
5608 { { "s6" }, "$22" },
5609 { { "s7" }, "$23" },
5610 { { "t8" }, "$24" },
5611 { { "t9" }, "$25" },
5612 { { "k0" }, "$26" },
5613 { { "k1" }, "$27" },
5614 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005615 { { "sp","$sp" }, "$29" },
5616 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005617 { { "ra" }, "$31" }
5618 };
5619 Aliases = GCCRegAliases;
5620 NumAliases = llvm::array_lengthof(GCCRegAliases);
5621 }
5622};
5623
5624class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005625 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005626 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005627 }
5628
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005629public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005630 Mips32EBTargetInfo(const llvm::Triple &Triple)
5631 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633 void getTargetDefines(const LangOptions &Opts,
5634 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005635 DefineStd(Builder, "MIPSEB", Opts);
5636 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005637 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005638 }
5639};
5640
5641class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005642 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005643 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005644 }
5645
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005646public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005647 Mips32ELTargetInfo(const llvm::Triple &Triple)
5648 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005649 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005650 }
Craig Topper3164f332014-03-11 03:39:26 +00005651 void getTargetDefines(const LangOptions &Opts,
5652 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005653 DefineStd(Builder, "MIPSEL", Opts);
5654 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005655 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005656 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005657};
Akira Hatanakabef17452011-09-20 19:21:49 +00005658
5659class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005660public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005662 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005663 LongDoubleWidth = LongDoubleAlign = 128;
5664 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005665 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5666 LongDoubleWidth = LongDoubleAlign = 64;
5667 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5668 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005669 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005670 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005671 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005672 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005673
5674 void setN64ABITypes() {
5675 LongWidth = LongAlign = 64;
5676 PointerWidth = PointerAlign = 64;
5677 SizeType = UnsignedLong;
5678 PtrDiffType = SignedLong;
5679 }
5680
5681 void setN32ABITypes() {
5682 LongWidth = LongAlign = 32;
5683 PointerWidth = PointerAlign = 32;
5684 SizeType = UnsignedInt;
5685 PtrDiffType = SignedInt;
5686 }
5687
Craig Topper3164f332014-03-11 03:39:26 +00005688 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005689 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005690 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005691 ABI = Name;
5692 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005693 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005694 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005695 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005696 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005697 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005698 }
5699 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005700 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005701
Craig Topper3164f332014-03-11 03:39:26 +00005702 void getTargetDefines(const LangOptions &Opts,
5703 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005704 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005705
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005706 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005707 Builder.defineMacro("__mips64");
5708 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005709 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5710
5711 const std::string& CPUStr = getCPU();
5712 if (CPUStr == "mips64")
5713 Builder.defineMacro("__mips_isa_rev", "1");
5714 else if (CPUStr == "mips64r2")
5715 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005716
Akira Hatanakabef17452011-09-20 19:21:49 +00005717 if (ABI == "n32") {
5718 Builder.defineMacro("__mips_n32");
5719 Builder.defineMacro("_ABIN32", "2");
5720 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5721 }
5722 else if (ABI == "n64") {
5723 Builder.defineMacro("__mips_n64");
5724 Builder.defineMacro("_ABI64", "3");
5725 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5726 }
5727 else
David Blaikie83d382b2011-09-23 05:06:16 +00005728 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005729 }
Craig Topper3164f332014-03-11 03:39:26 +00005730 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5731 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005732 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5733 { { "at" }, "$1" },
5734 { { "v0" }, "$2" },
5735 { { "v1" }, "$3" },
5736 { { "a0" }, "$4" },
5737 { { "a1" }, "$5" },
5738 { { "a2" }, "$6" },
5739 { { "a3" }, "$7" },
5740 { { "a4" }, "$8" },
5741 { { "a5" }, "$9" },
5742 { { "a6" }, "$10" },
5743 { { "a7" }, "$11" },
5744 { { "t0" }, "$12" },
5745 { { "t1" }, "$13" },
5746 { { "t2" }, "$14" },
5747 { { "t3" }, "$15" },
5748 { { "s0" }, "$16" },
5749 { { "s1" }, "$17" },
5750 { { "s2" }, "$18" },
5751 { { "s3" }, "$19" },
5752 { { "s4" }, "$20" },
5753 { { "s5" }, "$21" },
5754 { { "s6" }, "$22" },
5755 { { "s7" }, "$23" },
5756 { { "t8" }, "$24" },
5757 { { "t9" }, "$25" },
5758 { { "k0" }, "$26" },
5759 { { "k1" }, "$27" },
5760 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005761 { { "sp","$sp" }, "$29" },
5762 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005763 { { "ra" }, "$31" }
5764 };
5765 Aliases = GCCRegAliases;
5766 NumAliases = llvm::array_lengthof(GCCRegAliases);
5767 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005768
5769 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005770};
5771
5772class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005773 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005774 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005775 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005776 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005777 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005778
Akira Hatanakabef17452011-09-20 19:21:49 +00005779 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005780
Akira Hatanakabef17452011-09-20 19:21:49 +00005781public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005782 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005783 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005784 void getTargetDefines(const LangOptions &Opts,
5785 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005786 DefineStd(Builder, "MIPSEB", Opts);
5787 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005788 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005789 }
5790};
5791
5792class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005793 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005794 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005795 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005796 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005797 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005798 }
5799public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005800 Mips64ELTargetInfo(const llvm::Triple &Triple)
5801 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005802 // Default ABI is n64.
5803 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005804 }
Craig Topper3164f332014-03-11 03:39:26 +00005805 void getTargetDefines(const LangOptions &Opts,
5806 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005807 DefineStd(Builder, "MIPSEL", Opts);
5808 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005809 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005810 }
5811};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005812} // end anonymous namespace.
5813
Ivan Krasindd7403e2011-08-24 20:22:22 +00005814namespace {
5815class PNaClTargetInfo : public TargetInfo {
5816public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005817 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005818 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005819 this->UserLabelPrefix = "";
5820 this->LongAlign = 32;
5821 this->LongWidth = 32;
5822 this->PointerAlign = 32;
5823 this->PointerWidth = 32;
5824 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005825 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005826 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005827 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005828 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005829 this->SizeType = TargetInfo::UnsignedInt;
5830 this->PtrDiffType = TargetInfo::SignedInt;
5831 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005832 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005833 }
5834
Craig Topper3164f332014-03-11 03:39:26 +00005835 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005836 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005837 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005838 Builder.defineMacro("__le32__");
5839 Builder.defineMacro("__pnacl__");
5840 }
Craig Topper3164f332014-03-11 03:39:26 +00005841 void getTargetDefines(const LangOptions &Opts,
5842 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005843 getArchDefines(Opts, Builder);
5844 }
Craig Topper3164f332014-03-11 03:39:26 +00005845 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005846 return Feature == "pnacl";
5847 }
Craig Topper3164f332014-03-11 03:39:26 +00005848 void getTargetBuiltins(const Builtin::Info *&Records,
5849 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005850 }
Craig Topper3164f332014-03-11 03:39:26 +00005851 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005852 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005853 }
Craig Topper3164f332014-03-11 03:39:26 +00005854 void getGCCRegNames(const char * const *&Names,
5855 unsigned &NumNames) const override;
5856 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5857 unsigned &NumAliases) const override;
5858 bool validateAsmConstraint(const char *&Name,
5859 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005860 return false;
5861 }
5862
Craig Topper3164f332014-03-11 03:39:26 +00005863 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005864 return "";
5865 }
5866};
5867
5868void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5869 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005870 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005871 NumNames = 0;
5872}
5873
5874void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5875 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005876 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005877 NumAliases = 0;
5878}
5879} // end anonymous namespace.
5880
Guy Benyeib798fc92012-12-11 21:38:14 +00005881namespace {
5882 static const unsigned SPIRAddrSpaceMap[] = {
5883 1, // opencl_global
5884 3, // opencl_local
5885 2, // opencl_constant
5886 0, // cuda_device
5887 0, // cuda_constant
5888 0 // cuda_shared
5889 };
5890 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005891 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005892 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005893 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5894 "SPIR target must use unknown OS");
5895 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5896 "SPIR target must use unknown environment type");
5897 BigEndian = false;
5898 TLSSupported = false;
5899 LongWidth = LongAlign = 64;
5900 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005901 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005902 // Define available target features
5903 // These must be defined in sorted order!
5904 NoAsmVariants = true;
5905 }
Craig Topper3164f332014-03-11 03:39:26 +00005906 void getTargetDefines(const LangOptions &Opts,
5907 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005908 DefineStd(Builder, "SPIR", Opts);
5909 }
Craig Topper3164f332014-03-11 03:39:26 +00005910 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005911 return Feature == "spir";
5912 }
Craig Topper3164f332014-03-11 03:39:26 +00005913
5914 void getTargetBuiltins(const Builtin::Info *&Records,
5915 unsigned &NumRecords) const override {}
5916 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005917 return "";
5918 }
Craig Topper3164f332014-03-11 03:39:26 +00005919 void getGCCRegNames(const char * const *&Names,
5920 unsigned &NumNames) const override {}
5921 bool validateAsmConstraint(const char *&Name,
5922 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005923 return true;
5924 }
Craig Topper3164f332014-03-11 03:39:26 +00005925 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5926 unsigned &NumAliases) const override {}
5927 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005928 return TargetInfo::VoidPtrBuiltinVaList;
5929 }
5930 };
5931
5932
5933 class SPIR32TargetInfo : public SPIRTargetInfo {
5934 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005935 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005936 PointerWidth = PointerAlign = 32;
5937 SizeType = TargetInfo::UnsignedInt;
5938 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5939 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005940 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5941 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005942 }
Craig Topper3164f332014-03-11 03:39:26 +00005943 void getTargetDefines(const LangOptions &Opts,
5944 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005945 DefineStd(Builder, "SPIR32", Opts);
5946 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005947 };
5948
5949 class SPIR64TargetInfo : public SPIRTargetInfo {
5950 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005951 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005952 PointerWidth = PointerAlign = 64;
5953 SizeType = TargetInfo::UnsignedLong;
5954 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005955 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5956 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005957 }
Craig Topper3164f332014-03-11 03:39:26 +00005958 void getTargetDefines(const LangOptions &Opts,
5959 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005960 DefineStd(Builder, "SPIR64", Opts);
5961 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005962 };
5963}
5964
Robert Lytton0e076492013-08-13 09:43:10 +00005965namespace {
5966class XCoreTargetInfo : public TargetInfo {
5967 static const Builtin::Info BuiltinInfo[];
5968public:
5969 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5970 BigEndian = false;
5971 NoAsmVariants = true;
5972 LongLongAlign = 32;
5973 SuitableAlign = 32;
5974 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005975 SizeType = UnsignedInt;
5976 PtrDiffType = SignedInt;
5977 IntPtrType = SignedInt;
5978 WCharType = UnsignedChar;
5979 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005980 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005981 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005982 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005983 }
Craig Topper3164f332014-03-11 03:39:26 +00005984 void getTargetDefines(const LangOptions &Opts,
5985 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005986 Builder.defineMacro("__XS1B__");
5987 }
Craig Topper3164f332014-03-11 03:39:26 +00005988 void getTargetBuiltins(const Builtin::Info *&Records,
5989 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005990 Records = BuiltinInfo;
5991 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5992 }
Craig Topper3164f332014-03-11 03:39:26 +00005993 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005994 return TargetInfo::VoidPtrBuiltinVaList;
5995 }
Craig Topper3164f332014-03-11 03:39:26 +00005996 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005997 return "";
5998 }
Craig Topper3164f332014-03-11 03:39:26 +00005999 void getGCCRegNames(const char * const *&Names,
6000 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006001 static const char * const GCCRegNames[] = {
6002 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6003 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6004 };
6005 Names = GCCRegNames;
6006 NumNames = llvm::array_lengthof(GCCRegNames);
6007 }
Craig Topper3164f332014-03-11 03:39:26 +00006008 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6009 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006010 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006011 NumAliases = 0;
6012 }
Craig Topper3164f332014-03-11 03:39:26 +00006013 bool validateAsmConstraint(const char *&Name,
6014 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006015 return false;
6016 }
Craig Topper3164f332014-03-11 03:39:26 +00006017 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006018 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6019 return (RegNo < 2)? RegNo : -1;
6020 }
Robert Lytton0e076492013-08-13 09:43:10 +00006021};
6022
6023const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6024#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6025#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6026 ALL_LANGUAGES },
6027#include "clang/Basic/BuiltinsXCore.def"
6028};
6029} // end anonymous namespace.
6030
Ivan Krasindd7403e2011-08-24 20:22:22 +00006031
Chris Lattner5ba61f02006-10-14 07:39:34 +00006032//===----------------------------------------------------------------------===//
6033// Driver code
6034//===----------------------------------------------------------------------===//
6035
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006036static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006037 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006038
Daniel Dunbar52322032009-08-18 05:47:58 +00006039 switch (Triple.getArch()) {
6040 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006041 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006042
Tim Northover2a0783d2014-05-30 14:14:07 +00006043 case llvm::Triple::xcore:
6044 return new XCoreTargetInfo(Triple);
6045
6046 case llvm::Triple::hexagon:
6047 return new HexagonTargetInfo(Triple);
6048
6049 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006050 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006051 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006052
6053 switch (os) {
6054 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006055 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006056 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006057 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006058 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006059 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006060 }
6061
Christian Pirker9b019ae2014-02-25 13:51:00 +00006062 case llvm::Triple::aarch64_be:
6063 switch (os) {
6064 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006065 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006066 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006067 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006068 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006069 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006070 }
6071
Daniel Dunbar52322032009-08-18 05:47:58 +00006072 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006073 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006074 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006075 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006076
Daniel Dunbar52322032009-08-18 05:47:58 +00006077 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006078 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006079 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006080 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006081 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006082 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006083 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006084 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006085 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006086 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006087 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006088 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006089 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006090 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006091 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006092 case llvm::Triple::Win32:
6093 switch (Triple.getEnvironment()) {
6094 default:
6095 return new ARMleTargetInfo(Triple);
6096 case llvm::Triple::Itanium:
6097 return new ItaniumWindowsARMleTargetInfo(Triple);
6098 case llvm::Triple::MSVC:
6099 return new MicrosoftARMleTargetInfo(Triple);
6100 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006101 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006102 return new ARMleTargetInfo(Triple);
6103 }
6104
6105 case llvm::Triple::armeb:
6106 case llvm::Triple::thumbeb:
6107 if (Triple.isOSDarwin())
6108 return new DarwinARMTargetInfo(Triple);
6109
6110 switch (os) {
6111 case llvm::Triple::Linux:
6112 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6113 case llvm::Triple::FreeBSD:
6114 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6115 case llvm::Triple::NetBSD:
6116 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6117 case llvm::Triple::OpenBSD:
6118 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6119 case llvm::Triple::Bitrig:
6120 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6121 case llvm::Triple::RTEMS:
6122 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6123 case llvm::Triple::NaCl:
6124 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6125 default:
6126 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006127 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006128
Daniel Dunbar52322032009-08-18 05:47:58 +00006129 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006130 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006131
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006132 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006133 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006134 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006135 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006136 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006137 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006138 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006139 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006140 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006141 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006142 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006143 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006144 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006145
6146 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006147 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006148 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006149 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006150 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006151 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006152 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006153 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006154 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006155 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006156 case llvm::Triple::NaCl:
6157 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006158 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006159 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006160 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006161
Akira Hatanakabef17452011-09-20 19:21:49 +00006162 case llvm::Triple::mips64:
6163 switch (os) {
6164 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006165 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006166 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006167 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006168 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006169 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006170 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006171 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006172 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006174 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006175 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006176 }
6177
6178 case llvm::Triple::mips64el:
6179 switch (os) {
6180 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006181 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006182 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006183 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006184 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006185 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006186 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006187 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006188 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006189 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006190 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006191 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006192 }
6193
Ivan Krasindd7403e2011-08-24 20:22:22 +00006194 case llvm::Triple::le32:
6195 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006196 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006197 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006198 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006199 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006200 }
6201
Daniel Dunbar52322032009-08-18 05:47:58 +00006202 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006203 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006204 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006205 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006206 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006207 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006208 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006209 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006210 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006211 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006212 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006213 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006214 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006215 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006216 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006217 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006218 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006219
6220 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006221 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006222 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006223 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006224 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006225 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006226 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006227 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006228 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006229 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006230 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006231 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006232 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006233 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006234 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006235
Bill Schmidt778d3872013-07-26 01:36:11 +00006236 case llvm::Triple::ppc64le:
6237 switch (os) {
6238 case llvm::Triple::Linux:
6239 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6240 default:
6241 return new PPC64TargetInfo(Triple);
6242 }
6243
Peter Collingbournec947aae2012-05-20 23:28:41 +00006244 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006245 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006246 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006247 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006248
Eli Friedmand13b41e2012-10-12 23:32:00 +00006249 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006250 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006251
Daniel Dunbar52322032009-08-18 05:47:58 +00006252 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006253 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006254 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006255 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006256 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006257 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006258 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006259 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006260 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006261 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006262 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006263 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006264 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006265 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006266 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006267 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006268 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006269
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006270 case llvm::Triple::sparcv9:
6271 switch (os) {
6272 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006273 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006274 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006275 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006276 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006277 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006278 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006279 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006280 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006281 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006282 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006283 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006284 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006285 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006286 }
6287
Ulrich Weigand47445072013-05-06 16:26:41 +00006288 case llvm::Triple::systemz:
6289 switch (os) {
6290 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006291 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006292 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006293 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006294 }
6295
Eli Friedmana9c3d712009-08-19 20:47:07 +00006296 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006297 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006298
Daniel Dunbar52322032009-08-18 05:47:58 +00006299 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006300 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006301 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006302
Daniel Dunbar52322032009-08-18 05:47:58 +00006303 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006304 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006305 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006306 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006307 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006308 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006309 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006310 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006311 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006312 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006313 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006314 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006315 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006316 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006317 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006318 case llvm::Triple::KFreeBSD:
6319 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006320 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006321 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006322 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006323 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006324 case llvm::Triple::Win32: {
6325 switch (Triple.getEnvironment()) {
6326 default:
6327 return new X86_32TargetInfo(Triple);
6328 case llvm::Triple::Cygnus:
6329 return new CygwinX86_32TargetInfo(Triple);
6330 case llvm::Triple::GNU:
6331 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006332 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006333 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006334 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006335 }
6336 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006337 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006339 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006341 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006343 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006345 }
6346
6347 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006348 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006349 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006350
Daniel Dunbar52322032009-08-18 05:47:58 +00006351 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006352 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006353 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006354 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006355 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006356 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006357 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006358 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006359 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006360 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006361 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006362 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006363 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006364 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006365 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006366 case llvm::Triple::KFreeBSD:
6367 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006368 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006369 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006370 case llvm::Triple::Win32: {
6371 switch (Triple.getEnvironment()) {
6372 default:
6373 return new X86_64TargetInfo(Triple);
6374 case llvm::Triple::GNU:
6375 return new MinGWX86_64TargetInfo(Triple);
6376 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006377 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006378 }
6379 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006380 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006381 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006382 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006383 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006384 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006385
6386 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006387 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006389 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006390 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006391 }
6392 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006393 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006394 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006395 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006397 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006398 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006399}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006400
6401/// CreateTargetInfo - Return the target info object for the specified target
6402/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006403TargetInfo *
6404TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6405 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006406 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006407
6408 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006409 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006410 if (!Target) {
6411 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006412 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006413 }
Alp Toker80758082014-07-06 05:26:44 +00006414 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006415
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006416 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006417 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6418 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006419 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006420 }
6421
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006422 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006423 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6424 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006425 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006426 }
6427
Rafael Espindolaeb265472013-08-21 21:59:03 +00006428 // Set the fp math unit.
6429 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6430 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006431 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006432 }
6433
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006434 // Compute the default target features, we need the target to handle this
6435 // because features may have dependencies on one another.
6436 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006437 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006438
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006439 // Apply the user specified deltas.
6440 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6441 I < N; ++I) {
6442 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006443 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006444 bool Enabled = Name[0] == '+';
6445 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006446 }
6447
6448 // Add the features to the compile options.
6449 //
6450 // FIXME: If we are completely confident that we have the right set, we only
6451 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006452 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006453 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6454 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006455 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006456 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006457 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006458
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006459 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006460}