blob: c67e4cdedcc1751923c14a8a18c5d01bc17576ad [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 Stellardc74b1e02013-03-04 17:40:53 +00001569 .Default(GK_NONE);
1570
1571 if (GPU == GK_NONE) {
1572 return false;
1573 }
1574
1575 // Set the correct data layout
1576 switch (GPU) {
1577 case GK_NONE:
1578 case GK_R600:
1579 case GK_R700:
1580 case GK_EVERGREEN:
1581 case GK_NORTHERN_ISLANDS:
1582 DescriptionString = DescriptionStringR600;
1583 break;
1584 case GK_R600_DOUBLE_OPS:
1585 case GK_R700_DOUBLE_OPS:
1586 case GK_EVERGREEN_DOUBLE_OPS:
1587 case GK_CAYMAN:
1588 DescriptionString = DescriptionStringR600DoubleOps;
1589 break;
1590 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001591 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001592 DescriptionString = DescriptionStringSI;
1593 break;
1594 }
1595
1596 return true;
1597 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001598};
1599
Matt Arsenault56f008d2014-06-24 20:45:01 +00001600const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1601#define BUILTIN(ID, TYPE, ATTRS) \
1602 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1603#include "clang/Basic/BuiltinsR600.def"
1604};
1605
Eli Friedmand13b41e2012-10-12 23:32:00 +00001606} // end anonymous namespace
1607
1608namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001609// Namespace for x86 abstract base class
1610const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001611#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001612#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001613 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001614#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001615};
Eli Friedmanb5366062008-05-20 14:21:01 +00001616
Nuno Lopescfca1f02009-12-23 17:49:57 +00001617static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001618 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1619 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001620 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001621 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1622 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1623 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001624 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001625 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1626 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001627};
1628
Eric Christophercdd36352011-06-21 00:05:20 +00001629const TargetInfo::AddlRegName AddlRegNames[] = {
1630 { { "al", "ah", "eax", "rax" }, 0 },
1631 { { "bl", "bh", "ebx", "rbx" }, 3 },
1632 { { "cl", "ch", "ecx", "rcx" }, 2 },
1633 { { "dl", "dh", "edx", "rdx" }, 1 },
1634 { { "esi", "rsi" }, 4 },
1635 { { "edi", "rdi" }, 5 },
1636 { { "esp", "rsp" }, 7 },
1637 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001638};
1639
1640// X86 target abstract base class; x86-32 and x86-64 are very close, so
1641// most of the implementation can be shared.
1642class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001643 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001644 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001645 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001646 enum MMX3DNowEnum {
1647 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1648 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001649 enum XOPEnum {
1650 NoXOP,
1651 SSE4A,
1652 FMA4,
1653 XOP
1654 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001655
Eric Christophere1ddaf92010-04-02 23:50:19 +00001656 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001657 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001658 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001659 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001660 bool HasBMI;
1661 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001662 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001663 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001664 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001665 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001666 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001667 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001668 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001669 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001670 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001671 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001672
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001673 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1674 ///
1675 /// Each enumeration represents a particular CPU supported by Clang. These
1676 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1677 enum CPUKind {
1678 CK_Generic,
1679
1680 /// \name i386
1681 /// i386-generation processors.
1682 //@{
1683 CK_i386,
1684 //@}
1685
1686 /// \name i486
1687 /// i486-generation processors.
1688 //@{
1689 CK_i486,
1690 CK_WinChipC6,
1691 CK_WinChip2,
1692 CK_C3,
1693 //@}
1694
1695 /// \name i586
1696 /// i586-generation processors, P5 microarchitecture based.
1697 //@{
1698 CK_i586,
1699 CK_Pentium,
1700 CK_PentiumMMX,
1701 //@}
1702
1703 /// \name i686
1704 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1705 //@{
1706 CK_i686,
1707 CK_PentiumPro,
1708 CK_Pentium2,
1709 CK_Pentium3,
1710 CK_Pentium3M,
1711 CK_PentiumM,
1712 CK_C3_2,
1713
1714 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1715 /// Clang however has some logic to suport this.
1716 // FIXME: Warn, deprecate, and potentially remove this.
1717 CK_Yonah,
1718 //@}
1719
1720 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001721 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001722 //@{
1723 CK_Pentium4,
1724 CK_Pentium4M,
1725 CK_Prescott,
1726 CK_Nocona,
1727 //@}
1728
1729 /// \name Core
1730 /// Core microarchitecture based processors.
1731 //@{
1732 CK_Core2,
1733
1734 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1735 /// codename which GCC no longer accepts as an option to -march, but Clang
1736 /// has some logic for recognizing it.
1737 // FIXME: Warn, deprecate, and potentially remove this.
1738 CK_Penryn,
1739 //@}
1740
1741 /// \name Atom
1742 /// Atom processors
1743 //@{
1744 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001745 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001746 //@}
1747
1748 /// \name Nehalem
1749 /// Nehalem microarchitecture based processors.
1750 //@{
1751 CK_Corei7,
1752 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001753 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001754 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001755 //@}
1756
Craig Topper449314e2013-08-20 07:09:39 +00001757 /// \name Knights Landing
1758 /// Knights Landing processor.
1759 CK_KNL,
1760
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001761 /// \name K6
1762 /// K6 architecture processors.
1763 //@{
1764 CK_K6,
1765 CK_K6_2,
1766 CK_K6_3,
1767 //@}
1768
1769 /// \name K7
1770 /// K7 architecture processors.
1771 //@{
1772 CK_Athlon,
1773 CK_AthlonThunderbird,
1774 CK_Athlon4,
1775 CK_AthlonXP,
1776 CK_AthlonMP,
1777 //@}
1778
1779 /// \name K8
1780 /// K8 architecture processors.
1781 //@{
1782 CK_Athlon64,
1783 CK_Athlon64SSE3,
1784 CK_AthlonFX,
1785 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001786 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001787 CK_Opteron,
1788 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001789 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001790 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001791
Benjamin Kramer569f2152012-01-10 11:50:18 +00001792 /// \name Bobcat
1793 /// Bobcat architecture processors.
1794 //@{
1795 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001796 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001797 //@}
1798
1799 /// \name Bulldozer
1800 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001801 //@{
1802 CK_BDVER1,
1803 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001804 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001805 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001806 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001807
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001808 /// This specification is deprecated and will be removed in the future.
1809 /// Users should prefer \see CK_K8.
1810 // FIXME: Warn on this when the CPU is set to it.
1811 CK_x86_64,
1812 //@}
1813
1814 /// \name Geode
1815 /// Geode processors.
1816 //@{
1817 CK_Geode
1818 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001819 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001820
Rafael Espindolaeb265472013-08-21 21:59:03 +00001821 enum FPMathKind {
1822 FP_Default,
1823 FP_SSE,
1824 FP_387
1825 } FPMath;
1826
Eli Friedman3fd920a2008-08-20 02:34:37 +00001827public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001828 X86TargetInfo(const llvm::Triple &Triple)
1829 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001830 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1831 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001832 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1833 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001834 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1835 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001836 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001837 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001838 }
Craig Topper3164f332014-03-11 03:39:26 +00001839 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001840 // X87 evaluates with 80 bits "long double" precision.
1841 return SSELevel == NoSSE ? 2 : 0;
1842 }
Craig Topper3164f332014-03-11 03:39:26 +00001843 void getTargetBuiltins(const Builtin::Info *&Records,
1844 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001845 Records = BuiltinInfo;
1846 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001847 }
Craig Topper3164f332014-03-11 03:39:26 +00001848 void getGCCRegNames(const char * const *&Names,
1849 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001850 Names = GCCRegNames;
1851 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001852 }
Craig Topper3164f332014-03-11 03:39:26 +00001853 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1854 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001855 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001856 NumAliases = 0;
1857 }
Craig Topper3164f332014-03-11 03:39:26 +00001858 void getGCCAddlRegNames(const AddlRegName *&Names,
1859 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001860 Names = AddlRegNames;
1861 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001862 }
Craig Topper3164f332014-03-11 03:39:26 +00001863 bool validateAsmConstraint(const char *&Name,
1864 TargetInfo::ConstraintInfo &info) const override;
1865 std::string convertConstraint(const char *&Constraint) const override;
1866 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001867 return "~{dirflag},~{fpsr},~{flags}";
1868 }
Craig Topper3164f332014-03-11 03:39:26 +00001869 void getTargetDefines(const LangOptions &Opts,
1870 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001871 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1872 bool Enabled);
1873 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1874 bool Enabled);
1875 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1876 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001877 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1878 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001879 setFeatureEnabledImpl(Features, Name, Enabled);
1880 }
1881 // This exists purely to cut down on the number of virtual calls in
1882 // getDefaultFeatures which calls this repeatedly.
1883 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1884 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001885 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1886 bool hasFeature(StringRef Feature) const override;
1887 bool handleTargetFeatures(std::vector<std::string> &Features,
1888 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001889 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001890 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001891 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001892 else if (getTriple().getArch() == llvm::Triple::x86 &&
1893 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001894 return "no-mmx";
1895 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001896 }
Craig Topper3164f332014-03-11 03:39:26 +00001897 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001898 CPU = llvm::StringSwitch<CPUKind>(Name)
1899 .Case("i386", CK_i386)
1900 .Case("i486", CK_i486)
1901 .Case("winchip-c6", CK_WinChipC6)
1902 .Case("winchip2", CK_WinChip2)
1903 .Case("c3", CK_C3)
1904 .Case("i586", CK_i586)
1905 .Case("pentium", CK_Pentium)
1906 .Case("pentium-mmx", CK_PentiumMMX)
1907 .Case("i686", CK_i686)
1908 .Case("pentiumpro", CK_PentiumPro)
1909 .Case("pentium2", CK_Pentium2)
1910 .Case("pentium3", CK_Pentium3)
1911 .Case("pentium3m", CK_Pentium3M)
1912 .Case("pentium-m", CK_PentiumM)
1913 .Case("c3-2", CK_C3_2)
1914 .Case("yonah", CK_Yonah)
1915 .Case("pentium4", CK_Pentium4)
1916 .Case("pentium4m", CK_Pentium4M)
1917 .Case("prescott", CK_Prescott)
1918 .Case("nocona", CK_Nocona)
1919 .Case("core2", CK_Core2)
1920 .Case("penryn", CK_Penryn)
1921 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001922 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001923 .Case("corei7", CK_Corei7)
1924 .Case("corei7-avx", CK_Corei7AVX)
1925 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001926 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001927 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001928 .Case("k6", CK_K6)
1929 .Case("k6-2", CK_K6_2)
1930 .Case("k6-3", CK_K6_3)
1931 .Case("athlon", CK_Athlon)
1932 .Case("athlon-tbird", CK_AthlonThunderbird)
1933 .Case("athlon-4", CK_Athlon4)
1934 .Case("athlon-xp", CK_AthlonXP)
1935 .Case("athlon-mp", CK_AthlonMP)
1936 .Case("athlon64", CK_Athlon64)
1937 .Case("athlon64-sse3", CK_Athlon64SSE3)
1938 .Case("athlon-fx", CK_AthlonFX)
1939 .Case("k8", CK_K8)
1940 .Case("k8-sse3", CK_K8SSE3)
1941 .Case("opteron", CK_Opteron)
1942 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001943 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001944 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001945 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001946 .Case("bdver1", CK_BDVER1)
1947 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001948 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001949 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001950 .Case("x86-64", CK_x86_64)
1951 .Case("geode", CK_Geode)
1952 .Default(CK_Generic);
1953
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001954 // Perform any per-CPU checks necessary to determine if this CPU is
1955 // acceptable.
1956 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1957 // invalid without explaining *why*.
1958 switch (CPU) {
1959 case CK_Generic:
1960 // No processor selected!
1961 return false;
1962
1963 case CK_i386:
1964 case CK_i486:
1965 case CK_WinChipC6:
1966 case CK_WinChip2:
1967 case CK_C3:
1968 case CK_i586:
1969 case CK_Pentium:
1970 case CK_PentiumMMX:
1971 case CK_i686:
1972 case CK_PentiumPro:
1973 case CK_Pentium2:
1974 case CK_Pentium3:
1975 case CK_Pentium3M:
1976 case CK_PentiumM:
1977 case CK_Yonah:
1978 case CK_C3_2:
1979 case CK_Pentium4:
1980 case CK_Pentium4M:
1981 case CK_Prescott:
1982 case CK_K6:
1983 case CK_K6_2:
1984 case CK_K6_3:
1985 case CK_Athlon:
1986 case CK_AthlonThunderbird:
1987 case CK_Athlon4:
1988 case CK_AthlonXP:
1989 case CK_AthlonMP:
1990 case CK_Geode:
1991 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001992 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001993 return false;
1994
1995 // Fallthrough
1996 case CK_Nocona:
1997 case CK_Core2:
1998 case CK_Penryn:
1999 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002000 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002001 case CK_Corei7:
2002 case CK_Corei7AVX:
2003 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002004 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002005 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002006 case CK_Athlon64:
2007 case CK_Athlon64SSE3:
2008 case CK_AthlonFX:
2009 case CK_K8:
2010 case CK_K8SSE3:
2011 case CK_Opteron:
2012 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002013 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002014 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002015 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002016 case CK_BDVER1:
2017 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002018 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002019 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002020 case CK_x86_64:
2021 return true;
2022 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002023 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002024 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002025
Craig Topper3164f332014-03-11 03:39:26 +00002026 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002027
Craig Topper3164f332014-03-11 03:39:26 +00002028 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002029 // We accept all non-ARM calling conventions
2030 return (CC == CC_X86ThisCall ||
2031 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002032 CC == CC_X86StdCall ||
2033 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002034 CC == CC_X86Pascal ||
2035 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002036 }
2037
Craig Topper3164f332014-03-11 03:39:26 +00002038 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002039 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002040 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002041};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002042
Rafael Espindolaeb265472013-08-21 21:59:03 +00002043bool X86TargetInfo::setFPMath(StringRef Name) {
2044 if (Name == "387") {
2045 FPMath = FP_387;
2046 return true;
2047 }
2048 if (Name == "sse") {
2049 FPMath = FP_SSE;
2050 return true;
2051 }
2052 return false;
2053}
2054
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002055void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002056 // FIXME: This *really* should not be here.
2057
2058 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002059 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002060 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002061
Chandler Carruth212334f2011-09-28 08:55:37 +00002062 switch (CPU) {
2063 case CK_Generic:
2064 case CK_i386:
2065 case CK_i486:
2066 case CK_i586:
2067 case CK_Pentium:
2068 case CK_i686:
2069 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002070 break;
2071 case CK_PentiumMMX:
2072 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002074 break;
2075 case CK_Pentium3:
2076 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002078 break;
2079 case CK_PentiumM:
2080 case CK_Pentium4:
2081 case CK_Pentium4M:
2082 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002083 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002084 break;
2085 case CK_Yonah:
2086 case CK_Prescott:
2087 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002088 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002089 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002090 break;
2091 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002092 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002093 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002094 break;
2095 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002096 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002097 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002098 break;
2099 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002100 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002101 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002102 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002103 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002104 setFeatureEnabledImpl(Features, "sse4.2", true);
2105 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002106 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002107 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002108 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002109 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002110 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002111 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002112 break;
2113 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "avx", true);
2115 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002116 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002117 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002118 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002119 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "avx", true);
2121 setFeatureEnabledImpl(Features, "aes", true);
2122 setFeatureEnabledImpl(Features, "pclmul", true);
2123 setFeatureEnabledImpl(Features, "rdrnd", true);
2124 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002125 break;
Craig Topper865fff52011-12-17 19:55:21 +00002126 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002127 setFeatureEnabledImpl(Features, "avx2", true);
2128 setFeatureEnabledImpl(Features, "aes", true);
2129 setFeatureEnabledImpl(Features, "pclmul", true);
2130 setFeatureEnabledImpl(Features, "lzcnt", true);
2131 setFeatureEnabledImpl(Features, "rdrnd", true);
2132 setFeatureEnabledImpl(Features, "f16c", true);
2133 setFeatureEnabledImpl(Features, "bmi", true);
2134 setFeatureEnabledImpl(Features, "bmi2", true);
2135 setFeatureEnabledImpl(Features, "rtm", true);
2136 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002137 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002138 break;
Craig Topper449314e2013-08-20 07:09:39 +00002139 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002140 setFeatureEnabledImpl(Features, "avx512f", true);
2141 setFeatureEnabledImpl(Features, "avx512cd", true);
2142 setFeatureEnabledImpl(Features, "avx512er", true);
2143 setFeatureEnabledImpl(Features, "avx512pf", true);
2144 setFeatureEnabledImpl(Features, "aes", true);
2145 setFeatureEnabledImpl(Features, "pclmul", true);
2146 setFeatureEnabledImpl(Features, "lzcnt", true);
2147 setFeatureEnabledImpl(Features, "rdrnd", true);
2148 setFeatureEnabledImpl(Features, "f16c", true);
2149 setFeatureEnabledImpl(Features, "bmi", true);
2150 setFeatureEnabledImpl(Features, "bmi2", true);
2151 setFeatureEnabledImpl(Features, "rtm", true);
2152 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002153 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002154 case CK_K6:
2155 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002157 break;
2158 case CK_K6_2:
2159 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002160 case CK_WinChip2:
2161 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002163 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002164 case CK_Athlon:
2165 case CK_AthlonThunderbird:
2166 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002168 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002169 case CK_Athlon4:
2170 case CK_AthlonXP:
2171 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002172 setFeatureEnabledImpl(Features, "sse", true);
2173 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002174 break;
2175 case CK_K8:
2176 case CK_Opteron:
2177 case CK_Athlon64:
2178 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002179 setFeatureEnabledImpl(Features, "sse2", true);
2180 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002181 break;
2182 case CK_K8SSE3:
2183 case CK_OpteronSSE3:
2184 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002185 setFeatureEnabledImpl(Features, "sse3", true);
2186 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002187 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002188 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002189 setFeatureEnabledImpl(Features, "sse3", true);
2190 setFeatureEnabledImpl(Features, "sse4a", true);
2191 setFeatureEnabledImpl(Features, "3dnowa", true);
2192 setFeatureEnabledImpl(Features, "lzcnt", true);
2193 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002194 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002195 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002196 setFeatureEnabledImpl(Features, "ssse3", true);
2197 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002198 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002199 setFeatureEnabledImpl(Features, "lzcnt", true);
2200 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002201 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002202 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002203 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002204 setFeatureEnabledImpl(Features, "avx", true);
2205 setFeatureEnabledImpl(Features, "sse4a", true);
2206 setFeatureEnabledImpl(Features, "lzcnt", true);
2207 setFeatureEnabledImpl(Features, "aes", true);
2208 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002209 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002210 setFeatureEnabledImpl(Features, "bmi", true);
2211 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002212 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002213 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002214 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002215 setFeatureEnabledImpl(Features, "xop", true);
2216 setFeatureEnabledImpl(Features, "lzcnt", true);
2217 setFeatureEnabledImpl(Features, "aes", true);
2218 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002219 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002220 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002221 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002222 case CK_BDVER4:
2223 setFeatureEnabledImpl(Features, "avx2", true);
2224 setFeatureEnabledImpl(Features, "bmi2", true);
2225 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002226 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002227 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002228 setFeatureEnabledImpl(Features, "xop", true);
2229 setFeatureEnabledImpl(Features, "lzcnt", true);
2230 setFeatureEnabledImpl(Features, "aes", true);
2231 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002232 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002233 setFeatureEnabledImpl(Features, "bmi", true);
2234 setFeatureEnabledImpl(Features, "fma", true);
2235 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002236 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002237 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002238 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002240 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002241 break;
Eli Friedman33465822011-07-08 23:31:17 +00002242 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002243}
2244
Rafael Espindolae62e2792013-08-20 13:44:29 +00002245void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002246 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002247 if (Enabled) {
2248 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002249 case AVX512F:
2250 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002251 case AVX2:
2252 Features["avx2"] = true;
2253 case AVX:
2254 Features["avx"] = true;
2255 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002256 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002257 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002258 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002259 case SSSE3:
2260 Features["ssse3"] = true;
2261 case SSE3:
2262 Features["sse3"] = true;
2263 case SSE2:
2264 Features["sse2"] = true;
2265 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002266 Features["sse"] = true;
2267 case NoSSE:
2268 break;
2269 }
2270 return;
2271 }
2272
2273 switch (Level) {
2274 case NoSSE:
2275 case SSE1:
2276 Features["sse"] = false;
2277 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002278 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2279 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002280 case SSE3:
2281 Features["sse3"] = false;
2282 setXOPLevel(Features, NoXOP, false);
2283 case SSSE3:
2284 Features["ssse3"] = false;
2285 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002286 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002287 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002288 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002289 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002290 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002291 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002292 case AVX2:
2293 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002294 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002295 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2296 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002297 }
2298}
2299
2300void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002301 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002302 if (Enabled) {
2303 switch (Level) {
2304 case AMD3DNowAthlon:
2305 Features["3dnowa"] = true;
2306 case AMD3DNow:
2307 Features["3dnow"] = true;
2308 case MMX:
2309 Features["mmx"] = true;
2310 case NoMMX3DNow:
2311 break;
2312 }
2313 return;
2314 }
2315
2316 switch (Level) {
2317 case NoMMX3DNow:
2318 case MMX:
2319 Features["mmx"] = false;
2320 case AMD3DNow:
2321 Features["3dnow"] = false;
2322 case AMD3DNowAthlon:
2323 Features["3dnowa"] = false;
2324 }
2325}
2326
2327void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002328 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 if (Enabled) {
2330 switch (Level) {
2331 case XOP:
2332 Features["xop"] = true;
2333 case FMA4:
2334 Features["fma4"] = true;
2335 setSSELevel(Features, AVX, true);
2336 case SSE4A:
2337 Features["sse4a"] = true;
2338 setSSELevel(Features, SSE3, true);
2339 case NoXOP:
2340 break;
2341 }
2342 return;
2343 }
2344
2345 switch (Level) {
2346 case NoXOP:
2347 case SSE4A:
2348 Features["sse4a"] = false;
2349 case FMA4:
2350 Features["fma4"] = false;
2351 case XOP:
2352 Features["xop"] = false;
2353 }
2354}
2355
Craig Topper86d79ef2013-09-17 04:51:29 +00002356void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2357 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002358 // FIXME: This *really* should not be here. We need some way of translating
2359 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002360 if (Name == "sse4")
2361 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002362
Rafael Espindolae62e2792013-08-20 13:44:29 +00002363 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002364
Craig Topper29561122013-09-19 01:13:07 +00002365 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002366 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002367 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002368 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002369 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002370 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002371 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002372 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002373 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002374 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002375 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002376 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002377 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002378 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002379 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002380 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002381 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002382 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002383 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002384 if (Enabled)
2385 setSSELevel(Features, SSE2, Enabled);
2386 } else if (Name == "pclmul") {
2387 if (Enabled)
2388 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002389 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002390 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002391 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002392 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002393 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002394 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002395 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002396 if (Enabled)
2397 setSSELevel(Features, AVX512F, Enabled);
2398 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002399 if (Enabled)
2400 setSSELevel(Features, AVX, Enabled);
2401 } else if (Name == "fma4") {
2402 setXOPLevel(Features, FMA4, Enabled);
2403 } else if (Name == "xop") {
2404 setXOPLevel(Features, XOP, Enabled);
2405 } else if (Name == "sse4a") {
2406 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002407 } else if (Name == "f16c") {
2408 if (Enabled)
2409 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002410 } else if (Name == "sha") {
2411 if (Enabled)
2412 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002413 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002414}
2415
Eric Christopher3ff21b32013-10-16 21:26:26 +00002416/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002417/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002418bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002419 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002420 // Remember the maximum enabled sselevel.
2421 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2422 // Ignore disabled features.
2423 if (Features[i][0] == '-')
2424 continue;
2425
Benjamin Kramer27402c62012-03-05 15:10:44 +00002426 StringRef Feature = StringRef(Features[i]).substr(1);
2427
2428 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002429 HasAES = true;
2430 continue;
2431 }
2432
Craig Topper3f122a72012-05-31 05:18:48 +00002433 if (Feature == "pclmul") {
2434 HasPCLMUL = true;
2435 continue;
2436 }
2437
Benjamin Kramer27402c62012-03-05 15:10:44 +00002438 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002439 HasLZCNT = true;
2440 continue;
2441 }
2442
Rafael Espindola89049822013-08-23 20:21:37 +00002443 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002444 HasRDRND = true;
2445 continue;
2446 }
2447
Benjamin Kramer27402c62012-03-05 15:10:44 +00002448 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002449 HasBMI = true;
2450 continue;
2451 }
2452
Benjamin Kramer27402c62012-03-05 15:10:44 +00002453 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002454 HasBMI2 = true;
2455 continue;
2456 }
2457
Benjamin Kramer27402c62012-03-05 15:10:44 +00002458 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002459 HasPOPCNT = true;
2460 continue;
2461 }
2462
Michael Liao625a8752012-11-10 05:17:46 +00002463 if (Feature == "rtm") {
2464 HasRTM = true;
2465 continue;
2466 }
2467
Michael Liao74f4eaf2013-03-26 17:52:08 +00002468 if (Feature == "prfchw") {
2469 HasPRFCHW = true;
2470 continue;
2471 }
2472
Michael Liaoffaae352013-03-29 05:17:55 +00002473 if (Feature == "rdseed") {
2474 HasRDSEED = true;
2475 continue;
2476 }
2477
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002478 if (Feature == "tbm") {
2479 HasTBM = true;
2480 continue;
2481 }
2482
Craig Topperbba778b2012-06-03 21:46:30 +00002483 if (Feature == "fma") {
2484 HasFMA = true;
2485 continue;
2486 }
2487
Manman Rena45358c2012-10-11 00:59:55 +00002488 if (Feature == "f16c") {
2489 HasF16C = true;
2490 continue;
2491 }
2492
Craig Topper679b53a2013-08-21 05:29:10 +00002493 if (Feature == "avx512cd") {
2494 HasAVX512CD = true;
2495 continue;
2496 }
2497
2498 if (Feature == "avx512er") {
2499 HasAVX512ER = true;
2500 continue;
2501 }
2502
2503 if (Feature == "avx512pf") {
2504 HasAVX512PF = true;
2505 continue;
2506 }
2507
Ben Langmuir58078d02013-09-19 13:22:04 +00002508 if (Feature == "sha") {
2509 HasSHA = true;
2510 continue;
2511 }
2512
Nick Lewycky50e8f482013-10-05 20:14:27 +00002513 if (Feature == "cx16") {
2514 HasCX16 = true;
2515 continue;
2516 }
2517
Daniel Dunbar979586e2009-11-11 09:38:56 +00002518 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002519 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002520 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002521 .Case("avx2", AVX2)
2522 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002523 .Case("sse4.2", SSE42)
2524 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002525 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002526 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002527 .Case("sse2", SSE2)
2528 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002529 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002530 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002531
Eli Friedman33465822011-07-08 23:31:17 +00002532 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002533 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002534 .Case("3dnowa", AMD3DNowAthlon)
2535 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002536 .Case("mmx", MMX)
2537 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002538 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002539
2540 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2541 .Case("xop", XOP)
2542 .Case("fma4", FMA4)
2543 .Case("sse4a", SSE4A)
2544 .Default(NoXOP);
2545 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002546 }
Eli Friedman33465822011-07-08 23:31:17 +00002547
Craig Topper7481d8a2013-09-10 06:55:47 +00002548 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2549 // Can't do this earlier because we need to be able to explicitly enable
2550 // popcnt and still disable sse4.2.
2551 if (!HasPOPCNT && SSELevel >= SSE42 &&
2552 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2553 HasPOPCNT = true;
2554 Features.push_back("+popcnt");
2555 }
2556
Yunzhong Gao61089362013-10-16 19:07:02 +00002557 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2558 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2559 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2560 HasPRFCHW = true;
2561 Features.push_back("+prfchw");
2562 }
2563
Rafael Espindolaeb265472013-08-21 21:59:03 +00002564 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2565 // matches the selected sse level.
2566 if (FPMath == FP_SSE && SSELevel < SSE1) {
2567 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2568 return false;
2569 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2570 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2571 return false;
2572 }
2573
Eli Friedman33465822011-07-08 23:31:17 +00002574 // Don't tell the backend if we're turning off mmx; it will end up disabling
2575 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002576 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2577 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002578 std::vector<std::string>::iterator it;
2579 it = std::find(Features.begin(), Features.end(), "-mmx");
2580 if (it != Features.end())
2581 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002582 else if (SSELevel > NoSSE)
2583 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002584 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002585}
Chris Lattnerecd49032009-03-02 22:27:17 +00002586
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002587/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2588/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002589void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002590 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002591 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002592 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002593 Builder.defineMacro("__amd64__");
2594 Builder.defineMacro("__amd64");
2595 Builder.defineMacro("__x86_64");
2596 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002597 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002598 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002599 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002600
Chris Lattnerecd49032009-03-02 22:27:17 +00002601 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002602 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2603 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 switch (CPU) {
2605 case CK_Generic:
2606 break;
2607 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002608 // The rest are coming from the i386 define above.
2609 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002610 break;
2611 case CK_i486:
2612 case CK_WinChipC6:
2613 case CK_WinChip2:
2614 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002615 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002617 case CK_PentiumMMX:
2618 Builder.defineMacro("__pentium_mmx__");
2619 Builder.defineMacro("__tune_pentium_mmx__");
2620 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002621 case CK_i586:
2622 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002623 defineCPUMacros(Builder, "i586");
2624 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002625 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 case CK_Pentium3:
2627 case CK_Pentium3M:
2628 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002629 Builder.defineMacro("__tune_pentium3__");
2630 // Fallthrough
2631 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002633 Builder.defineMacro("__tune_pentium2__");
2634 // Fallthrough
2635 case CK_PentiumPro:
2636 Builder.defineMacro("__tune_i686__");
2637 Builder.defineMacro("__tune_pentiumpro__");
2638 // Fallthrough
2639 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002640 Builder.defineMacro("__i686");
2641 Builder.defineMacro("__i686__");
2642 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2643 Builder.defineMacro("__pentiumpro");
2644 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002645 break;
2646 case CK_Pentium4:
2647 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002648 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002649 break;
2650 case CK_Yonah:
2651 case CK_Prescott:
2652 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002653 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
2655 case CK_Core2:
2656 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002657 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002658 break;
2659 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002660 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002661 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002662 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002663 defineCPUMacros(Builder, "slm");
2664 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002665 case CK_Corei7:
2666 case CK_Corei7AVX:
2667 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002668 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002669 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002670 break;
Craig Topper449314e2013-08-20 07:09:39 +00002671 case CK_KNL:
2672 defineCPUMacros(Builder, "knl");
2673 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002674 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002675 Builder.defineMacro("__k6_2__");
2676 Builder.defineMacro("__tune_k6_2__");
2677 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002678 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002679 if (CPU != CK_K6_2) { // In case of fallthrough
2680 // FIXME: GCC may be enabling these in cases where some other k6
2681 // architecture is specified but -m3dnow is explicitly provided. The
2682 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002683 Builder.defineMacro("__k6_3__");
2684 Builder.defineMacro("__tune_k6_3__");
2685 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002686 // Fallthrough
2687 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002688 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002689 break;
2690 case CK_Athlon:
2691 case CK_AthlonThunderbird:
2692 case CK_Athlon4:
2693 case CK_AthlonXP:
2694 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002695 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002696 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002697 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002698 Builder.defineMacro("__tune_athlon_sse__");
2699 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002700 break;
2701 case CK_K8:
2702 case CK_K8SSE3:
2703 case CK_x86_64:
2704 case CK_Opteron:
2705 case CK_OpteronSSE3:
2706 case CK_Athlon64:
2707 case CK_Athlon64SSE3:
2708 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002709 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002710 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002711 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002712 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002713 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002714 case CK_BTVER1:
2715 defineCPUMacros(Builder, "btver1");
2716 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002717 case CK_BTVER2:
2718 defineCPUMacros(Builder, "btver2");
2719 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002720 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002721 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002722 break;
2723 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002724 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002725 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002726 case CK_BDVER3:
2727 defineCPUMacros(Builder, "bdver3");
2728 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002729 case CK_BDVER4:
2730 defineCPUMacros(Builder, "bdver4");
2731 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002732 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002733 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002734 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002735 }
Chris Lattner96e43572009-03-02 22:40:39 +00002736
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002737 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002738 Builder.defineMacro("__REGISTER_PREFIX__", "");
2739
Chris Lattner6df41af2009-04-19 17:32:33 +00002740 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2741 // functions in glibc header files that use FP Stack inline asm which the
2742 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002743 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002744
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002745 if (HasAES)
2746 Builder.defineMacro("__AES__");
2747
Craig Topper3f122a72012-05-31 05:18:48 +00002748 if (HasPCLMUL)
2749 Builder.defineMacro("__PCLMUL__");
2750
Craig Topper22967d42011-12-25 05:06:45 +00002751 if (HasLZCNT)
2752 Builder.defineMacro("__LZCNT__");
2753
Benjamin Kramer1e250392012-07-07 09:39:18 +00002754 if (HasRDRND)
2755 Builder.defineMacro("__RDRND__");
2756
Craig Topper22967d42011-12-25 05:06:45 +00002757 if (HasBMI)
2758 Builder.defineMacro("__BMI__");
2759
2760 if (HasBMI2)
2761 Builder.defineMacro("__BMI2__");
2762
Craig Topper1de83482011-12-29 16:10:46 +00002763 if (HasPOPCNT)
2764 Builder.defineMacro("__POPCNT__");
2765
Michael Liao625a8752012-11-10 05:17:46 +00002766 if (HasRTM)
2767 Builder.defineMacro("__RTM__");
2768
Michael Liao74f4eaf2013-03-26 17:52:08 +00002769 if (HasPRFCHW)
2770 Builder.defineMacro("__PRFCHW__");
2771
Michael Liaoffaae352013-03-29 05:17:55 +00002772 if (HasRDSEED)
2773 Builder.defineMacro("__RDSEED__");
2774
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002775 if (HasTBM)
2776 Builder.defineMacro("__TBM__");
2777
Rafael Espindolae62e2792013-08-20 13:44:29 +00002778 switch (XOPLevel) {
2779 case XOP:
2780 Builder.defineMacro("__XOP__");
2781 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002782 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002783 case SSE4A:
2784 Builder.defineMacro("__SSE4A__");
2785 case NoXOP:
2786 break;
2787 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002788
Craig Topperbba778b2012-06-03 21:46:30 +00002789 if (HasFMA)
2790 Builder.defineMacro("__FMA__");
2791
Manman Rena45358c2012-10-11 00:59:55 +00002792 if (HasF16C)
2793 Builder.defineMacro("__F16C__");
2794
Craig Topper679b53a2013-08-21 05:29:10 +00002795 if (HasAVX512CD)
2796 Builder.defineMacro("__AVX512CD__");
2797 if (HasAVX512ER)
2798 Builder.defineMacro("__AVX512ER__");
2799 if (HasAVX512PF)
2800 Builder.defineMacro("__AVX512PF__");
2801
Ben Langmuir58078d02013-09-19 13:22:04 +00002802 if (HasSHA)
2803 Builder.defineMacro("__SHA__");
2804
Nick Lewycky50e8f482013-10-05 20:14:27 +00002805 if (HasCX16)
2806 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2807
Chris Lattner96e43572009-03-02 22:40:39 +00002808 // Each case falls through to the previous one here.
2809 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002810 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002811 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002812 case AVX2:
2813 Builder.defineMacro("__AVX2__");
2814 case AVX:
2815 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002816 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002817 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002818 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002819 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002820 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002821 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002822 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002823 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002824 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002825 Builder.defineMacro("__SSE2__");
2826 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002827 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002828 Builder.defineMacro("__SSE__");
2829 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002830 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002831 break;
2832 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002833
Derek Schuffc7dd7222012-10-11 15:52:22 +00002834 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002835 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002836 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002837 case AVX2:
2838 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002839 case SSE42:
2840 case SSE41:
2841 case SSSE3:
2842 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002843 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002844 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002845 break;
2846 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002847 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002848 break;
2849 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002850 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002851 }
2852 }
2853
Anders Carlssone437c682010-01-27 03:47:49 +00002854 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002855 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002856 case AMD3DNowAthlon:
2857 Builder.defineMacro("__3dNOW_A__");
2858 case AMD3DNow:
2859 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002860 case MMX:
2861 Builder.defineMacro("__MMX__");
2862 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002863 break;
2864 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002865
2866 if (CPU >= CK_i486) {
2867 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2868 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2869 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2870 }
2871 if (CPU >= CK_i586)
2872 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002873}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002874
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002875bool X86TargetInfo::hasFeature(StringRef Feature) const {
2876 return llvm::StringSwitch<bool>(Feature)
2877 .Case("aes", HasAES)
2878 .Case("avx", SSELevel >= AVX)
2879 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002880 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002881 .Case("avx512cd", HasAVX512CD)
2882 .Case("avx512er", HasAVX512ER)
2883 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002884 .Case("bmi", HasBMI)
2885 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002886 .Case("cx16", HasCX16)
2887 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002888 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002889 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002890 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002891 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002892 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002893 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2894 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2895 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002896 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002897 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002898 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002899 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002900 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002901 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002902 .Case("sse", SSELevel >= SSE1)
2903 .Case("sse2", SSELevel >= SSE2)
2904 .Case("sse3", SSELevel >= SSE3)
2905 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002906 .Case("sse4.1", SSELevel >= SSE41)
2907 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002908 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002909 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002910 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2911 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002912 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002913 .Default(false);
2914}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002915
Eli Friedman3fd920a2008-08-20 02:34:37 +00002916bool
Anders Carlsson58436352009-02-28 17:11:49 +00002917X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002918 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002919 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002920 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002921 case 'Y': // first letter of a pair:
2922 switch (*(Name+1)) {
2923 default: return false;
2924 case '0': // First SSE register.
2925 case 't': // Any SSE register, when SSE2 is enabled.
2926 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2927 case 'm': // any MMX register, when inter-unit moves enabled.
2928 break; // falls through to setAllowsRegister.
2929 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002930 case 'a': // eax.
2931 case 'b': // ebx.
2932 case 'c': // ecx.
2933 case 'd': // edx.
2934 case 'S': // esi.
2935 case 'D': // edi.
2936 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002937 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002938 case 't': // top of floating point stack.
2939 case 'u': // second from top of floating point stack.
2940 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002941 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002942 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002943 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002944 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2945 case 'l': // "Index" registers: any general register that can be used as an
2946 // index in a base+index memory access.
2947 Info.setAllowsRegister();
2948 return true;
2949 case 'C': // SSE floating point constant.
2950 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002951 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002952 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002953 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002954 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002955 return true;
2956 }
2957}
2958
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002959
Eli Friedman3fd920a2008-08-20 02:34:37 +00002960std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002961X86TargetInfo::convertConstraint(const char *&Constraint) const {
2962 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002963 case 'a': return std::string("{ax}");
2964 case 'b': return std::string("{bx}");
2965 case 'c': return std::string("{cx}");
2966 case 'd': return std::string("{dx}");
2967 case 'S': return std::string("{si}");
2968 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002969 case 'p': // address
2970 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002971 case 't': // top of floating point stack.
2972 return std::string("{st}");
2973 case 'u': // second from top of floating point stack.
2974 return std::string("{st(1)}"); // second from top of floating point stack.
2975 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002976 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002977 }
2978}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002979} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002980
2981namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002982// X86-32 generic target
2983class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002984public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002985 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002986 DoubleAlign = LongLongAlign = 32;
2987 LongDoubleWidth = 96;
2988 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002989 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002990 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002991 SizeType = UnsignedInt;
2992 PtrDiffType = SignedInt;
2993 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002994 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002995
2996 // Use fpret for all types.
2997 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2998 (1 << TargetInfo::Double) |
2999 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003000
3001 // x86-32 has atomics up to 8 bytes
3002 // FIXME: Check that we actually have cmpxchg8b before setting
3003 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3004 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003005 }
Craig Topper3164f332014-03-11 03:39:26 +00003006 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003007 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003008 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003009
Craig Topper3164f332014-03-11 03:39:26 +00003010 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003011 if (RegNo == 0) return 0;
3012 if (RegNo == 1) return 2;
3013 return -1;
3014 }
Craig Topper3164f332014-03-11 03:39:26 +00003015 bool validateInputSize(StringRef Constraint,
3016 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003017 switch (Constraint[0]) {
3018 default: break;
3019 case 'a':
3020 case 'b':
3021 case 'c':
3022 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003023 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00003024 }
3025
3026 return true;
3027 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003028};
3029} // end anonymous namespace
3030
3031namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003032class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3033public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003034 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3035 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003036
Craig Topper3164f332014-03-11 03:39:26 +00003037 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003038 unsigned Major, Minor, Micro;
3039 getTriple().getOSVersion(Major, Minor, Micro);
3040 // New NetBSD uses the default rounding mode.
3041 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3042 return X86_32TargetInfo::getFloatEvalMethod();
3043 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003044 return 1;
3045 }
3046};
3047} // end anonymous namespace
3048
3049namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003050class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3051public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003052 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3053 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003054 SizeType = UnsignedLong;
3055 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003056 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003057 }
3058};
3059} // end anonymous namespace
3060
3061namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003062class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3063public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003064 BitrigI386TargetInfo(const llvm::Triple &Triple)
3065 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003066 SizeType = UnsignedLong;
3067 IntPtrType = SignedLong;
3068 PtrDiffType = SignedLong;
3069 }
3070};
3071} // end anonymous namespace
3072
3073namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003074class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003076 DarwinI386TargetInfo(const llvm::Triple &Triple)
3077 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003078 LongDoubleWidth = 128;
3079 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003080 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003081 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003082 SizeType = UnsignedLong;
3083 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003084 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003085 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003086 }
3087
Eli Friedman3fd920a2008-08-20 02:34:37 +00003088};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003089} // end anonymous namespace
3090
3091namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003092// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003093class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003094public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003095 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3096 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003097 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003098 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003099 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003100 }
Craig Topper3164f332014-03-11 03:39:26 +00003101 void getTargetDefines(const LangOptions &Opts,
3102 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003103 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3104 }
3105};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003106
3107// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003108class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003109public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003110 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003111 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003112 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003113 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3114 }
Craig Topper3164f332014-03-11 03:39:26 +00003115 void getTargetDefines(const LangOptions &Opts,
3116 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003117 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3118 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3119 // The value of the following reflects processor type.
3120 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3121 // We lost the original triple, so we use the default.
3122 Builder.defineMacro("_M_IX86", "600");
3123 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003124};
3125} // end anonymous namespace
3126
Reid Kleckner47606832014-04-21 20:58:00 +00003127static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3128 Builder.defineMacro("__MSVCRT__");
3129 Builder.defineMacro("__MINGW32__");
3130
3131 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3132 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3133 // macro anyway for pre-processor compatibility.
3134 if (Opts.MicrosoftExt)
3135 Builder.defineMacro("__declspec", "__declspec");
3136 else
3137 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3138
3139 if (!Opts.MicrosoftExt) {
3140 // Provide macros for all the calling convention keywords. Provide both
3141 // single and double underscore prefixed variants. These are available on
3142 // x64 as well as x86, even though they have no effect.
3143 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3144 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003145 std::string GCCSpelling = "__attribute__((__";
3146 GCCSpelling += CC;
3147 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003148 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3149 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3150 }
3151 }
3152}
3153
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003154namespace {
3155// x86-32 MinGW target
3156class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3157public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003158 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3159 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003160 void getTargetDefines(const LangOptions &Opts,
3161 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003162 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003163 DefineStd(Builder, "WIN32", Opts);
3164 DefineStd(Builder, "WINNT", Opts);
3165 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003166 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003167 }
3168};
3169} // end anonymous namespace
3170
3171namespace {
3172// x86-32 Cygwin target
3173class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3174public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003175 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3176 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003177 TLSSupported = false;
3178 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003179 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003180 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003181 }
Craig Topper3164f332014-03-11 03:39:26 +00003182 void getTargetDefines(const LangOptions &Opts,
3183 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003184 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003185 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003186 Builder.defineMacro("__CYGWIN__");
3187 Builder.defineMacro("__CYGWIN32__");
3188 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003189 if (Opts.CPlusPlus)
3190 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003191 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003192};
3193} // end anonymous namespace
3194
3195namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003196// x86-32 Haiku target
3197class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3198public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003199 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003200 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003201 IntPtrType = SignedLong;
3202 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003203 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003204 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003205 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003206 }
Craig Topper3164f332014-03-11 03:39:26 +00003207 void getTargetDefines(const LangOptions &Opts,
3208 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003209 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3210 Builder.defineMacro("__INTEL__");
3211 Builder.defineMacro("__HAIKU__");
3212 }
3213};
3214} // end anonymous namespace
3215
Douglas Gregor9fabd852011-07-01 22:41:14 +00003216// RTEMS Target
3217template<typename Target>
3218class RTEMSTargetInfo : public OSTargetInfo<Target> {
3219protected:
Craig Topper3164f332014-03-11 03:39:26 +00003220 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3221 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003222 // RTEMS defines; list based off of gcc output
3223
Douglas Gregor9fabd852011-07-01 22:41:14 +00003224 Builder.defineMacro("__rtems__");
3225 Builder.defineMacro("__ELF__");
3226 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003227
Douglas Gregor9fabd852011-07-01 22:41:14 +00003228public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003229 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3230 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003231
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003232 switch (Triple.getArch()) {
3233 default:
3234 case llvm::Triple::x86:
3235 // this->MCountName = ".mcount";
3236 break;
3237 case llvm::Triple::mips:
3238 case llvm::Triple::mipsel:
3239 case llvm::Triple::ppc:
3240 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003241 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003242 // this->MCountName = "_mcount";
3243 break;
3244 case llvm::Triple::arm:
3245 // this->MCountName = "__mcount";
3246 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003247 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003248 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003249};
3250
3251namespace {
3252// x86-32 RTEMS target
3253class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3254public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003255 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003256 SizeType = UnsignedLong;
3257 IntPtrType = SignedLong;
3258 PtrDiffType = SignedLong;
3259 this->UserLabelPrefix = "";
3260 }
Craig Topper3164f332014-03-11 03:39:26 +00003261 void getTargetDefines(const LangOptions &Opts,
3262 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003263 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3264 Builder.defineMacro("__INTEL__");
3265 Builder.defineMacro("__rtems__");
3266 }
3267};
3268} // end anonymous namespace
3269
Chris Lattnerb986aba2010-04-11 19:29:39 +00003270namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003271// x86-64 generic target
3272class X86_64TargetInfo : public X86TargetInfo {
3273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003274 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003275 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003276 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003277 LongDoubleWidth = 128;
3278 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003279 LargeArrayMinWidth = 128;
3280 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003281 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003282 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3283 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3284 IntPtrType = IsX32 ? SignedInt : SignedLong;
3285 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003286 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003287 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003288
Zinovy Nis1db95732014-07-10 15:27:19 +00003289 DescriptionString = (IsX32)
3290 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3291 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003292
3293 // Use fpret only for long double.
3294 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003295
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003296 // Use fp2ret for _Complex long double.
3297 ComplexLongDoubleUsesFP2Ret = true;
3298
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003299 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003300 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003301 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003302 }
Craig Topper3164f332014-03-11 03:39:26 +00003303 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003304 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003305 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003306
Craig Topper3164f332014-03-11 03:39:26 +00003307 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003308 if (RegNo == 0) return 0;
3309 if (RegNo == 1) return 1;
3310 return -1;
3311 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003312
Craig Topper3164f332014-03-11 03:39:26 +00003313 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003314 return (CC == CC_C ||
3315 CC == CC_IntelOclBicc ||
3316 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003317 }
3318
Craig Topper3164f332014-03-11 03:39:26 +00003319 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003320 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003321 }
3322
Eli Friedman3fd920a2008-08-20 02:34:37 +00003323};
3324} // end anonymous namespace
3325
3326namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003327// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003328class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003329public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003330 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3331 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003332 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003333 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003334 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003335 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003336 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003337 SizeType = UnsignedLongLong;
3338 PtrDiffType = SignedLongLong;
3339 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003340 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003341 }
Craig Topper3164f332014-03-11 03:39:26 +00003342 void getTargetDefines(const LangOptions &Opts,
3343 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003344 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003345 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003346 }
Craig Topper3164f332014-03-11 03:39:26 +00003347 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003348 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003349 }
Craig Topper3164f332014-03-11 03:39:26 +00003350 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003351 return (CC == CC_C ||
3352 CC == CC_IntelOclBicc ||
3353 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3354 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003355};
3356} // end anonymous namespace
3357
3358namespace {
3359// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003360class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003361public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003362 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003364 LongDoubleWidth = LongDoubleAlign = 64;
3365 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003366 }
Craig Topper3164f332014-03-11 03:39:26 +00003367 void getTargetDefines(const LangOptions &Opts,
3368 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003369 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3370 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003371 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003372 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003373 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003374};
3375} // end anonymous namespace
3376
3377namespace {
3378// x86-64 MinGW target
3379class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3380public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003381 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3382 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003383 void getTargetDefines(const LangOptions &Opts,
3384 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003385 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003386 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003387 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003388 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003389 }
3390};
3391} // end anonymous namespace
3392
3393namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003394class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3395public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003396 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3397 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003398 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003399 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003400 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3401 llvm::Triple T = llvm::Triple(Triple);
3402 if (T.getOS() == llvm::Triple::IOS)
3403 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003404 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003405 }
3406};
3407} // end anonymous namespace
3408
3409namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003410class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3411public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003412 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3413 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003414 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003415 Int64Type = SignedLongLong;
3416 }
3417};
3418} // end anonymous namespace
3419
3420namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003421class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3422public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003423 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3424 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3425 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003426 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003427 }
3428};
Tim Northover9bb857a2013-01-31 12:13:10 +00003429}
3430
Eli Friedman9fa28852012-08-08 23:57:20 +00003431
3432namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003433class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003434 // Possible FPU choices.
3435 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003436 VFP2FPU = (1 << 0),
3437 VFP3FPU = (1 << 1),
3438 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003439 NeonFPU = (1 << 3),
3440 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003441 };
3442
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003443 // Possible HWDiv features.
3444 enum HWDivMode {
3445 HWDivThumb = (1 << 0),
3446 HWDivARM = (1 << 1)
3447 };
3448
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003449 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003450 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003451 }
3452
3453 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3454 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003455
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003456 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003457
Rafael Espindolaeb265472013-08-21 21:59:03 +00003458 enum {
3459 FP_Default,
3460 FP_VFP,
3461 FP_Neon
3462 } FPMath;
3463
Bernard Ogdenda13af32013-10-24 18:32:51 +00003464 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003465
Logan Chien57086ce2012-10-10 06:56:20 +00003466 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003467 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003468 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003469
3470 // Initialized via features.
3471 unsigned SoftFloat : 1;
3472 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003473
Bernard Ogden18b57012013-10-29 09:47:51 +00003474 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003475 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003476
Chris Lattner5cc15e02010-03-03 19:03:45 +00003477 static const Builtin::Info BuiltinInfo[];
3478
Rafael Espindola101d5b92013-05-13 20:09:47 +00003479 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003480 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003481 if (T.getArch() == llvm::Triple::arm ||
3482 T.getArch() == llvm::Triple::armeb) {
3483 StringRef VersionStr;
3484 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003485 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003486 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003487 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003488 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003489 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003490 unsigned Version;
3491 if (VersionStr.getAsInteger(10, Version))
3492 return false;
3493 return Version >= 6;
3494 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003495 assert(T.getArch() == llvm::Triple::thumb ||
3496 T.getArch() == llvm::Triple::thumbeb);
3497 StringRef VersionStr;
3498 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003499 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003500 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003501 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003502 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003503 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003504 unsigned Version;
3505 if (VersionStr.getAsInteger(10, Version))
3506 return false;
3507 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003508 }
3509
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003510 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003511 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003512
3513 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003514 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003515
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003516 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003517 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003518 SizeType = UnsignedLong;
3519 else
3520 SizeType = UnsignedInt;
3521
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003522 switch (T.getOS()) {
3523 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003524 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003525 break;
3526 case llvm::Triple::Win32:
3527 WCharType = UnsignedShort;
3528 break;
3529 case llvm::Triple::Linux:
3530 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003531 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3532 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003533 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003534 }
3535
3536 UseBitFieldTypeAlignment = true;
3537
3538 ZeroLengthBitfieldBoundary = 0;
3539
3540 if (IsThumb) {
3541 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3542 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003543 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003544 DescriptionString = BigEndian ?
3545 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3546 "v128:64:128-a:0:32-n32-S64" :
3547 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3548 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003549 } else if (T.isOSWindows()) {
3550 // FIXME: this is invalid for WindowsCE
3551 assert(!BigEndian && "Windows on ARM does not support big endian");
3552 DescriptionString = "e"
3553 "-m:e"
3554 "-p:32:32"
3555 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3556 "-v128:64:128"
3557 "-a:0:32"
3558 "-n32"
3559 "-S64";
3560 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003561 DescriptionString = BigEndian ?
3562 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3563 "v128:64:128-a:0:32-n32-S64" :
3564 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3565 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003566 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003567 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003568 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003569 DescriptionString = BigEndian ?
3570 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3571 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003572 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003573 DescriptionString = BigEndian ?
3574 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3575 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003576 }
3577
3578 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003579 }
3580
3581 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003582 const llvm::Triple &T = getTriple();
3583
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003584 IsAAPCS = false;
3585
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003586 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003587
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003588 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003589 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003590 SizeType = UnsignedInt;
3591 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003592 SizeType = UnsignedLong;
3593
3594 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3595 WCharType = SignedInt;
3596
3597 // Do not respect the alignment of bit-field types when laying out
3598 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3599 UseBitFieldTypeAlignment = false;
3600
3601 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3602 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3603 /// gcc.
3604 ZeroLengthBitfieldBoundary = 32;
3605
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003606 if (IsThumb) {
3607 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3608 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003609 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003610 DescriptionString = BigEndian ?
3611 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3612 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3613 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3614 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003615 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003616 DescriptionString = BigEndian ?
3617 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3618 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3619 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3620 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003621 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003622 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003623 DescriptionString = BigEndian ?
3624 "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 +00003625 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3626 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003627 DescriptionString = BigEndian ?
3628 "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 +00003629 "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 +00003630 }
3631
3632 // FIXME: Override "preferred align" for double and long long.
3633 }
3634
Chris Lattner17df24e2008-04-21 18:56:49 +00003635public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003636 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003637 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3638 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003639 BigEndian = IsBigEndian;
3640
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003641 switch (getTriple().getOS()) {
3642 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003643 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003644 break;
3645 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003646 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003647 break;
3648 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003649
Chris Lattner1a8f3942010-04-23 16:29:58 +00003650 // {} in inline assembly are neon specifiers, not assembly variant
3651 // specifiers.
3652 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003653
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003654 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003655 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003656
3657 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003658
3659 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003660 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003661
3662 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003663 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003664 if (shouldUseInlineAtomic(getTriple()))
3665 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003666
3667 // Do force alignment of members that follow zero length bitfields. If
3668 // the alignment of the zero-length bitfield is greater than the member
3669 // that follows it, `bar', `bar' will be aligned as the type of the
3670 // zero length bitfield.
3671 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003672 }
Alp Toker4925ba72014-06-07 23:30:42 +00003673 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003674 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003675 ABI = Name;
3676
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003677 // The defaults (above) are for AAPCS, check if we need to change them.
3678 //
3679 // FIXME: We need support for -meabi... we could just mangle it into the
3680 // name.
3681 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003682 setABIAPCS();
3683 return true;
3684 }
3685 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3686 setABIAAPCS();
3687 return true;
3688 }
3689 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003690 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003691
Craig Topper3164f332014-03-11 03:39:26 +00003692 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003693 if (IsAAPCS)
3694 Features["aapcs"] = true;
3695 else
3696 Features["apcs"] = true;
3697
Silviu Barangae5690462013-10-21 10:59:33 +00003698 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003699 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3700 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003701 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3702 CPU == "cortex-a9-mp") {
3703 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003704 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003705 }
3706 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003707 Features["vfp4"] = true;
3708 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003709 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3710 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3711 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003712 Features["vfp4"] = true;
3713 Features["neon"] = true;
3714 Features["hwdiv"] = true;
3715 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003716 } else if (CPU == "cyclone") {
3717 Features["v8fp"] = true;
3718 Features["neon"] = true;
3719 Features["hwdiv"] = true;
3720 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003721 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3722 Features["fp-armv8"] = true;
3723 Features["neon"] = true;
3724 Features["hwdiv"] = true;
3725 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003726 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003727 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003728 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003729 // Enable the hwdiv extension for all v8a AArch32 cores by
3730 // default.
3731 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003732 ArchName == "armebv8a" || ArchName == "armebv8" ||
3733 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3734 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003735 Features["hwdiv"] = true;
3736 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003737 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3738 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003739 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003740 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003741
Craig Topper3164f332014-03-11 03:39:26 +00003742 bool handleTargetFeatures(std::vector<std::string> &Features,
3743 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003744 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003745 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003746 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003747 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003748 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003749 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3750 if (Features[i] == "+soft-float")
3751 SoftFloat = true;
3752 else if (Features[i] == "+soft-float-abi")
3753 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003754 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003755 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003756 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003757 FPU |= VFP3FPU;
3758 else if (Features[i] == "+vfp4")
3759 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003760 else if (Features[i] == "+fp-armv8")
3761 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003762 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003763 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003764 else if (Features[i] == "+hwdiv")
3765 HWDiv |= HWDivThumb;
3766 else if (Features[i] == "+hwdiv-arm")
3767 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003768 else if (Features[i] == "+crc")
3769 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003770 else if (Features[i] == "+crypto")
3771 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003772 }
3773
Rafael Espindolaeb265472013-08-21 21:59:03 +00003774 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3775 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3776 return false;
3777 }
3778
3779 if (FPMath == FP_Neon)
3780 Features.push_back("+neonfp");
3781 else if (FPMath == FP_VFP)
3782 Features.push_back("-neonfp");
3783
Daniel Dunbar893d4752009-12-19 04:15:38 +00003784 // Remove front-end specific options which the backend handles differently.
3785 std::vector<std::string>::iterator it;
3786 it = std::find(Features.begin(), Features.end(), "+soft-float");
3787 if (it != Features.end())
3788 Features.erase(it);
3789 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3790 if (it != Features.end())
3791 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003792 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003793 }
3794
Craig Topper3164f332014-03-11 03:39:26 +00003795 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003796 return llvm::StringSwitch<bool>(Feature)
3797 .Case("arm", true)
3798 .Case("softfloat", SoftFloat)
3799 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003800 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003801 .Case("hwdiv", HWDiv & HWDivThumb)
3802 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003803 .Default(false);
3804 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003805 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003806 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003807 return llvm::StringSwitch<const char*>(Name)
3808 .Cases("arm8", "arm810", "4")
3809 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3810 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3811 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3812 .Case("ep9312", "4T")
3813 .Cases("arm10tdmi", "arm1020t", "5T")
3814 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3815 .Case("arm926ej-s", "5TEJ")
3816 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3817 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003818 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003819 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003820 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003821 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003822 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003823 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003824 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003825 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003826 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003827 .Case("cortex-m3", "7M")
3828 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003829 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003830 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003831 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003832 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003833 static const char *getCPUProfile(StringRef Name) {
3834 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003835 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003836 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003837 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003838 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003839 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003840 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003841 }
Craig Topper3164f332014-03-11 03:39:26 +00003842 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003843 if (!getCPUDefineSuffix(Name))
3844 return false;
3845
Tim Northovere8c37212014-07-09 09:24:43 +00003846 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3847 StringRef Profile = getCPUProfile(Name);
3848 if (Profile == "M" && MaxAtomicInlineWidth) {
3849 MaxAtomicPromoteWidth = 32;
3850 MaxAtomicInlineWidth = 32;
3851 }
3852
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003853 CPU = Name;
3854 return true;
3855 }
Craig Topper3164f332014-03-11 03:39:26 +00003856 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003857 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3858 unsigned CPUArchVer) const {
3859 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3860 (CPUArch.find('M') != StringRef::npos);
3861 }
3862 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3863 unsigned CPUArchVer) const {
3864 // We check both CPUArchVer and ArchName because when only triple is
3865 // specified, the default CPU is arm1136j-s.
3866 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3867 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3868 }
Craig Topper3164f332014-03-11 03:39:26 +00003869 void getTargetDefines(const LangOptions &Opts,
3870 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00003871 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003872 Builder.defineMacro("__arm");
3873 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003874
Chris Lattnerecd49032009-03-02 22:27:17 +00003875 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003876 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003877
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003878 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003879 unsigned int CPUArchVer;
3880 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3881 llvm_unreachable("Invalid char for architecture version number");
3882 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003883 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003884
3885 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003886 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003887 StringRef ArchName = getTriple().getArchName();
3888
3889 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3890 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3891
3892 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3893 // is not defined for the M-profile.
3894 // NOTE that the deffault profile is assumed to be 'A'
3895 if (CPUProfile.empty() || CPUProfile != "M")
3896 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3897
3898 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3899 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3900 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3901 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3902 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3903 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3904 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3905
3906 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3907 // instruction set such as ARM or Thumb.
3908 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3909
3910 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3911
3912 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003913 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003914 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003915
Yi Konga44c4d72014-06-27 21:25:42 +00003916 // ACLE predefines.
3917 Builder.defineMacro("__ARM_ACLE", "200");
3918
Mike Stump9d54bd72009-04-08 02:07:04 +00003919 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003920
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003921 // FIXME: It's more complicated than this and we don't really support
3922 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003923 // Windows on ARM does not "support" interworking
3924 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003925 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926
David Tweed8f676532012-10-25 13:33:01 +00003927 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003928 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003929 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
3930 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003931 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003932 Builder.defineMacro("__ARM_PCS", "1");
3933
David Tweed8f676532012-10-25 13:33:01 +00003934 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003935 Builder.defineMacro("__ARM_PCS_VFP", "1");
3936 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003937
Daniel Dunbar893d4752009-12-19 04:15:38 +00003938 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003939 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003940
3941 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003942 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003943
3944 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003945 Builder.defineMacro("__THUMBEL__");
3946 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003947 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003948 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003949 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003950 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3951 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003952
3953 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003954 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003955
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003956 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003957 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003958 if (FPU & VFP2FPU)
3959 Builder.defineMacro("__ARM_VFPV2__");
3960 if (FPU & VFP3FPU)
3961 Builder.defineMacro("__ARM_VFPV3__");
3962 if (FPU & VFP4FPU)
3963 Builder.defineMacro("__ARM_VFPV4__");
3964 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003965
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003966 // This only gets set when Neon instructions are actually available, unlike
3967 // the VFP define, hence the soft float and arch check. This is subtly
3968 // different from gcc, we follow the intent which was that it should be set
3969 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00003970 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
3971 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003972 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00003973 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00003974
Bradley Smith0f28f0c2014-01-20 10:52:00 +00003975 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
3976 Opts.ShortWChar ? "2" : "4");
3977
3978 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
3979 Opts.ShortEnums ? "1" : "4");
3980
Bernard Ogden18b57012013-10-29 09:47:51 +00003981 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00003982 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00003983
Tim Northover02e38602014-02-03 17:28:04 +00003984 if (Crypto)
3985 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
3986
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003987 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00003988 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3989 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3990 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3991 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3992 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003993 }
Craig Topper3164f332014-03-11 03:39:26 +00003994 void getTargetBuiltins(const Builtin::Info *&Records,
3995 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00003996 Records = BuiltinInfo;
3997 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00003998 }
Craig Topper3164f332014-03-11 03:39:26 +00003999 bool isCLZForZeroUndef() const override { return false; }
4000 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004001 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004002 }
Craig Topper3164f332014-03-11 03:39:26 +00004003 void getGCCRegNames(const char * const *&Names,
4004 unsigned &NumNames) const override;
4005 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4006 unsigned &NumAliases) const override;
4007 bool validateAsmConstraint(const char *&Name,
4008 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004009 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004010 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004011 case 'l': // r0-r7
4012 case 'h': // r8-r15
4013 case 'w': // VFP Floating point register single precision
4014 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004015 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004016 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004017 case 'Q': // A memory address that is a single base register.
4018 Info.setAllowsMemory();
4019 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004020 case 'U': // a memory reference...
4021 switch (Name[1]) {
4022 case 'q': // ...ARMV4 ldrsb
4023 case 'v': // ...VFP load/store (reg+constant offset)
4024 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004025 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004026 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004027 case 'n': // valid address for Neon doubleword vector load/store
4028 case 'm': // valid address for Neon element and structure load/store
4029 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004030 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004031 Info.setAllowsMemory();
4032 Name++;
4033 return true;
4034 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004035 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004036 return false;
4037 }
Craig Topper3164f332014-03-11 03:39:26 +00004038 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004039 std::string R;
4040 switch (*Constraint) {
4041 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004042 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004043 Constraint++;
4044 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004045 case 'p': // 'p' should be translated to 'r' by default.
4046 R = std::string("r");
4047 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004048 default:
4049 return std::string(1, *Constraint);
4050 }
4051 return R;
4052 }
Craig Topper3164f332014-03-11 03:39:26 +00004053 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4054 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004055 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004056 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004057
Bill Wendling9d1ee112012-10-25 23:28:48 +00004058 // Strip off constraint modifiers.
4059 while (Constraint[0] == '=' ||
4060 Constraint[0] == '+' ||
4061 Constraint[0] == '&')
4062 Constraint = Constraint.substr(1);
4063
4064 switch (Constraint[0]) {
4065 default: break;
4066 case 'r': {
4067 switch (Modifier) {
4068 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004069 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004070 case 'q':
4071 // A register of size 32 cannot fit a vector type.
4072 return false;
4073 }
4074 }
4075 }
4076
4077 return true;
4078 }
Craig Topper3164f332014-03-11 03:39:26 +00004079 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004080 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004081 return "";
4082 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004083
Craig Topper3164f332014-03-11 03:39:26 +00004084 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004085 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4086 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004087
Craig Topper3164f332014-03-11 03:39:26 +00004088 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004089 if (RegNo == 0) return 0;
4090 if (RegNo == 1) return 1;
4091 return -1;
4092 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004093};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004094
Rafael Espindolaeb265472013-08-21 21:59:03 +00004095bool ARMTargetInfo::setFPMath(StringRef Name) {
4096 if (Name == "neon") {
4097 FPMath = FP_Neon;
4098 return true;
4099 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4100 Name == "vfp4") {
4101 FPMath = FP_VFP;
4102 return true;
4103 }
4104 return false;
4105}
4106
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004107const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004108 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004109 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004110 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4111
4112 // Float registers
4113 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4114 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4115 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004116 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004117
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004118 // Double registers
4119 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4120 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004121 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4122 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004123
4124 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004125 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4126 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004127};
4128
4129void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004130 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004131 Names = GCCRegNames;
4132 NumNames = llvm::array_lengthof(GCCRegNames);
4133}
4134
4135const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004136 { { "a1" }, "r0" },
4137 { { "a2" }, "r1" },
4138 { { "a3" }, "r2" },
4139 { { "a4" }, "r3" },
4140 { { "v1" }, "r4" },
4141 { { "v2" }, "r5" },
4142 { { "v3" }, "r6" },
4143 { { "v4" }, "r7" },
4144 { { "v5" }, "r8" },
4145 { { "v6", "rfp" }, "r9" },
4146 { { "sl" }, "r10" },
4147 { { "fp" }, "r11" },
4148 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004149 { { "r13" }, "sp" },
4150 { { "r14" }, "lr" },
4151 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004152 // The S, D and Q registers overlap, but aren't really aliases; we
4153 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004154};
4155
4156void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4157 unsigned &NumAliases) const {
4158 Aliases = GCCRegAliases;
4159 NumAliases = llvm::array_lengthof(GCCRegAliases);
4160}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004161
4162const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004163#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004164#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004165 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004166#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004167
4168#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004169#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004170#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4171 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004172#include "clang/Basic/BuiltinsARM.def"
4173};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004174
4175class ARMleTargetInfo : public ARMTargetInfo {
4176public:
4177 ARMleTargetInfo(const llvm::Triple &Triple)
4178 : ARMTargetInfo(Triple, false) { }
4179 virtual void getTargetDefines(const LangOptions &Opts,
4180 MacroBuilder &Builder) const {
4181 Builder.defineMacro("__ARMEL__");
4182 ARMTargetInfo::getTargetDefines(Opts, Builder);
4183 }
4184};
4185
4186class ARMbeTargetInfo : public ARMTargetInfo {
4187public:
4188 ARMbeTargetInfo(const llvm::Triple &Triple)
4189 : ARMTargetInfo(Triple, true) { }
4190 virtual void getTargetDefines(const LangOptions &Opts,
4191 MacroBuilder &Builder) const {
4192 Builder.defineMacro("__ARMEB__");
4193 Builder.defineMacro("__ARM_BIG_ENDIAN");
4194 ARMTargetInfo::getTargetDefines(Opts, Builder);
4195 }
4196};
Chris Lattner17df24e2008-04-21 18:56:49 +00004197} // end anonymous namespace.
4198
Eli Friedmanf05b7722008-08-20 07:44:10 +00004199namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004200class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4201 const llvm::Triple Triple;
4202public:
4203 WindowsARMTargetInfo(const llvm::Triple &Triple)
4204 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4205 TLSSupported = false;
4206 WCharType = UnsignedShort;
4207 SizeType = UnsignedInt;
4208 UserLabelPrefix = "";
4209 }
4210 void getVisualStudioDefines(const LangOptions &Opts,
4211 MacroBuilder &Builder) const {
4212 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4213
4214 // FIXME: this is invalid for WindowsCE
4215 Builder.defineMacro("_M_ARM_NT", "1");
4216 Builder.defineMacro("_M_ARMT", "_M_ARM");
4217 Builder.defineMacro("_M_THUMB", "_M_ARM");
4218
4219 assert((Triple.getArch() == llvm::Triple::arm ||
4220 Triple.getArch() == llvm::Triple::thumb) &&
4221 "invalid architecture for Windows ARM target info");
4222 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4223 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4224
4225 // TODO map the complete set of values
4226 // 31: VFPv3 40: VFPv4
4227 Builder.defineMacro("_M_ARM_FP", "31");
4228 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004229 BuiltinVaListKind getBuiltinVaListKind() const override {
4230 return TargetInfo::CharPtrBuiltinVaList;
4231 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004232};
4233
4234// Windows ARM + Itanium C++ ABI Target
4235class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4236public:
4237 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4238 : WindowsARMTargetInfo(Triple) {
4239 TheCXXABI.set(TargetCXXABI::GenericARM);
4240 }
4241
4242 void getTargetDefines(const LangOptions &Opts,
4243 MacroBuilder &Builder) const override {
4244 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4245
4246 if (Opts.MSVCCompat)
4247 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4248 }
4249};
4250
4251// Windows ARM, MS (C++) ABI
4252class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4253public:
4254 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4255 : WindowsARMTargetInfo(Triple) {
4256 TheCXXABI.set(TargetCXXABI::Microsoft);
4257 }
4258
4259 void getTargetDefines(const LangOptions &Opts,
4260 MacroBuilder &Builder) const override {
4261 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4262 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4263 }
4264};
4265}
4266
4267
4268namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004269class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004270 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004271protected:
Craig Topper3164f332014-03-11 03:39:26 +00004272 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4273 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004274 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004275 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004276
Torok Edwinb2b37c62009-06-30 17:10:35 +00004277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004278 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004279 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004280 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004281 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004282 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004283 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004284
4285 // Darwin on iOS uses a variant of the ARM C++ ABI.
4286 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004287 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004288};
4289} // end anonymous namespace.
4290
Tony Linthicum76329bf2011-12-12 21:14:55 +00004291
4292namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004293class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004294 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004295 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4296 static const char *const GCCRegNames[];
4297
James Molloy75f5f9e2014-04-16 15:33:48 +00004298 enum FPUModeEnum {
4299 FPUMode,
4300 NeonMode
4301 };
4302
Kevin Qinafd88472014-06-11 01:42:16 +00004303 std::string CPU;
James Molloy75f5f9e2014-04-16 15:33:48 +00004304 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004305 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004306 unsigned Crypto;
4307
Tim Northovera2ee4332014-03-29 15:09:45 +00004308 static const Builtin::Info BuiltinInfo[];
4309
4310 std::string ABI;
4311
4312public:
Tim Northover573cbee2014-05-24 12:52:07 +00004313 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004314 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004315
4316 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4317 WCharType = SignedInt;
4318
4319 // NetBSD apparently prefers consistency across ARM targets to consistency
4320 // across 64-bit targets.
4321 Int64Type = SignedLongLong;
4322 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004323 } else {
4324 WCharType = UnsignedInt;
4325 Int64Type = SignedLong;
4326 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004327 }
4328
Tim Northovera2ee4332014-03-29 15:09:45 +00004329 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004330 MaxVectorAlign = 128;
4331 RegParmMax = 8;
4332 MaxAtomicInlineWidth = 128;
4333 MaxAtomicPromoteWidth = 128;
4334
4335 LongDoubleWidth = LongDoubleAlign = 128;
4336 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4337
Tim Northovera2ee4332014-03-29 15:09:45 +00004338 // {} in inline assembly are neon specifiers, not assembly variant
4339 // specifiers.
4340 NoAsmVariants = true;
4341
Tim Northover573cbee2014-05-24 12:52:07 +00004342 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004343 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4344 }
4345
Alp Toker4925ba72014-06-07 23:30:42 +00004346 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004347 virtual bool setABI(const std::string &Name) {
4348 if (Name != "aapcs" && Name != "darwinpcs")
4349 return false;
4350
4351 ABI = Name;
4352 return true;
4353 }
4354
4355 virtual bool setCPU(const std::string &Name) {
4356 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004357 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004358 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004359 .Case("cyclone", true)
4360 .Default(false);
Kevin Qinafd88472014-06-11 01:42:16 +00004361 if (CPUKnown)
4362 CPU = Name;
Tim Northovera2ee4332014-03-29 15:09:45 +00004363 return CPUKnown;
4364 }
4365
4366 virtual void getTargetDefines(const LangOptions &Opts,
4367 MacroBuilder &Builder) const {
4368 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004369 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004370
4371 // Target properties.
4372 Builder.defineMacro("_LP64");
4373 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004374
4375 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4376 Builder.defineMacro("__ARM_ACLE", "200");
4377 Builder.defineMacro("__ARM_ARCH", "8");
4378 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4379
4380 Builder.defineMacro("__ARM_64BIT_STATE");
4381 Builder.defineMacro("__ARM_PCS_AAPCS64");
4382 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4383
4384 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4385 Builder.defineMacro("__ARM_FEATURE_CLZ");
4386 Builder.defineMacro("__ARM_FEATURE_FMA");
4387 Builder.defineMacro("__ARM_FEATURE_DIV");
4388
4389 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4390
4391 // 0xe implies support for half, single and double precision operations.
4392 Builder.defineMacro("__ARM_FP", "0xe");
4393
4394 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4395 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4396 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4397
4398 if (Opts.FastMath || Opts.FiniteMathOnly)
4399 Builder.defineMacro("__ARM_FP_FAST");
4400
4401 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4402 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4403
4404 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4405
4406 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4407 Opts.ShortEnums ? "1" : "4");
4408
James Molloy75f5f9e2014-04-16 15:33:48 +00004409 if (FPU == NeonMode) {
4410 Builder.defineMacro("__ARM_NEON");
4411 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004412 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004413 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004414
Bradley Smith418c5932014-05-02 15:17:51 +00004415 if (CRC)
4416 Builder.defineMacro("__ARM_FEATURE_CRC32");
4417
James Molloy75f5f9e2014-04-16 15:33:48 +00004418 if (Crypto)
4419 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004420 }
4421
4422 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4423 unsigned &NumRecords) const {
4424 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004425 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004426 }
4427
4428 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004429 return Feature == "aarch64" ||
4430 Feature == "arm64" ||
4431 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004432 }
4433
Kevin Qinafd88472014-06-11 01:42:16 +00004434 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
4435
4436 if (CPU == "cyclone") {
4437 Features["fp-armv8"] = true;
4438 Features["neon"] = true;
4439 Features["crypto"] = true;
4440 Features["crc"] = true;
4441 Features["zcm"] = true;
4442 Features["zcz"] = true;
4443 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
4444 Features["fp-armv8"] = true;
4445 Features["neon"] = true;
4446 Features["crypto"] = true;
4447 Features["crc"] = true;
4448 }
4449}
4450
James Molloy5e73df52014-04-16 15:06:20 +00004451 bool handleTargetFeatures(std::vector<std::string> &Features,
4452 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004453 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004454 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004455 Crypto = 0;
4456 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4457 if (Features[i] == "+neon")
4458 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004459 if (Features[i] == "+crc")
4460 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004461 if (Features[i] == "+crypto")
4462 Crypto = 1;
4463 }
4464
James Molloy5e73df52014-04-16 15:06:20 +00004465 setDescriptionString();
4466
4467 return true;
4468 }
4469
Tim Northovera2ee4332014-03-29 15:09:45 +00004470 virtual bool isCLZForZeroUndef() const { return false; }
4471
4472 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4473 return TargetInfo::AArch64ABIBuiltinVaList;
4474 }
4475
4476 virtual void getGCCRegNames(const char *const *&Names,
4477 unsigned &NumNames) const;
4478 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4479 unsigned &NumAliases) const;
4480
4481 virtual bool validateAsmConstraint(const char *&Name,
4482 TargetInfo::ConstraintInfo &Info) const {
4483 switch (*Name) {
4484 default:
4485 return false;
4486 case 'w': // Floating point and SIMD registers (V0-V31)
4487 Info.setAllowsRegister();
4488 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004489 case 'I': // Constant that can be used with an ADD instruction
4490 case 'J': // Constant that can be used with a SUB instruction
4491 case 'K': // Constant that can be used with a 32-bit logical instruction
4492 case 'L': // Constant that can be used with a 64-bit logical instruction
4493 case 'M': // Constant that can be used as a 32-bit MOV immediate
4494 case 'N': // Constant that can be used as a 64-bit MOV immediate
4495 case 'Y': // Floating point constant zero
4496 case 'Z': // Integer constant zero
4497 return true;
4498 case 'Q': // A memory reference with base register and no offset
4499 Info.setAllowsMemory();
4500 return true;
4501 case 'S': // A symbolic address
4502 Info.setAllowsRegister();
4503 return true;
4504 case 'U':
4505 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4506 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4507 // Usa: An absolute symbolic address
4508 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4509 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004510 case 'z': // Zero register, wzr or xzr
4511 Info.setAllowsRegister();
4512 return true;
4513 case 'x': // Floating point and SIMD registers (V0-V15)
4514 Info.setAllowsRegister();
4515 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004516 }
4517 return false;
4518 }
4519
Tim Northovera2ee4332014-03-29 15:09:45 +00004520 virtual const char *getClobbers() const { return ""; }
4521
4522 int getEHDataRegisterNumber(unsigned RegNo) const {
4523 if (RegNo == 0)
4524 return 0;
4525 if (RegNo == 1)
4526 return 1;
4527 return -1;
4528 }
4529};
4530
Tim Northover573cbee2014-05-24 12:52:07 +00004531const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004532 // 32-bit Integer registers
4533 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4534 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4535 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4536
4537 // 64-bit Integer registers
4538 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4539 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4540 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4541
4542 // 32-bit floating point regsisters
4543 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4544 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4545 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4546
4547 // 64-bit floating point regsisters
4548 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4549 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4550 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4551
4552 // Vector registers
4553 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4554 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4555 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4556};
4557
Tim Northover573cbee2014-05-24 12:52:07 +00004558void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004559 unsigned &NumNames) const {
4560 Names = GCCRegNames;
4561 NumNames = llvm::array_lengthof(GCCRegNames);
4562}
4563
Tim Northover573cbee2014-05-24 12:52:07 +00004564const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004565 { { "w31" }, "wsp" },
4566 { { "x29" }, "fp" },
4567 { { "x30" }, "lr" },
4568 { { "x31" }, "sp" },
4569 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4570 // don't want to substitute one of these for a different-sized one.
4571};
4572
Tim Northover573cbee2014-05-24 12:52:07 +00004573void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004574 unsigned &NumAliases) const {
4575 Aliases = GCCRegAliases;
4576 NumAliases = llvm::array_lengthof(GCCRegAliases);
4577}
4578
Tim Northover573cbee2014-05-24 12:52:07 +00004579const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004580#define BUILTIN(ID, TYPE, ATTRS) \
4581 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4582#include "clang/Basic/BuiltinsNEON.def"
4583
4584#define BUILTIN(ID, TYPE, ATTRS) \
4585 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004586#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004587};
James Molloy5e73df52014-04-16 15:06:20 +00004588
Tim Northover573cbee2014-05-24 12:52:07 +00004589class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004590 void setDescriptionString() override {
4591 if (getTriple().isOSBinFormatMachO())
4592 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4593 else
4594 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4595 }
4596
4597public:
Tim Northover573cbee2014-05-24 12:52:07 +00004598 AArch64leTargetInfo(const llvm::Triple &Triple)
4599 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004600 BigEndian = false;
4601 }
4602 void getTargetDefines(const LangOptions &Opts,
4603 MacroBuilder &Builder) const override {
4604 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004605 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004606 }
4607};
4608
Tim Northover573cbee2014-05-24 12:52:07 +00004609class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004610 void setDescriptionString() override {
4611 assert(!getTriple().isOSBinFormatMachO());
4612 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4613 }
4614
4615public:
Tim Northover573cbee2014-05-24 12:52:07 +00004616 AArch64beTargetInfo(const llvm::Triple &Triple)
4617 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004618 void getTargetDefines(const LangOptions &Opts,
4619 MacroBuilder &Builder) const override {
4620 Builder.defineMacro("__AARCH64EB__");
4621 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4622 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004623 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004624 }
4625};
Tim Northovera2ee4332014-03-29 15:09:45 +00004626} // end anonymous namespace.
4627
4628namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004629class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004630protected:
4631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4632 MacroBuilder &Builder) const override {
4633 Builder.defineMacro("__AARCH64_SIMD__");
4634 Builder.defineMacro("__ARM64_ARCH_8__");
4635 Builder.defineMacro("__ARM_NEON__");
4636 Builder.defineMacro("__LITTLE_ENDIAN__");
4637 Builder.defineMacro("__REGISTER_PREFIX__", "");
4638 Builder.defineMacro("__arm64", "1");
4639 Builder.defineMacro("__arm64__", "1");
4640
4641 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4642 }
4643
Tim Northovera2ee4332014-03-29 15:09:45 +00004644public:
Tim Northover573cbee2014-05-24 12:52:07 +00004645 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4646 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004647 Int64Type = SignedLongLong;
4648 WCharType = SignedInt;
4649 UseSignedCharForObjCBool = false;
4650
4651 LongDoubleWidth = LongDoubleAlign = 64;
4652 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4653
4654 TheCXXABI.set(TargetCXXABI::iOS64);
4655 }
4656
4657 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4658 return TargetInfo::CharPtrBuiltinVaList;
4659 }
4660};
4661} // end anonymous namespace
4662
4663namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004664// Hexagon abstract base class
4665class HexagonTargetInfo : public TargetInfo {
4666 static const Builtin::Info BuiltinInfo[];
4667 static const char * const GCCRegNames[];
4668 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4669 std::string CPU;
4670public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004671 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004672 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004673 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004674
4675 // {} in inline assembly are packet specifiers, not assembly variant
4676 // specifiers.
4677 NoAsmVariants = true;
4678 }
4679
Craig Topper3164f332014-03-11 03:39:26 +00004680 void getTargetBuiltins(const Builtin::Info *&Records,
4681 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004682 Records = BuiltinInfo;
4683 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4684 }
4685
Craig Topper3164f332014-03-11 03:39:26 +00004686 bool validateAsmConstraint(const char *&Name,
4687 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004688 return true;
4689 }
4690
Craig Topper3164f332014-03-11 03:39:26 +00004691 void getTargetDefines(const LangOptions &Opts,
4692 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004693
Craig Topper3164f332014-03-11 03:39:26 +00004694 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004695 return Feature == "hexagon";
4696 }
Craig Topper3164f332014-03-11 03:39:26 +00004697
4698 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004699 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004700 }
Craig Topper3164f332014-03-11 03:39:26 +00004701 void getGCCRegNames(const char * const *&Names,
4702 unsigned &NumNames) const override;
4703 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4704 unsigned &NumAliases) const override;
4705 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004706 return "";
4707 }
Sebastian Pop86500282012-01-13 20:37:10 +00004708
4709 static const char *getHexagonCPUSuffix(StringRef Name) {
4710 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004711 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004712 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004713 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004714 }
4715
Craig Topper3164f332014-03-11 03:39:26 +00004716 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004717 if (!getHexagonCPUSuffix(Name))
4718 return false;
4719
Tony Linthicum76329bf2011-12-12 21:14:55 +00004720 CPU = Name;
4721 return true;
4722 }
4723};
4724
4725void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4726 MacroBuilder &Builder) const {
4727 Builder.defineMacro("qdsp6");
4728 Builder.defineMacro("__qdsp6", "1");
4729 Builder.defineMacro("__qdsp6__", "1");
4730
4731 Builder.defineMacro("hexagon");
4732 Builder.defineMacro("__hexagon", "1");
4733 Builder.defineMacro("__hexagon__", "1");
4734
4735 if(CPU == "hexagonv1") {
4736 Builder.defineMacro("__HEXAGON_V1__");
4737 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4738 if(Opts.HexagonQdsp6Compat) {
4739 Builder.defineMacro("__QDSP6_V1__");
4740 Builder.defineMacro("__QDSP6_ARCH__", "1");
4741 }
4742 }
4743 else if(CPU == "hexagonv2") {
4744 Builder.defineMacro("__HEXAGON_V2__");
4745 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4746 if(Opts.HexagonQdsp6Compat) {
4747 Builder.defineMacro("__QDSP6_V2__");
4748 Builder.defineMacro("__QDSP6_ARCH__", "2");
4749 }
4750 }
4751 else if(CPU == "hexagonv3") {
4752 Builder.defineMacro("__HEXAGON_V3__");
4753 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4754 if(Opts.HexagonQdsp6Compat) {
4755 Builder.defineMacro("__QDSP6_V3__");
4756 Builder.defineMacro("__QDSP6_ARCH__", "3");
4757 }
4758 }
4759 else if(CPU == "hexagonv4") {
4760 Builder.defineMacro("__HEXAGON_V4__");
4761 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4762 if(Opts.HexagonQdsp6Compat) {
4763 Builder.defineMacro("__QDSP6_V4__");
4764 Builder.defineMacro("__QDSP6_ARCH__", "4");
4765 }
4766 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004767 else if(CPU == "hexagonv5") {
4768 Builder.defineMacro("__HEXAGON_V5__");
4769 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4770 if(Opts.HexagonQdsp6Compat) {
4771 Builder.defineMacro("__QDSP6_V5__");
4772 Builder.defineMacro("__QDSP6_ARCH__", "5");
4773 }
4774 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004775}
4776
4777const char * const HexagonTargetInfo::GCCRegNames[] = {
4778 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4779 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4780 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4781 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4782 "p0", "p1", "p2", "p3",
4783 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4784};
4785
4786void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4787 unsigned &NumNames) const {
4788 Names = GCCRegNames;
4789 NumNames = llvm::array_lengthof(GCCRegNames);
4790}
4791
4792
4793const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4794 { { "sp" }, "r29" },
4795 { { "fp" }, "r30" },
4796 { { "lr" }, "r31" },
4797 };
4798
4799void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4800 unsigned &NumAliases) const {
4801 Aliases = GCCRegAliases;
4802 NumAliases = llvm::array_lengthof(GCCRegAliases);
4803}
4804
4805
4806const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4807#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4808#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4809 ALL_LANGUAGES },
4810#include "clang/Basic/BuiltinsHexagon.def"
4811};
4812}
4813
4814
Chris Lattner5ba61f02006-10-14 07:39:34 +00004815namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004816// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4817class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004818 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4819 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004820 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004821public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004822 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004823
Craig Topper3164f332014-03-11 03:39:26 +00004824 bool handleTargetFeatures(std::vector<std::string> &Features,
4825 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004826 SoftFloat = false;
4827 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4828 if (Features[i] == "+soft-float")
4829 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004830 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004831 }
Craig Topper3164f332014-03-11 03:39:26 +00004832 void getTargetDefines(const LangOptions &Opts,
4833 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004834 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004835 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004836
4837 if (SoftFloat)
4838 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004839 }
Craig Topper3164f332014-03-11 03:39:26 +00004840
4841 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004842 return llvm::StringSwitch<bool>(Feature)
4843 .Case("softfloat", SoftFloat)
4844 .Case("sparc", true)
4845 .Default(false);
4846 }
Craig Topper3164f332014-03-11 03:39:26 +00004847
4848 void getTargetBuiltins(const Builtin::Info *&Records,
4849 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004850 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004851 }
Craig Topper3164f332014-03-11 03:39:26 +00004852 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004853 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004854 }
Craig Topper3164f332014-03-11 03:39:26 +00004855 void getGCCRegNames(const char * const *&Names,
4856 unsigned &NumNames) const override;
4857 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4858 unsigned &NumAliases) const override;
4859 bool validateAsmConstraint(const char *&Name,
4860 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004861 // FIXME: Implement!
4862 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004863 }
Craig Topper3164f332014-03-11 03:39:26 +00004864 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004865 // FIXME: Implement!
4866 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004867 }
4868};
4869
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004870const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004871 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4872 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4873 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4874 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4875};
4876
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004877void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4878 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004879 Names = GCCRegNames;
4880 NumNames = llvm::array_lengthof(GCCRegNames);
4881}
4882
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004883const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004884 { { "g0" }, "r0" },
4885 { { "g1" }, "r1" },
4886 { { "g2" }, "r2" },
4887 { { "g3" }, "r3" },
4888 { { "g4" }, "r4" },
4889 { { "g5" }, "r5" },
4890 { { "g6" }, "r6" },
4891 { { "g7" }, "r7" },
4892 { { "o0" }, "r8" },
4893 { { "o1" }, "r9" },
4894 { { "o2" }, "r10" },
4895 { { "o3" }, "r11" },
4896 { { "o4" }, "r12" },
4897 { { "o5" }, "r13" },
4898 { { "o6", "sp" }, "r14" },
4899 { { "o7" }, "r15" },
4900 { { "l0" }, "r16" },
4901 { { "l1" }, "r17" },
4902 { { "l2" }, "r18" },
4903 { { "l3" }, "r19" },
4904 { { "l4" }, "r20" },
4905 { { "l5" }, "r21" },
4906 { { "l6" }, "r22" },
4907 { { "l7" }, "r23" },
4908 { { "i0" }, "r24" },
4909 { { "i1" }, "r25" },
4910 { { "i2" }, "r26" },
4911 { { "i3" }, "r27" },
4912 { { "i4" }, "r28" },
4913 { { "i5" }, "r29" },
4914 { { "i6", "fp" }, "r30" },
4915 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004916};
4917
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004918void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4919 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004920 Aliases = GCCRegAliases;
4921 NumAliases = llvm::array_lengthof(GCCRegAliases);
4922}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004923
4924// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4925class SparcV8TargetInfo : public SparcTargetInfo {
4926public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004927 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004928 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004929 }
4930
Craig Topper3164f332014-03-11 03:39:26 +00004931 void getTargetDefines(const LangOptions &Opts,
4932 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004933 SparcTargetInfo::getTargetDefines(Opts, Builder);
4934 Builder.defineMacro("__sparcv8");
4935 }
4936};
4937
4938// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4939class SparcV9TargetInfo : public SparcTargetInfo {
4940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004941 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004942 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004943 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004944 // This is an LP64 platform.
4945 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004946
4947 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00004948 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004949 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00004950 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004951 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004952 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004953
4954 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4955 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4956 LongDoubleWidth = 128;
4957 LongDoubleAlign = 128;
4958 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00004959 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004960 }
4961
Craig Topper3164f332014-03-11 03:39:26 +00004962 void getTargetDefines(const LangOptions &Opts,
4963 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004964 SparcTargetInfo::getTargetDefines(Opts, Builder);
4965 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004966 Builder.defineMacro("__arch64__");
4967 // Solaris and its derivative AuroraUX don't need these variants, but the
4968 // BSDs do.
4969 if (getTriple().getOS() != llvm::Triple::Solaris &&
4970 getTriple().getOS() != llvm::Triple::AuroraUX) {
4971 Builder.defineMacro("__sparc64__");
4972 Builder.defineMacro("__sparc_v9__");
4973 Builder.defineMacro("__sparcv9__");
4974 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004975 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004976
Craig Topper3164f332014-03-11 03:39:26 +00004977 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004978 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4979 .Case("v9", true)
4980 .Case("ultrasparc", true)
4981 .Case("ultrasparc3", true)
4982 .Case("niagara", true)
4983 .Case("niagara2", true)
4984 .Case("niagara3", true)
4985 .Case("niagara4", true)
4986 .Default(false);
4987
4988 // No need to store the CPU yet. There aren't any CPU-specific
4989 // macros to define.
4990 return CPUKnown;
4991 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004992};
4993
Gabor Greif49991682008-02-21 16:29:08 +00004994} // end anonymous namespace.
4995
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004996namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004997class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4998public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004999 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5000 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005001 SizeType = UnsignedInt;
5002 PtrDiffType = SignedInt;
5003 }
5004};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005005class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005006public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005007 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5008 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005009 SizeType = UnsignedInt;
5010 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005011 }
5012};
5013} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005014
Chris Lattnerb781dc792008-05-08 05:58:21 +00005015namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005016class SystemZTargetInfo : public TargetInfo {
5017 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005018
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005019public:
5020 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5021 TLSSupported = true;
5022 IntWidth = IntAlign = 32;
5023 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5024 PointerWidth = PointerAlign = 64;
5025 LongDoubleWidth = 128;
5026 LongDoubleAlign = 64;
5027 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5028 MinGlobalAlign = 16;
5029 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5030 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5031 }
5032 void getTargetDefines(const LangOptions &Opts,
5033 MacroBuilder &Builder) const override {
5034 Builder.defineMacro("__s390__");
5035 Builder.defineMacro("__s390x__");
5036 Builder.defineMacro("__zarch__");
5037 Builder.defineMacro("__LONG_DOUBLE_128__");
5038 }
5039 void getTargetBuiltins(const Builtin::Info *&Records,
5040 unsigned &NumRecords) const override {
5041 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005042 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005043 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005044 }
5045
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005046 void getGCCRegNames(const char *const *&Names,
5047 unsigned &NumNames) const override;
5048 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5049 unsigned &NumAliases) const override {
5050 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005051 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005052 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005053 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005054 bool validateAsmConstraint(const char *&Name,
5055 TargetInfo::ConstraintInfo &info) const override;
5056 const char *getClobbers() const override {
5057 // FIXME: Is this really right?
5058 return "";
5059 }
5060 BuiltinVaListKind getBuiltinVaListKind() const override {
5061 return TargetInfo::SystemZBuiltinVaList;
5062 }
5063 bool setCPU(const std::string &Name) override {
5064 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5065 .Case("z10", true)
5066 .Case("z196", true)
5067 .Case("zEC12", true)
5068 .Default(false);
5069
5070 // No need to store the CPU yet. There aren't any CPU-specific
5071 // macros to define.
5072 return CPUKnown;
5073 }
5074};
5075
5076const char *const SystemZTargetInfo::GCCRegNames[] = {
5077 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5078 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5079 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5080 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5081};
5082
5083void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5084 unsigned &NumNames) const {
5085 Names = GCCRegNames;
5086 NumNames = llvm::array_lengthof(GCCRegNames);
5087}
5088
5089bool SystemZTargetInfo::
5090validateAsmConstraint(const char *&Name,
5091 TargetInfo::ConstraintInfo &Info) const {
5092 switch (*Name) {
5093 default:
5094 return false;
5095
5096 case 'a': // Address register
5097 case 'd': // Data register (equivalent to 'r')
5098 case 'f': // Floating-point register
5099 Info.setAllowsRegister();
5100 return true;
5101
5102 case 'I': // Unsigned 8-bit constant
5103 case 'J': // Unsigned 12-bit constant
5104 case 'K': // Signed 16-bit constant
5105 case 'L': // Signed 20-bit displacement (on all targets we support)
5106 case 'M': // 0x7fffffff
5107 return true;
5108
5109 case 'Q': // Memory with base and unsigned 12-bit displacement
5110 case 'R': // Likewise, plus an index
5111 case 'S': // Memory with base and signed 20-bit displacement
5112 case 'T': // Likewise, plus an index
5113 Info.setAllowsMemory();
5114 return true;
5115 }
5116}
Ulrich Weigand47445072013-05-06 16:26:41 +00005117}
5118
5119namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005120 class MSP430TargetInfo : public TargetInfo {
5121 static const char * const GCCRegNames[];
5122 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005123 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005124 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005125 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005126 IntWidth = 16; IntAlign = 16;
5127 LongWidth = 32; LongLongWidth = 64;
5128 LongAlign = LongLongAlign = 16;
5129 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005130 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005131 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005132 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005133 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005134 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005135 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005136 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005137 }
5138 void getTargetDefines(const LangOptions &Opts,
5139 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005140 Builder.defineMacro("MSP430");
5141 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005142 // FIXME: defines for different 'flavours' of MCU
5143 }
Craig Topper3164f332014-03-11 03:39:26 +00005144 void getTargetBuiltins(const Builtin::Info *&Records,
5145 unsigned &NumRecords) const override {
5146 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005147 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005148 NumRecords = 0;
5149 }
Craig Topper3164f332014-03-11 03:39:26 +00005150 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005151 return Feature == "msp430";
5152 }
Craig Topper3164f332014-03-11 03:39:26 +00005153 void getGCCRegNames(const char * const *&Names,
5154 unsigned &NumNames) const override;
5155 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5156 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005157 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005158 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005159 NumAliases = 0;
5160 }
Craig Topper3164f332014-03-11 03:39:26 +00005161 bool validateAsmConstraint(const char *&Name,
5162 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005163 // No target constraints for now.
5164 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005165 }
Craig Topper3164f332014-03-11 03:39:26 +00005166 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005167 // FIXME: Is this really right?
5168 return "";
5169 }
Craig Topper3164f332014-03-11 03:39:26 +00005170 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005171 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005172 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005173 }
5174 };
5175
5176 const char * const MSP430TargetInfo::GCCRegNames[] = {
5177 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5178 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5179 };
5180
5181 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5182 unsigned &NumNames) const {
5183 Names = GCCRegNames;
5184 NumNames = llvm::array_lengthof(GCCRegNames);
5185 }
5186}
5187
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005188namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005189
Mike Stump11289f42009-09-09 15:08:12 +00005190 // LLVM and Clang cannot be used directly to output native binaries for
5191 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005192 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005193 //
5194 // TCE uses the llvm bitcode as input and uses it for generating customized
5195 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005196 // publicly available in http://tce.cs.tut.fi
5197
Eli Friedman1f191002011-10-07 19:51:42 +00005198 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5199 3, // opencl_global
5200 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005201 5, // opencl_constant
5202 0, // cuda_device
5203 0, // cuda_constant
5204 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005205 };
5206
Eli Friedmana9c3d712009-08-19 20:47:07 +00005207 class TCETargetInfo : public TargetInfo{
5208 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005209 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005210 TLSSupported = false;
5211 IntWidth = 32;
5212 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005213 PointerWidth = 32;
5214 IntAlign = 32;
5215 LongAlign = LongLongAlign = 32;
5216 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005217 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005218 SizeType = UnsignedInt;
5219 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005220 IntPtrType = SignedInt;
5221 PtrDiffType = SignedInt;
5222 FloatWidth = 32;
5223 FloatAlign = 32;
5224 DoubleWidth = 32;
5225 DoubleAlign = 32;
5226 LongDoubleWidth = 32;
5227 LongDoubleAlign = 32;
5228 FloatFormat = &llvm::APFloat::IEEEsingle;
5229 DoubleFormat = &llvm::APFloat::IEEEsingle;
5230 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005231 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5232 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005233 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005234 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005235 }
5236
Craig Topper3164f332014-03-11 03:39:26 +00005237 void getTargetDefines(const LangOptions &Opts,
5238 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005239 DefineStd(Builder, "tce", Opts);
5240 Builder.defineMacro("__TCE__");
5241 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005244 return Feature == "tce";
5245 }
Craig Topper3164f332014-03-11 03:39:26 +00005246
5247 void getTargetBuiltins(const Builtin::Info *&Records,
5248 unsigned &NumRecords) const override {}
5249 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005250 return "";
5251 }
Craig Topper3164f332014-03-11 03:39:26 +00005252 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005253 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005254 }
Craig Topper3164f332014-03-11 03:39:26 +00005255 void getGCCRegNames(const char * const *&Names,
5256 unsigned &NumNames) const override {}
5257 bool validateAsmConstraint(const char *&Name,
5258 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005259 return true;
5260 }
Craig Topper3164f332014-03-11 03:39:26 +00005261 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5262 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005263 };
5264}
5265
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005266namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005267class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005268 virtual void setDescriptionString() = 0;
5269
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005270 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005271 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005272 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005273 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005274 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005275 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005276 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005277 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005278 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005279 enum DspRevEnum {
5280 NoDSP, DSP1, DSP2
5281 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005282 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005283
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005284protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005285 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005286 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005287
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005288public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005289 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5290 const std::string &CPUStr)
5291 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005292 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005293 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005294
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005295 bool isNaN2008Default() const {
5296 return CPU == "mips32r6" || CPU == "mips64r6";
5297 }
5298
5299 bool isFP64Default() const {
5300 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5301 }
5302
Alp Toker4925ba72014-06-07 23:30:42 +00005303 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005304 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005305 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5306 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005307 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005308 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005309 .Case("mips1", IsMips32)
5310 .Case("mips2", IsMips32)
5311 .Case("mips3", true)
5312 .Case("mips4", true)
5313 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005314 .Case("mips32", IsMips32)
5315 .Case("mips32r2", IsMips32)
5316 .Case("mips32r6", IsMips32)
5317 .Case("mips64", true)
5318 .Case("mips64r2", true)
5319 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005320 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005321 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005322 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005323 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005324 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005325 // The backend enables certain ABI's by default according to the
5326 // architecture.
5327 // Disable both possible defaults so that we don't end up with multiple
5328 // ABI's selected and trigger an assertion.
5329 Features["o32"] = false;
5330 Features["n64"] = false;
5331
Eric Christopher0b26a612010-03-02 02:41:08 +00005332 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005333 if (CPU == "octeon")
5334 Features["mips64r2"] = Features["cnmips"] = true;
5335 else
5336 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005337 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005338
Craig Topper3164f332014-03-11 03:39:26 +00005339 void getTargetDefines(const LangOptions &Opts,
5340 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005341 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005342 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005343 if (Opts.GNUMode)
5344 Builder.defineMacro("mips");
5345
Simon Atanasyan683535b2012-08-29 19:14:58 +00005346 Builder.defineMacro("__REGISTER_PREFIX__", "");
5347
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005348 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005349 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005350 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005351 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005352 case SoftFloat:
5353 Builder.defineMacro("__mips_soft_float", Twine(1));
5354 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005355 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005356
Simon Atanasyan16071912013-04-14 14:07:30 +00005357 if (IsSingleFloat)
5358 Builder.defineMacro("__mips_single_float", Twine(1));
5359
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005360 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5361 Builder.defineMacro("_MIPS_FPSET",
5362 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5363
Simon Atanasyan72244b62012-07-05 16:06:06 +00005364 if (IsMips16)
5365 Builder.defineMacro("__mips16", Twine(1));
5366
Simon Atanasyan60777612013-04-14 14:07:51 +00005367 if (IsMicromips)
5368 Builder.defineMacro("__mips_micromips", Twine(1));
5369
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005370 if (IsNan2008)
5371 Builder.defineMacro("__mips_nan2008", Twine(1));
5372
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005373 switch (DspRev) {
5374 default:
5375 break;
5376 case DSP1:
5377 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5378 Builder.defineMacro("__mips_dsp", Twine(1));
5379 break;
5380 case DSP2:
5381 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5382 Builder.defineMacro("__mips_dspr2", Twine(1));
5383 Builder.defineMacro("__mips_dsp", Twine(1));
5384 break;
5385 }
5386
Jack Carter44ff1e52013-08-12 17:20:29 +00005387 if (HasMSA)
5388 Builder.defineMacro("__mips_msa", Twine(1));
5389
Simon Atanasyan26f19672012-04-05 19:28:31 +00005390 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5391 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5392 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005393
5394 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5395 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005396 }
5397
Craig Topper3164f332014-03-11 03:39:26 +00005398 void getTargetBuiltins(const Builtin::Info *&Records,
5399 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005400 Records = BuiltinInfo;
5401 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005402 }
Craig Topper3164f332014-03-11 03:39:26 +00005403 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005404 return llvm::StringSwitch<bool>(Feature)
5405 .Case("mips", true)
5406 .Case("fp64", HasFP64)
5407 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005408 }
Craig Topper3164f332014-03-11 03:39:26 +00005409 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005410 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005411 }
Craig Topper3164f332014-03-11 03:39:26 +00005412 void getGCCRegNames(const char * const *&Names,
5413 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005414 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005415 // CPU register names
5416 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005417 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5418 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5419 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005420 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5421 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005422 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5423 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5424 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5425 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005426 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005427 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005428 "$fcc5","$fcc6","$fcc7",
5429 // MSA register names
5430 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5431 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5432 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5433 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5434 // MSA control register names
5435 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5436 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005437 };
5438 Names = GCCRegNames;
5439 NumNames = llvm::array_lengthof(GCCRegNames);
5440 }
Craig Topper3164f332014-03-11 03:39:26 +00005441 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5442 unsigned &NumAliases) const override = 0;
5443 bool validateAsmConstraint(const char *&Name,
5444 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005445 switch (*Name) {
5446 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005447 return false;
5448
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005449 case 'r': // CPU registers.
5450 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005451 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005452 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005453 case 'c': // $25 for indirect jumps
5454 case 'l': // lo register
5455 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005456 Info.setAllowsRegister();
5457 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005458 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005459 Info.setAllowsMemory();
5460 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005461 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005462 }
5463
Craig Topper3164f332014-03-11 03:39:26 +00005464 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005465 // FIXME: Implement!
5466 return "";
5467 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005468
Craig Topper3164f332014-03-11 03:39:26 +00005469 bool handleTargetFeatures(std::vector<std::string> &Features,
5470 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005471 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005472 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005473 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005474 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005475 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005476 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005477 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005478
5479 for (std::vector<std::string>::iterator it = Features.begin(),
5480 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005481 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005482 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005483 else if (*it == "+soft-float")
5484 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005485 else if (*it == "+mips16")
5486 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005487 else if (*it == "+micromips")
5488 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005489 else if (*it == "+dsp")
5490 DspRev = std::max(DspRev, DSP1);
5491 else if (*it == "+dspr2")
5492 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005493 else if (*it == "+msa")
5494 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005495 else if (*it == "+fp64")
5496 HasFP64 = true;
5497 else if (*it == "-fp64")
5498 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005499 else if (*it == "+nan2008")
5500 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005501 else if (*it == "-nan2008")
5502 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005503 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005504
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005505 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005506 std::vector<std::string>::iterator it =
5507 std::find(Features.begin(), Features.end(), "+soft-float");
5508 if (it != Features.end())
5509 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005510
Akira Hatanaka9064e362013-10-29 18:30:33 +00005511 setDescriptionString();
5512
Rafael Espindolaeb265472013-08-21 21:59:03 +00005513 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005514 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005515
Craig Topper3164f332014-03-11 03:39:26 +00005516 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005517 if (RegNo == 0) return 4;
5518 if (RegNo == 1) return 5;
5519 return -1;
5520 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005521
5522 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005523};
5524
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005525const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5526#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5527#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5528 ALL_LANGUAGES },
5529#include "clang/Basic/BuiltinsMips.def"
5530};
5531
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005532class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005534 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005535 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005536 SizeType = UnsignedInt;
5537 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005538 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005539 }
Craig Topper3164f332014-03-11 03:39:26 +00005540 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005541 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005542 ABI = Name;
5543 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005544 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005545 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005546 }
Craig Topper3164f332014-03-11 03:39:26 +00005547 void getTargetDefines(const LangOptions &Opts,
5548 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005549 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005550
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005551 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005552 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5553
5554 const std::string& CPUStr = getCPU();
5555 if (CPUStr == "mips32")
5556 Builder.defineMacro("__mips_isa_rev", "1");
5557 else if (CPUStr == "mips32r2")
5558 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005559
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005560 if (ABI == "o32") {
5561 Builder.defineMacro("__mips_o32");
5562 Builder.defineMacro("_ABIO32", "1");
5563 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5564 }
5565 else if (ABI == "eabi")
5566 Builder.defineMacro("__mips_eabi");
5567 else
David Blaikie83d382b2011-09-23 05:06:16 +00005568 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005569 }
Craig Topper3164f332014-03-11 03:39:26 +00005570 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5571 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005572 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5573 { { "at" }, "$1" },
5574 { { "v0" }, "$2" },
5575 { { "v1" }, "$3" },
5576 { { "a0" }, "$4" },
5577 { { "a1" }, "$5" },
5578 { { "a2" }, "$6" },
5579 { { "a3" }, "$7" },
5580 { { "t0" }, "$8" },
5581 { { "t1" }, "$9" },
5582 { { "t2" }, "$10" },
5583 { { "t3" }, "$11" },
5584 { { "t4" }, "$12" },
5585 { { "t5" }, "$13" },
5586 { { "t6" }, "$14" },
5587 { { "t7" }, "$15" },
5588 { { "s0" }, "$16" },
5589 { { "s1" }, "$17" },
5590 { { "s2" }, "$18" },
5591 { { "s3" }, "$19" },
5592 { { "s4" }, "$20" },
5593 { { "s5" }, "$21" },
5594 { { "s6" }, "$22" },
5595 { { "s7" }, "$23" },
5596 { { "t8" }, "$24" },
5597 { { "t9" }, "$25" },
5598 { { "k0" }, "$26" },
5599 { { "k1" }, "$27" },
5600 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005601 { { "sp","$sp" }, "$29" },
5602 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005603 { { "ra" }, "$31" }
5604 };
5605 Aliases = GCCRegAliases;
5606 NumAliases = llvm::array_lengthof(GCCRegAliases);
5607 }
5608};
5609
5610class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005611 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005612 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005613 }
5614
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005615public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005616 Mips32EBTargetInfo(const llvm::Triple &Triple)
5617 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005618 }
Craig Topper3164f332014-03-11 03:39:26 +00005619 void getTargetDefines(const LangOptions &Opts,
5620 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005621 DefineStd(Builder, "MIPSEB", Opts);
5622 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005623 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005624 }
5625};
5626
5627class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005628 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005629 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005630 }
5631
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005632public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005633 Mips32ELTargetInfo(const llvm::Triple &Triple)
5634 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005635 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005636 }
Craig Topper3164f332014-03-11 03:39:26 +00005637 void getTargetDefines(const LangOptions &Opts,
5638 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005639 DefineStd(Builder, "MIPSEL", Opts);
5640 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005641 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005642 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005643};
Akira Hatanakabef17452011-09-20 19:21:49 +00005644
5645class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005646public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005647 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005648 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005649 LongDoubleWidth = LongDoubleAlign = 128;
5650 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005651 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5652 LongDoubleWidth = LongDoubleAlign = 64;
5653 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5654 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005655 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005656 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005657 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005658 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005659
5660 void setN64ABITypes() {
5661 LongWidth = LongAlign = 64;
5662 PointerWidth = PointerAlign = 64;
5663 SizeType = UnsignedLong;
5664 PtrDiffType = SignedLong;
5665 }
5666
5667 void setN32ABITypes() {
5668 LongWidth = LongAlign = 32;
5669 PointerWidth = PointerAlign = 32;
5670 SizeType = UnsignedInt;
5671 PtrDiffType = SignedInt;
5672 }
5673
Craig Topper3164f332014-03-11 03:39:26 +00005674 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005675 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005676 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005677 ABI = Name;
5678 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005679 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005680 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005681 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005682 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005683 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005684 }
5685 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005686 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005687
Craig Topper3164f332014-03-11 03:39:26 +00005688 void getTargetDefines(const LangOptions &Opts,
5689 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005690 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005691
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005692 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005693 Builder.defineMacro("__mips64");
5694 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005695 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5696
5697 const std::string& CPUStr = getCPU();
5698 if (CPUStr == "mips64")
5699 Builder.defineMacro("__mips_isa_rev", "1");
5700 else if (CPUStr == "mips64r2")
5701 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005702
Akira Hatanakabef17452011-09-20 19:21:49 +00005703 if (ABI == "n32") {
5704 Builder.defineMacro("__mips_n32");
5705 Builder.defineMacro("_ABIN32", "2");
5706 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5707 }
5708 else if (ABI == "n64") {
5709 Builder.defineMacro("__mips_n64");
5710 Builder.defineMacro("_ABI64", "3");
5711 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5712 }
5713 else
David Blaikie83d382b2011-09-23 05:06:16 +00005714 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005715 }
Craig Topper3164f332014-03-11 03:39:26 +00005716 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5717 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005718 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5719 { { "at" }, "$1" },
5720 { { "v0" }, "$2" },
5721 { { "v1" }, "$3" },
5722 { { "a0" }, "$4" },
5723 { { "a1" }, "$5" },
5724 { { "a2" }, "$6" },
5725 { { "a3" }, "$7" },
5726 { { "a4" }, "$8" },
5727 { { "a5" }, "$9" },
5728 { { "a6" }, "$10" },
5729 { { "a7" }, "$11" },
5730 { { "t0" }, "$12" },
5731 { { "t1" }, "$13" },
5732 { { "t2" }, "$14" },
5733 { { "t3" }, "$15" },
5734 { { "s0" }, "$16" },
5735 { { "s1" }, "$17" },
5736 { { "s2" }, "$18" },
5737 { { "s3" }, "$19" },
5738 { { "s4" }, "$20" },
5739 { { "s5" }, "$21" },
5740 { { "s6" }, "$22" },
5741 { { "s7" }, "$23" },
5742 { { "t8" }, "$24" },
5743 { { "t9" }, "$25" },
5744 { { "k0" }, "$26" },
5745 { { "k1" }, "$27" },
5746 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005747 { { "sp","$sp" }, "$29" },
5748 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005749 { { "ra" }, "$31" }
5750 };
5751 Aliases = GCCRegAliases;
5752 NumAliases = llvm::array_lengthof(GCCRegAliases);
5753 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005754
5755 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005756};
5757
5758class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005759 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005760 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005761 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 +00005762 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005763 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005764
Akira Hatanakabef17452011-09-20 19:21:49 +00005765 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005766
Akira Hatanakabef17452011-09-20 19:21:49 +00005767public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005768 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005769 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005770 void getTargetDefines(const LangOptions &Opts,
5771 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005772 DefineStd(Builder, "MIPSEB", Opts);
5773 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005774 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005775 }
5776};
5777
5778class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005779 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005780 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005781 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 +00005782 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005783 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005784 }
5785public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 Mips64ELTargetInfo(const llvm::Triple &Triple)
5787 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005788 // Default ABI is n64.
5789 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005790 }
Craig Topper3164f332014-03-11 03:39:26 +00005791 void getTargetDefines(const LangOptions &Opts,
5792 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005793 DefineStd(Builder, "MIPSEL", Opts);
5794 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005795 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005796 }
5797};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005798} // end anonymous namespace.
5799
Ivan Krasindd7403e2011-08-24 20:22:22 +00005800namespace {
5801class PNaClTargetInfo : public TargetInfo {
5802public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005804 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005805 this->UserLabelPrefix = "";
5806 this->LongAlign = 32;
5807 this->LongWidth = 32;
5808 this->PointerAlign = 32;
5809 this->PointerWidth = 32;
5810 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005811 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005812 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005813 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005814 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005815 this->SizeType = TargetInfo::UnsignedInt;
5816 this->PtrDiffType = TargetInfo::SignedInt;
5817 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005818 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005819 }
5820
Craig Topper3164f332014-03-11 03:39:26 +00005821 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005822 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005823 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005824 Builder.defineMacro("__le32__");
5825 Builder.defineMacro("__pnacl__");
5826 }
Craig Topper3164f332014-03-11 03:39:26 +00005827 void getTargetDefines(const LangOptions &Opts,
5828 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005829 getArchDefines(Opts, Builder);
5830 }
Craig Topper3164f332014-03-11 03:39:26 +00005831 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005832 return Feature == "pnacl";
5833 }
Craig Topper3164f332014-03-11 03:39:26 +00005834 void getTargetBuiltins(const Builtin::Info *&Records,
5835 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005836 }
Craig Topper3164f332014-03-11 03:39:26 +00005837 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005838 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005839 }
Craig Topper3164f332014-03-11 03:39:26 +00005840 void getGCCRegNames(const char * const *&Names,
5841 unsigned &NumNames) const override;
5842 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5843 unsigned &NumAliases) const override;
5844 bool validateAsmConstraint(const char *&Name,
5845 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005846 return false;
5847 }
5848
Craig Topper3164f332014-03-11 03:39:26 +00005849 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005850 return "";
5851 }
5852};
5853
5854void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5855 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005856 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005857 NumNames = 0;
5858}
5859
5860void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5861 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005862 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005863 NumAliases = 0;
5864}
5865} // end anonymous namespace.
5866
Guy Benyeib798fc92012-12-11 21:38:14 +00005867namespace {
5868 static const unsigned SPIRAddrSpaceMap[] = {
5869 1, // opencl_global
5870 3, // opencl_local
5871 2, // opencl_constant
5872 0, // cuda_device
5873 0, // cuda_constant
5874 0 // cuda_shared
5875 };
5876 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005877 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005878 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005879 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5880 "SPIR target must use unknown OS");
5881 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5882 "SPIR target must use unknown environment type");
5883 BigEndian = false;
5884 TLSSupported = false;
5885 LongWidth = LongAlign = 64;
5886 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005887 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005888 // Define available target features
5889 // These must be defined in sorted order!
5890 NoAsmVariants = true;
5891 }
Craig Topper3164f332014-03-11 03:39:26 +00005892 void getTargetDefines(const LangOptions &Opts,
5893 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005894 DefineStd(Builder, "SPIR", Opts);
5895 }
Craig Topper3164f332014-03-11 03:39:26 +00005896 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005897 return Feature == "spir";
5898 }
Craig Topper3164f332014-03-11 03:39:26 +00005899
5900 void getTargetBuiltins(const Builtin::Info *&Records,
5901 unsigned &NumRecords) const override {}
5902 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005903 return "";
5904 }
Craig Topper3164f332014-03-11 03:39:26 +00005905 void getGCCRegNames(const char * const *&Names,
5906 unsigned &NumNames) const override {}
5907 bool validateAsmConstraint(const char *&Name,
5908 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005909 return true;
5910 }
Craig Topper3164f332014-03-11 03:39:26 +00005911 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5912 unsigned &NumAliases) const override {}
5913 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005914 return TargetInfo::VoidPtrBuiltinVaList;
5915 }
5916 };
5917
5918
5919 class SPIR32TargetInfo : public SPIRTargetInfo {
5920 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005921 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005922 PointerWidth = PointerAlign = 32;
5923 SizeType = TargetInfo::UnsignedInt;
5924 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5925 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005926 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5927 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005928 }
Craig Topper3164f332014-03-11 03:39:26 +00005929 void getTargetDefines(const LangOptions &Opts,
5930 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005931 DefineStd(Builder, "SPIR32", Opts);
5932 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005933 };
5934
5935 class SPIR64TargetInfo : public SPIRTargetInfo {
5936 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005937 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005938 PointerWidth = PointerAlign = 64;
5939 SizeType = TargetInfo::UnsignedLong;
5940 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005941 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5942 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005943 }
Craig Topper3164f332014-03-11 03:39:26 +00005944 void getTargetDefines(const LangOptions &Opts,
5945 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005946 DefineStd(Builder, "SPIR64", Opts);
5947 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005948 };
5949}
5950
Robert Lytton0e076492013-08-13 09:43:10 +00005951namespace {
5952class XCoreTargetInfo : public TargetInfo {
5953 static const Builtin::Info BuiltinInfo[];
5954public:
5955 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5956 BigEndian = false;
5957 NoAsmVariants = true;
5958 LongLongAlign = 32;
5959 SuitableAlign = 32;
5960 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005961 SizeType = UnsignedInt;
5962 PtrDiffType = SignedInt;
5963 IntPtrType = SignedInt;
5964 WCharType = UnsignedChar;
5965 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005966 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005967 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 +00005968 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005969 }
Craig Topper3164f332014-03-11 03:39:26 +00005970 void getTargetDefines(const LangOptions &Opts,
5971 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005972 Builder.defineMacro("__XS1B__");
5973 }
Craig Topper3164f332014-03-11 03:39:26 +00005974 void getTargetBuiltins(const Builtin::Info *&Records,
5975 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005976 Records = BuiltinInfo;
5977 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5978 }
Craig Topper3164f332014-03-11 03:39:26 +00005979 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005980 return TargetInfo::VoidPtrBuiltinVaList;
5981 }
Craig Topper3164f332014-03-11 03:39:26 +00005982 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005983 return "";
5984 }
Craig Topper3164f332014-03-11 03:39:26 +00005985 void getGCCRegNames(const char * const *&Names,
5986 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005987 static const char * const GCCRegNames[] = {
5988 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5989 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5990 };
5991 Names = GCCRegNames;
5992 NumNames = llvm::array_lengthof(GCCRegNames);
5993 }
Craig Topper3164f332014-03-11 03:39:26 +00005994 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5995 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00005996 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00005997 NumAliases = 0;
5998 }
Craig Topper3164f332014-03-11 03:39:26 +00005999 bool validateAsmConstraint(const char *&Name,
6000 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006001 return false;
6002 }
Craig Topper3164f332014-03-11 03:39:26 +00006003 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006004 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6005 return (RegNo < 2)? RegNo : -1;
6006 }
Robert Lytton0e076492013-08-13 09:43:10 +00006007};
6008
6009const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6010#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6011#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6012 ALL_LANGUAGES },
6013#include "clang/Basic/BuiltinsXCore.def"
6014};
6015} // end anonymous namespace.
6016
Ivan Krasindd7403e2011-08-24 20:22:22 +00006017
Chris Lattner5ba61f02006-10-14 07:39:34 +00006018//===----------------------------------------------------------------------===//
6019// Driver code
6020//===----------------------------------------------------------------------===//
6021
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006022static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006023 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006024
Daniel Dunbar52322032009-08-18 05:47:58 +00006025 switch (Triple.getArch()) {
6026 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006027 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006028
Tim Northover2a0783d2014-05-30 14:14:07 +00006029 case llvm::Triple::xcore:
6030 return new XCoreTargetInfo(Triple);
6031
6032 case llvm::Triple::hexagon:
6033 return new HexagonTargetInfo(Triple);
6034
6035 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006036 case llvm::Triple::arm64:
6037 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006038 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006039
6040 switch (os) {
6041 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006042 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006043 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006044 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006045 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006046 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006047 }
6048
Christian Pirker9b019ae2014-02-25 13:51:00 +00006049 case llvm::Triple::aarch64_be:
Tim Northover2a0783d2014-05-30 14:14:07 +00006050 case llvm::Triple::arm64_be:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006051 switch (os) {
6052 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006053 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006054 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006055 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006056 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006057 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006058 }
6059
Daniel Dunbar52322032009-08-18 05:47:58 +00006060 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006061 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006062 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006063 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006064
Daniel Dunbar52322032009-08-18 05:47:58 +00006065 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006066 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006067 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006068 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006069 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006070 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006071 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006072 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006073 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006074 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006075 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006076 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006077 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006078 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006079 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006080 case llvm::Triple::Win32:
6081 switch (Triple.getEnvironment()) {
6082 default:
6083 return new ARMleTargetInfo(Triple);
6084 case llvm::Triple::Itanium:
6085 return new ItaniumWindowsARMleTargetInfo(Triple);
6086 case llvm::Triple::MSVC:
6087 return new MicrosoftARMleTargetInfo(Triple);
6088 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006089 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006090 return new ARMleTargetInfo(Triple);
6091 }
6092
6093 case llvm::Triple::armeb:
6094 case llvm::Triple::thumbeb:
6095 if (Triple.isOSDarwin())
6096 return new DarwinARMTargetInfo(Triple);
6097
6098 switch (os) {
6099 case llvm::Triple::Linux:
6100 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6101 case llvm::Triple::FreeBSD:
6102 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6103 case llvm::Triple::NetBSD:
6104 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6105 case llvm::Triple::OpenBSD:
6106 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6107 case llvm::Triple::Bitrig:
6108 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6109 case llvm::Triple::RTEMS:
6110 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6111 case llvm::Triple::NaCl:
6112 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6113 default:
6114 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006115 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006116
Daniel Dunbar52322032009-08-18 05:47:58 +00006117 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006118 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006119
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006120 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006121 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006122 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006123 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006124 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006125 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006126 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006127 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006128 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006129 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006130 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006131 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006132 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006133
6134 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006135 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006136 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006137 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006138 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006139 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006140 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006141 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006142 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006143 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006144 case llvm::Triple::NaCl:
6145 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006146 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006147 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006148 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006149
Akira Hatanakabef17452011-09-20 19:21:49 +00006150 case llvm::Triple::mips64:
6151 switch (os) {
6152 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006153 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006154 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006155 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006156 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006157 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006158 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006159 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006160 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006161 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006162 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006163 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006164 }
6165
6166 case llvm::Triple::mips64el:
6167 switch (os) {
6168 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006169 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006170 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006171 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006172 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006174 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006175 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006176 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006177 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006178 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006179 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006180 }
6181
Ivan Krasindd7403e2011-08-24 20:22:22 +00006182 case llvm::Triple::le32:
6183 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006184 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006185 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006186 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006187 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006188 }
6189
Daniel Dunbar52322032009-08-18 05:47:58 +00006190 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006191 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006192 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006193 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006194 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006195 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006196 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006197 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006198 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006199 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006200 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006201 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006202 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006203 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006204 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006205 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006206 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006207
6208 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006209 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006210 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006211 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006212 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006213 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006214 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006215 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006216 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006217 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006218 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006219 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006220 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006221 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006222 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006223
Bill Schmidt778d3872013-07-26 01:36:11 +00006224 case llvm::Triple::ppc64le:
6225 switch (os) {
6226 case llvm::Triple::Linux:
6227 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6228 default:
6229 return new PPC64TargetInfo(Triple);
6230 }
6231
Peter Collingbournec947aae2012-05-20 23:28:41 +00006232 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006233 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006234 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006235 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006236
Eli Friedmand13b41e2012-10-12 23:32:00 +00006237 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006238 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006239
Daniel Dunbar52322032009-08-18 05:47:58 +00006240 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006241 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006242 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006243 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006244 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006245 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006246 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006247 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006248 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006249 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006250 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006251 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006252 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006253 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006254 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006255 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006256 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006257
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006258 case llvm::Triple::sparcv9:
6259 switch (os) {
6260 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006261 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006262 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006263 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006264 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006265 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006266 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006267 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006268 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006269 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006270 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006271 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006272 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006273 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006274 }
6275
Ulrich Weigand47445072013-05-06 16:26:41 +00006276 case llvm::Triple::systemz:
6277 switch (os) {
6278 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006279 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006280 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006281 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006282 }
6283
Eli Friedmana9c3d712009-08-19 20:47:07 +00006284 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006285 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006286
Daniel Dunbar52322032009-08-18 05:47:58 +00006287 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006288 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006289 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006290
Daniel Dunbar52322032009-08-18 05:47:58 +00006291 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006292 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006293 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006294 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006295 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006296 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006297 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006298 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006299 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006300 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006301 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006302 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006303 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006304 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006305 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006306 case llvm::Triple::KFreeBSD:
6307 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006308 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006309 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006310 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006311 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006312 case llvm::Triple::Win32: {
6313 switch (Triple.getEnvironment()) {
6314 default:
6315 return new X86_32TargetInfo(Triple);
6316 case llvm::Triple::Cygnus:
6317 return new CygwinX86_32TargetInfo(Triple);
6318 case llvm::Triple::GNU:
6319 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006320 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006321 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006322 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006323 }
6324 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006325 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006327 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006328 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006329 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006331 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006333 }
6334
6335 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006336 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006337 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006338
Daniel Dunbar52322032009-08-18 05:47:58 +00006339 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006340 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006341 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006342 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006343 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006344 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006345 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006346 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006347 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006348 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006349 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006350 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006351 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006352 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006353 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006354 case llvm::Triple::KFreeBSD:
6355 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006356 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006357 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006358 case llvm::Triple::Win32: {
6359 switch (Triple.getEnvironment()) {
6360 default:
6361 return new X86_64TargetInfo(Triple);
6362 case llvm::Triple::GNU:
6363 return new MinGWX86_64TargetInfo(Triple);
6364 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006365 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006366 }
6367 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006368 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006369 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006370 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006371 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006372 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006373
6374 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006375 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006377 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006378 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006379 }
6380 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006381 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006383 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006385 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006386 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006387}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006388
6389/// CreateTargetInfo - Return the target info object for the specified target
6390/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006391TargetInfo *
6392TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6393 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006394 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006395
6396 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006397 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006398 if (!Target) {
6399 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006400 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006401 }
Alp Toker80758082014-07-06 05:26:44 +00006402 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006403
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006404 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006405 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6406 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006407 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006408 }
6409
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006410 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006411 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6412 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006413 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006414 }
6415
Rafael Espindolaeb265472013-08-21 21:59:03 +00006416 // Set the fp math unit.
6417 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6418 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006419 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006420 }
6421
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006422 // Compute the default target features, we need the target to handle this
6423 // because features may have dependencies on one another.
6424 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006425 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006426
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006427 // Apply the user specified deltas.
6428 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6429 I < N; ++I) {
6430 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006431 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006432 bool Enabled = Name[0] == '+';
6433 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006434 }
6435
6436 // Add the features to the compile options.
6437 //
6438 // FIXME: If we are completely confident that we have the right set, we only
6439 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006440 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006441 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6442 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006443 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006444 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006445 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006446
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006447 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006448}