blob: aa70bad992b12775f5ab370404eed1870c22ab7a [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
Ulrich Weigand8afad612014-07-28 13:17:52 +0000685protected:
686 std::string ABI;
687
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000688public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000689 PPCTargetInfo(const llvm::Triple &Triple)
690 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000691 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000692 LongDoubleWidth = LongDoubleAlign = 128;
693 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
694 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000695
Hal Finkel6b984f02012-07-03 16:51:04 +0000696 /// \brief Flags for architecture specific defines.
697 typedef enum {
698 ArchDefineNone = 0,
699 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
700 ArchDefinePpcgr = 1 << 1,
701 ArchDefinePpcsq = 1 << 2,
702 ArchDefine440 = 1 << 3,
703 ArchDefine603 = 1 << 4,
704 ArchDefine604 = 1 << 5,
705 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000706 ArchDefinePwr5 = 1 << 7,
707 ArchDefinePwr5x = 1 << 8,
708 ArchDefinePwr6 = 1 << 9,
709 ArchDefinePwr6x = 1 << 10,
710 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000711 ArchDefinePwr8 = 1 << 12,
712 ArchDefineA2 = 1 << 13,
713 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000714 } ArchDefineTypes;
715
Bill Schmidt38378a02013-02-01 20:23:10 +0000716 // Note: GCC recognizes the following additional cpus:
717 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
718 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
719 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000720 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000721 bool CPUKnown = llvm::StringSwitch<bool>(Name)
722 .Case("generic", true)
723 .Case("440", true)
724 .Case("450", true)
725 .Case("601", true)
726 .Case("602", true)
727 .Case("603", true)
728 .Case("603e", true)
729 .Case("603ev", true)
730 .Case("604", true)
731 .Case("604e", true)
732 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000733 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000734 .Case("g3", true)
735 .Case("7400", true)
736 .Case("g4", true)
737 .Case("7450", true)
738 .Case("g4+", true)
739 .Case("750", true)
740 .Case("970", true)
741 .Case("g5", true)
742 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000743 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000744 .Case("e500mc", true)
745 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000746 .Case("power3", true)
747 .Case("pwr3", true)
748 .Case("power4", true)
749 .Case("pwr4", true)
750 .Case("power5", true)
751 .Case("pwr5", true)
752 .Case("power5x", true)
753 .Case("pwr5x", true)
754 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000755 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 .Case("power6x", true)
757 .Case("pwr6x", true)
758 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000759 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000760 .Case("power8", true)
761 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000762 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000763 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000764 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000765 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000766 .Case("powerpc64le", true)
767 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000768 .Default(false);
769
770 if (CPUKnown)
771 CPU = Name;
772
773 return CPUKnown;
774 }
775
Ulrich Weigand8afad612014-07-28 13:17:52 +0000776
777 StringRef getABI() const override { return ABI; }
778
Craig Topper3164f332014-03-11 03:39:26 +0000779 void getTargetBuiltins(const Builtin::Info *&Records,
780 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000781 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000782 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000783 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000784
Craig Topper3164f332014-03-11 03:39:26 +0000785 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000786
Craig Topper3164f332014-03-11 03:39:26 +0000787 void getTargetDefines(const LangOptions &Opts,
788 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000789
Craig Topper3164f332014-03-11 03:39:26 +0000790 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000791
Craig Topper3164f332014-03-11 03:39:26 +0000792 bool handleTargetFeatures(std::vector<std::string> &Features,
793 DiagnosticsEngine &Diags) override;
794 bool hasFeature(StringRef Feature) const override;
795
796 void getGCCRegNames(const char * const *&Names,
797 unsigned &NumNames) const override;
798 void getGCCRegAliases(const GCCRegAlias *&Aliases,
799 unsigned &NumAliases) const override;
800 bool validateAsmConstraint(const char *&Name,
801 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000802 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000803 default: return false;
804 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000805 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000806 case 'b': // Base register
807 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000808 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000809 break;
810 // FIXME: The following are added to allow parsing.
811 // I just took a guess at what the actions should be.
812 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000813 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000814 case 'v': // Altivec vector register
815 Info.setAllowsRegister();
816 break;
817 case 'w':
818 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 case 'd':// VSX vector register to hold vector double data
820 case 'f':// VSX vector register to hold vector float data
821 case 's':// VSX vector register to hold scalar float data
822 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000823 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000824 break;
825 default:
826 return false;
827 }
828 Info.setAllowsRegister();
829 Name++; // Skip over 'w'.
830 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000831 case 'h': // `MQ', `CTR', or `LINK' register
832 case 'q': // `MQ' register
833 case 'c': // `CTR' register
834 case 'l': // `LINK' register
835 case 'x': // `CR' register (condition register) number 0
836 case 'y': // `CR' register (condition register)
837 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000838 Info.setAllowsRegister();
839 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000840 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000841 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 // (use `L' instead for SImode constants)
843 case 'K': // Unsigned 16-bit constant
844 case 'L': // Signed 16-bit constant shifted left 16 bits
845 case 'M': // Constant larger than 31
846 case 'N': // Exact power of 2
847 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000848 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000849 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000850 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000851 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 case 'm': // Memory operand. Note that on PowerPC targets, m can
854 // include addresses that update the base register. It
855 // is therefore only safe to use `m' in an asm statement
856 // if that asm statement accesses the operand exactly once.
857 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000858 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000860 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000861 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000862 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
863 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000864 // register to be updated.
865 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000866 if (Name[1] != 's')
867 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000868 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000869 // include any automodification of the base register. Unlike
870 // `m', this constraint can be used in asm statements that
871 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000872 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000873 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000874 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
876 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'Z': // Memory operand that is an indexed or indirect from a
879 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000880 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000881 Info.setAllowsMemory();
882 Info.setAllowsRegister();
883 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000885 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000886 // register (`p' is preferable for asm statements)
887 case 'S': // Constant suitable as a 64-bit mask operand
888 case 'T': // Constant suitable as a 32-bit mask operand
889 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000890 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000891 // instructions
892 case 'W': // Vector constant that does not require memory
893 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000894 break;
895 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000896 }
John Thompson07a61a42010-06-24 22:44:13 +0000897 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000898 }
Craig Topper3164f332014-03-11 03:39:26 +0000899 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000900 std::string R;
901 switch (*Constraint) {
902 case 'e':
903 case 'w':
904 // Two-character constraint; add "^" hint for later parsing.
905 R = std::string("^") + std::string(Constraint, 2);
906 Constraint++;
907 break;
908 default:
909 return TargetInfo::convertConstraint(Constraint);
910 }
911 return R;
912 }
Craig Topper3164f332014-03-11 03:39:26 +0000913 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000914 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000915 }
Craig Topper3164f332014-03-11 03:39:26 +0000916 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000917 if (RegNo == 0) return 3;
918 if (RegNo == 1) return 4;
919 return -1;
920 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000921};
Anders Carlssonf511f642007-11-27 04:11:28 +0000922
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000923const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000924#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000925#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000926 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000927#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000928};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000929
Eric Christopher3ff21b32013-10-16 21:26:26 +0000930 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000931/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000932bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000933 DiagnosticsEngine &Diags) {
934 // Remember the maximum enabled sselevel.
935 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
936 // Ignore disabled features.
937 if (Features[i][0] == '-')
938 continue;
939
940 StringRef Feature = StringRef(Features[i]).substr(1);
941
942 if (Feature == "vsx") {
943 HasVSX = true;
944 continue;
945 }
946
947 // TODO: Finish this list and add an assert that we've handled them
948 // all.
949 }
950
951 return true;
952}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000953
Chris Lattnerecd49032009-03-02 22:27:17 +0000954/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
955/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000956void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000957 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000958 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000960 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000961 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000962 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000963 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000964 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000965 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000966 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000967 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000968 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000969 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000970
Chris Lattnerecd49032009-03-02 22:27:17 +0000971 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000972 if (getTriple().getArch() == llvm::Triple::ppc64le) {
973 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000974 } else {
975 if (getTriple().getOS() != llvm::Triple::NetBSD &&
976 getTriple().getOS() != llvm::Triple::OpenBSD)
977 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000978 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000979
Ulrich Weigand8afad612014-07-28 13:17:52 +0000980 // ABI options.
981 if (ABI == "elfv1")
982 Builder.defineMacro("_CALL_ELF", "1");
983 if (ABI == "elfv2")
984 Builder.defineMacro("_CALL_ELF", "2");
985
Chris Lattnerecd49032009-03-02 22:27:17 +0000986 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000987 Builder.defineMacro("__NATURAL_ALIGNMENT__");
988 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000989
Chris Lattnerecd49032009-03-02 22:27:17 +0000990 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000991 if (LongDoubleWidth == 128)
992 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000993
John Thompsone467e192009-11-19 17:18:50 +0000994 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000995 Builder.defineMacro("__VEC__", "10206");
996 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000997 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000998
999 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001000 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1001 .Case("440", ArchDefineName)
1002 .Case("450", ArchDefineName | ArchDefine440)
1003 .Case("601", ArchDefineName)
1004 .Case("602", ArchDefineName | ArchDefinePpcgr)
1005 .Case("603", ArchDefineName | ArchDefinePpcgr)
1006 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1008 .Case("604", ArchDefineName | ArchDefinePpcgr)
1009 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1010 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001011 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001012 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1013 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1014 .Case("750", ArchDefineName | ArchDefinePpcgr)
1015 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1016 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001017 .Case("a2", ArchDefineA2)
1018 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001019 .Case("pwr3", ArchDefinePpcgr)
1020 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1021 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1022 | ArchDefinePpcsq)
1023 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1024 | ArchDefinePpcgr | ArchDefinePpcsq)
1025 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1026 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1027 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1028 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1029 | ArchDefinePpcsq)
1030 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1031 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001032 | ArchDefinePpcgr | ArchDefinePpcsq)
1033 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1034 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1035 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001036 .Case("power3", ArchDefinePpcgr)
1037 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1038 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1039 | ArchDefinePpcsq)
1040 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1041 | ArchDefinePpcgr | ArchDefinePpcsq)
1042 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1043 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1044 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1045 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1046 | ArchDefinePpcsq)
1047 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1048 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001049 | ArchDefinePpcgr | ArchDefinePpcsq)
1050 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1051 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1052 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001053 .Default(ArchDefineNone);
1054
1055 if (defs & ArchDefineName)
1056 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1057 if (defs & ArchDefinePpcgr)
1058 Builder.defineMacro("_ARCH_PPCGR");
1059 if (defs & ArchDefinePpcsq)
1060 Builder.defineMacro("_ARCH_PPCSQ");
1061 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001062 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001063 if (defs & ArchDefine603)
1064 Builder.defineMacro("_ARCH_603");
1065 if (defs & ArchDefine604)
1066 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001067 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001068 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001069 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001070 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001071 if (defs & ArchDefinePwr5x)
1072 Builder.defineMacro("_ARCH_PWR5X");
1073 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001074 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001075 if (defs & ArchDefinePwr6x)
1076 Builder.defineMacro("_ARCH_PWR6X");
1077 if (defs & ArchDefinePwr7)
1078 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001079 if (defs & ArchDefinePwr8)
1080 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001081 if (defs & ArchDefineA2)
1082 Builder.defineMacro("_ARCH_A2");
1083 if (defs & ArchDefineA2q) {
1084 Builder.defineMacro("_ARCH_A2Q");
1085 Builder.defineMacro("_ARCH_QP");
1086 }
1087
1088 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1089 Builder.defineMacro("__bg__");
1090 Builder.defineMacro("__THW_BLUEGENE__");
1091 Builder.defineMacro("__bgq__");
1092 Builder.defineMacro("__TOS_BGQ__");
1093 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001094
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001095 if (HasVSX)
1096 Builder.defineMacro("__VSX__");
1097
Bill Schmidt38378a02013-02-01 20:23:10 +00001098 // FIXME: The following are not yet generated here by Clang, but are
1099 // generated by GCC:
1100 //
1101 // _SOFT_FLOAT_
1102 // __RECIP_PRECISION__
1103 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001104 // __RECIP__
1105 // __RECIPF__
1106 // __RSQRTE__
1107 // __RSQRTEF__
1108 // _SOFT_DOUBLE_
1109 // __NO_LWSYNC__
1110 // __HAVE_BSWAP__
1111 // __LONGDOUBLE128
1112 // __CMODEL_MEDIUM__
1113 // __CMODEL_LARGE__
1114 // _CALL_SYSV
1115 // _CALL_DARWIN
1116 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001117}
1118
1119void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1120 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1121 .Case("7400", true)
1122 .Case("g4", true)
1123 .Case("7450", true)
1124 .Case("g4+", true)
1125 .Case("970", true)
1126 .Case("g5", true)
1127 .Case("pwr6", true)
1128 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001129 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001130 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001131 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001132 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001133
1134 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001135
1136 if (!ABI.empty())
1137 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001138}
1139
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001140bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1141 return Feature == "powerpc";
1142}
Chris Lattner17df24e2008-04-21 18:56:49 +00001143
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001144
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001145const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001146 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1147 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1148 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1149 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1150 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1151 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1152 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1153 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001155 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001156 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001157 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1158 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1159 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1160 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001161 "vrsave", "vscr",
1162 "spe_acc", "spefscr",
1163 "sfp"
1164};
Chris Lattner10a5b382007-01-29 05:24:35 +00001165
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001166void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001167 unsigned &NumNames) const {
1168 Names = GCCRegNames;
1169 NumNames = llvm::array_lengthof(GCCRegNames);
1170}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001171
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001172const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1173 // While some of these aliases do map to different registers
1174 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001175 { { "0" }, "r0" },
1176 { { "1"}, "r1" },
1177 { { "2" }, "r2" },
1178 { { "3" }, "r3" },
1179 { { "4" }, "r4" },
1180 { { "5" }, "r5" },
1181 { { "6" }, "r6" },
1182 { { "7" }, "r7" },
1183 { { "8" }, "r8" },
1184 { { "9" }, "r9" },
1185 { { "10" }, "r10" },
1186 { { "11" }, "r11" },
1187 { { "12" }, "r12" },
1188 { { "13" }, "r13" },
1189 { { "14" }, "r14" },
1190 { { "15" }, "r15" },
1191 { { "16" }, "r16" },
1192 { { "17" }, "r17" },
1193 { { "18" }, "r18" },
1194 { { "19" }, "r19" },
1195 { { "20" }, "r20" },
1196 { { "21" }, "r21" },
1197 { { "22" }, "r22" },
1198 { { "23" }, "r23" },
1199 { { "24" }, "r24" },
1200 { { "25" }, "r25" },
1201 { { "26" }, "r26" },
1202 { { "27" }, "r27" },
1203 { { "28" }, "r28" },
1204 { { "29" }, "r29" },
1205 { { "30" }, "r30" },
1206 { { "31" }, "r31" },
1207 { { "fr0" }, "f0" },
1208 { { "fr1" }, "f1" },
1209 { { "fr2" }, "f2" },
1210 { { "fr3" }, "f3" },
1211 { { "fr4" }, "f4" },
1212 { { "fr5" }, "f5" },
1213 { { "fr6" }, "f6" },
1214 { { "fr7" }, "f7" },
1215 { { "fr8" }, "f8" },
1216 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001217 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001218 { { "fr11" }, "f11" },
1219 { { "fr12" }, "f12" },
1220 { { "fr13" }, "f13" },
1221 { { "fr14" }, "f14" },
1222 { { "fr15" }, "f15" },
1223 { { "fr16" }, "f16" },
1224 { { "fr17" }, "f17" },
1225 { { "fr18" }, "f18" },
1226 { { "fr19" }, "f19" },
1227 { { "fr20" }, "f20" },
1228 { { "fr21" }, "f21" },
1229 { { "fr22" }, "f22" },
1230 { { "fr23" }, "f23" },
1231 { { "fr24" }, "f24" },
1232 { { "fr25" }, "f25" },
1233 { { "fr26" }, "f26" },
1234 { { "fr27" }, "f27" },
1235 { { "fr28" }, "f28" },
1236 { { "fr29" }, "f29" },
1237 { { "fr30" }, "f30" },
1238 { { "fr31" }, "f31" },
1239 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001240};
1241
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001242void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001243 unsigned &NumAliases) const {
1244 Aliases = GCCRegAliases;
1245 NumAliases = llvm::array_lengthof(GCCRegAliases);
1246}
1247} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001248
Chris Lattner5ba61f02006-10-14 07:39:34 +00001249namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001251public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001252 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001253 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001254
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001255 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001256 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001257 case llvm::Triple::FreeBSD:
1258 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001259 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001260 PtrDiffType = SignedInt;
1261 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001262 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001263 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001264 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001265 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001266
Roman Divacky3ffe7462012-03-13 19:20:17 +00001267 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1268 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001269 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001270 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001271
1272 // PPC32 supports atomics up to 4 bytes.
1273 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001274 }
1275
Craig Topper3164f332014-03-11 03:39:26 +00001276 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001277 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001278 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001279 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001280};
1281} // end anonymous namespace.
1282
Bill Schmidt778d3872013-07-26 01:36:11 +00001283// Note: ABI differences may eventually require us to have a separate
1284// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001285namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001286class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001287public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001288 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001289 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001290 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001291 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001292
Roman Divacky3ffe7462012-03-13 19:20:17 +00001293 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1294 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001295 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001296 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001297 } else {
1298 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1299 DescriptionString = "e-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001300 ABI = "elfv2";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001301 } else {
1302 DescriptionString = "E-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001303 ABI = "elfv1";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001304 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001305 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001306
1307 // PPC64 supports atomics up to 8 bytes.
1308 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001309 }
Craig Topper3164f332014-03-11 03:39:26 +00001310 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001311 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001312 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001313 // PPC64 Linux-specifc ABI options.
1314 bool setABI(const std::string &Name) override {
1315 if (Name == "elfv1" || Name == "elfv2") {
1316 ABI = Name;
1317 return true;
1318 }
1319 return false;
1320 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001321};
1322} // end anonymous namespace.
1323
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001324
1325namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001326class DarwinPPC32TargetInfo :
1327 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001328public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001329 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1330 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001331 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001332 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001333 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001334 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001335 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001336 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001337 }
Craig Topper3164f332014-03-11 03:39:26 +00001338 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001339 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001340 }
1341};
1342
1343class DarwinPPC64TargetInfo :
1344 public DarwinTargetInfo<PPC64TargetInfo> {
1345public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001346 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1347 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001348 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001349 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001350 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001351 }
1352};
1353} // end anonymous namespace.
1354
Chris Lattner5ba61f02006-10-14 07:39:34 +00001355namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001356 static const unsigned NVPTXAddrSpaceMap[] = {
1357 1, // opencl_global
1358 3, // opencl_local
1359 4, // opencl_constant
1360 1, // cuda_device
1361 4, // cuda_constant
1362 3, // cuda_shared
1363 };
1364 class NVPTXTargetInfo : public TargetInfo {
1365 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001366 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001367 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001368 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001369 BigEndian = false;
1370 TLSSupported = false;
1371 LongWidth = LongAlign = 64;
1372 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001373 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001374 // Define available target features
1375 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001376 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001377 }
Craig Topper3164f332014-03-11 03:39:26 +00001378 void getTargetDefines(const LangOptions &Opts,
1379 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001380 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001381 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001382 }
Craig Topper3164f332014-03-11 03:39:26 +00001383 void getTargetBuiltins(const Builtin::Info *&Records,
1384 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001385 Records = BuiltinInfo;
1386 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 }
Craig Topper3164f332014-03-11 03:39:26 +00001388 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001389 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 }
Craig Topper3164f332014-03-11 03:39:26 +00001391
1392 void getGCCRegNames(const char * const *&Names,
1393 unsigned &NumNames) const override;
1394 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1395 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001396 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001397 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001398 NumAliases = 0;
1399 }
Craig Topper3164f332014-03-11 03:39:26 +00001400 bool validateAsmConstraint(const char *&Name,
1401 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001402 switch (*Name) {
1403 default: return false;
1404 case 'c':
1405 case 'h':
1406 case 'r':
1407 case 'l':
1408 case 'f':
1409 case 'd':
1410 Info.setAllowsRegister();
1411 return true;
1412 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001413 }
Craig Topper3164f332014-03-11 03:39:26 +00001414 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001415 // FIXME: Is this really right?
1416 return "";
1417 }
Craig Topper3164f332014-03-11 03:39:26 +00001418 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001419 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001420 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001421 }
Craig Topper3164f332014-03-11 03:39:26 +00001422 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001423 bool Valid = llvm::StringSwitch<bool>(Name)
1424 .Case("sm_20", true)
1425 .Case("sm_21", true)
1426 .Case("sm_30", true)
1427 .Case("sm_35", true)
1428 .Default(false);
1429
1430 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001431 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001432 };
1433
1434 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1435#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1436#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1437 ALL_LANGUAGES },
1438#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001439 };
1440
1441 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1442 "r0"
1443 };
1444
1445 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1446 unsigned &NumNames) const {
1447 Names = GCCRegNames;
1448 NumNames = llvm::array_lengthof(GCCRegNames);
1449 }
1450
1451 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1452 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001453 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001454 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001455 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1456 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001457 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001458 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001459 };
1460
1461 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1462 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001463 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001464 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001465 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1466 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001467 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001468 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 };
1470}
1471
1472namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001473
1474static const unsigned R600AddrSpaceMap[] = {
1475 1, // opencl_global
1476 3, // opencl_local
1477 2, // opencl_constant
1478 1, // cuda_device
1479 2, // cuda_constant
1480 3 // cuda_shared
1481};
1482
Tom Stellardc74b1e02013-03-04 17:40:53 +00001483static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001484 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1485 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001486
1487static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001488 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1489 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001490
1491static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001492 "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 +00001493 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1494 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001495
Eli Friedmand13b41e2012-10-12 23:32:00 +00001496class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001497 static const Builtin::Info BuiltinInfo[];
1498
Tom Stellardc74b1e02013-03-04 17:40:53 +00001499 /// \brief The GPU profiles supported by the R600 target.
1500 enum GPUKind {
1501 GK_NONE,
1502 GK_R600,
1503 GK_R600_DOUBLE_OPS,
1504 GK_R700,
1505 GK_R700_DOUBLE_OPS,
1506 GK_EVERGREEN,
1507 GK_EVERGREEN_DOUBLE_OPS,
1508 GK_NORTHERN_ISLANDS,
1509 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001510 GK_SOUTHERN_ISLANDS,
1511 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001512 } GPU;
1513
Eli Friedmand13b41e2012-10-12 23:32:00 +00001514public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001515 R600TargetInfo(const llvm::Triple &Triple)
1516 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001517 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001518 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001519 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001520 }
1521
Craig Topper3164f332014-03-11 03:39:26 +00001522 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001523 return "";
1524 }
1525
Craig Topper3164f332014-03-11 03:39:26 +00001526 void getGCCRegNames(const char * const *&Names,
1527 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001528 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001529 numNames = 0;
1530 }
1531
Craig Topper3164f332014-03-11 03:39:26 +00001532 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1533 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001534 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001535 NumAliases = 0;
1536 }
1537
Craig Topper3164f332014-03-11 03:39:26 +00001538 bool validateAsmConstraint(const char *&Name,
1539 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001540 return true;
1541 }
1542
Craig Topper3164f332014-03-11 03:39:26 +00001543 void getTargetBuiltins(const Builtin::Info *&Records,
1544 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001545 Records = BuiltinInfo;
1546 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001547 }
1548
Craig Topper3164f332014-03-11 03:39:26 +00001549 void getTargetDefines(const LangOptions &Opts,
1550 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001551 Builder.defineMacro("__R600__");
1552 }
1553
Craig Topper3164f332014-03-11 03:39:26 +00001554 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001555 return TargetInfo::CharPtrBuiltinVaList;
1556 }
1557
Craig Topper3164f332014-03-11 03:39:26 +00001558 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001559 GPU = llvm::StringSwitch<GPUKind>(Name)
1560 .Case("r600" , GK_R600)
1561 .Case("rv610", GK_R600)
1562 .Case("rv620", GK_R600)
1563 .Case("rv630", GK_R600)
1564 .Case("rv635", GK_R600)
1565 .Case("rs780", GK_R600)
1566 .Case("rs880", GK_R600)
1567 .Case("rv670", GK_R600_DOUBLE_OPS)
1568 .Case("rv710", GK_R700)
1569 .Case("rv730", GK_R700)
1570 .Case("rv740", GK_R700_DOUBLE_OPS)
1571 .Case("rv770", GK_R700_DOUBLE_OPS)
1572 .Case("palm", GK_EVERGREEN)
1573 .Case("cedar", GK_EVERGREEN)
1574 .Case("sumo", GK_EVERGREEN)
1575 .Case("sumo2", GK_EVERGREEN)
1576 .Case("redwood", GK_EVERGREEN)
1577 .Case("juniper", GK_EVERGREEN)
1578 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1579 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1580 .Case("barts", GK_NORTHERN_ISLANDS)
1581 .Case("turks", GK_NORTHERN_ISLANDS)
1582 .Case("caicos", GK_NORTHERN_ISLANDS)
1583 .Case("cayman", GK_CAYMAN)
1584 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001585 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001586 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1587 .Case("verde", GK_SOUTHERN_ISLANDS)
1588 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001589 .Case("bonaire", GK_SEA_ISLANDS)
1590 .Case("kabini", GK_SEA_ISLANDS)
1591 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001592 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001593 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001594 .Default(GK_NONE);
1595
1596 if (GPU == GK_NONE) {
1597 return false;
1598 }
1599
1600 // Set the correct data layout
1601 switch (GPU) {
1602 case GK_NONE:
1603 case GK_R600:
1604 case GK_R700:
1605 case GK_EVERGREEN:
1606 case GK_NORTHERN_ISLANDS:
1607 DescriptionString = DescriptionStringR600;
1608 break;
1609 case GK_R600_DOUBLE_OPS:
1610 case GK_R700_DOUBLE_OPS:
1611 case GK_EVERGREEN_DOUBLE_OPS:
1612 case GK_CAYMAN:
1613 DescriptionString = DescriptionStringR600DoubleOps;
1614 break;
1615 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001616 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001617 DescriptionString = DescriptionStringSI;
1618 break;
1619 }
1620
1621 return true;
1622 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001623};
1624
Matt Arsenault56f008d2014-06-24 20:45:01 +00001625const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1626#define BUILTIN(ID, TYPE, ATTRS) \
1627 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1628#include "clang/Basic/BuiltinsR600.def"
1629};
1630
Eli Friedmand13b41e2012-10-12 23:32:00 +00001631} // end anonymous namespace
1632
1633namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001634// Namespace for x86 abstract base class
1635const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001636#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001637#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001638 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001639#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001640};
Eli Friedmanb5366062008-05-20 14:21:01 +00001641
Nuno Lopescfca1f02009-12-23 17:49:57 +00001642static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001643 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1644 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001645 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001646 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1647 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1648 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001649 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001650 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1651 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001652};
1653
Eric Christophercdd36352011-06-21 00:05:20 +00001654const TargetInfo::AddlRegName AddlRegNames[] = {
1655 { { "al", "ah", "eax", "rax" }, 0 },
1656 { { "bl", "bh", "ebx", "rbx" }, 3 },
1657 { { "cl", "ch", "ecx", "rcx" }, 2 },
1658 { { "dl", "dh", "edx", "rdx" }, 1 },
1659 { { "esi", "rsi" }, 4 },
1660 { { "edi", "rdi" }, 5 },
1661 { { "esp", "rsp" }, 7 },
1662 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001663};
1664
1665// X86 target abstract base class; x86-32 and x86-64 are very close, so
1666// most of the implementation can be shared.
1667class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001668 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001669 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001670 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001671 enum MMX3DNowEnum {
1672 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1673 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001674 enum XOPEnum {
1675 NoXOP,
1676 SSE4A,
1677 FMA4,
1678 XOP
1679 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001680
Eric Christophere1ddaf92010-04-02 23:50:19 +00001681 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001682 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001683 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001684 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001685 bool HasBMI;
1686 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001687 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001688 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001689 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001690 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001691 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001692 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001693 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001694 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001695 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001696 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001697
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001698 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1699 ///
1700 /// Each enumeration represents a particular CPU supported by Clang. These
1701 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1702 enum CPUKind {
1703 CK_Generic,
1704
1705 /// \name i386
1706 /// i386-generation processors.
1707 //@{
1708 CK_i386,
1709 //@}
1710
1711 /// \name i486
1712 /// i486-generation processors.
1713 //@{
1714 CK_i486,
1715 CK_WinChipC6,
1716 CK_WinChip2,
1717 CK_C3,
1718 //@}
1719
1720 /// \name i586
1721 /// i586-generation processors, P5 microarchitecture based.
1722 //@{
1723 CK_i586,
1724 CK_Pentium,
1725 CK_PentiumMMX,
1726 //@}
1727
1728 /// \name i686
1729 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1730 //@{
1731 CK_i686,
1732 CK_PentiumPro,
1733 CK_Pentium2,
1734 CK_Pentium3,
1735 CK_Pentium3M,
1736 CK_PentiumM,
1737 CK_C3_2,
1738
1739 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1740 /// Clang however has some logic to suport this.
1741 // FIXME: Warn, deprecate, and potentially remove this.
1742 CK_Yonah,
1743 //@}
1744
1745 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001746 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001747 //@{
1748 CK_Pentium4,
1749 CK_Pentium4M,
1750 CK_Prescott,
1751 CK_Nocona,
1752 //@}
1753
1754 /// \name Core
1755 /// Core microarchitecture based processors.
1756 //@{
1757 CK_Core2,
1758
1759 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1760 /// codename which GCC no longer accepts as an option to -march, but Clang
1761 /// has some logic for recognizing it.
1762 // FIXME: Warn, deprecate, and potentially remove this.
1763 CK_Penryn,
1764 //@}
1765
1766 /// \name Atom
1767 /// Atom processors
1768 //@{
1769 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001770 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001771 //@}
1772
1773 /// \name Nehalem
1774 /// Nehalem microarchitecture based processors.
1775 //@{
1776 CK_Corei7,
1777 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001778 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001779 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001780 //@}
1781
Craig Topper449314e2013-08-20 07:09:39 +00001782 /// \name Knights Landing
1783 /// Knights Landing processor.
1784 CK_KNL,
1785
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001786 /// \name Skylake Server
1787 /// Skylake server processor.
1788 CK_SKX,
1789
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001790 /// \name K6
1791 /// K6 architecture processors.
1792 //@{
1793 CK_K6,
1794 CK_K6_2,
1795 CK_K6_3,
1796 //@}
1797
1798 /// \name K7
1799 /// K7 architecture processors.
1800 //@{
1801 CK_Athlon,
1802 CK_AthlonThunderbird,
1803 CK_Athlon4,
1804 CK_AthlonXP,
1805 CK_AthlonMP,
1806 //@}
1807
1808 /// \name K8
1809 /// K8 architecture processors.
1810 //@{
1811 CK_Athlon64,
1812 CK_Athlon64SSE3,
1813 CK_AthlonFX,
1814 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001815 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001816 CK_Opteron,
1817 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001818 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001819 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001820
Benjamin Kramer569f2152012-01-10 11:50:18 +00001821 /// \name Bobcat
1822 /// Bobcat architecture processors.
1823 //@{
1824 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001825 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001826 //@}
1827
1828 /// \name Bulldozer
1829 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001830 //@{
1831 CK_BDVER1,
1832 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001833 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001834 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001835 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001836
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001837 /// This specification is deprecated and will be removed in the future.
1838 /// Users should prefer \see CK_K8.
1839 // FIXME: Warn on this when the CPU is set to it.
1840 CK_x86_64,
1841 //@}
1842
1843 /// \name Geode
1844 /// Geode processors.
1845 //@{
1846 CK_Geode
1847 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001848 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001849
Rafael Espindolaeb265472013-08-21 21:59:03 +00001850 enum FPMathKind {
1851 FP_Default,
1852 FP_SSE,
1853 FP_387
1854 } FPMath;
1855
Eli Friedman3fd920a2008-08-20 02:34:37 +00001856public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001857 X86TargetInfo(const llvm::Triple &Triple)
1858 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001859 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1860 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001861 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1862 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001863 HasAVX512PF(false), HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1864 HasSHA(false), HasCX16(false), CPU(CK_Generic),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001865 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001866 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001867 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001868 }
Craig Topper3164f332014-03-11 03:39:26 +00001869 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001870 // X87 evaluates with 80 bits "long double" precision.
1871 return SSELevel == NoSSE ? 2 : 0;
1872 }
Craig Topper3164f332014-03-11 03:39:26 +00001873 void getTargetBuiltins(const Builtin::Info *&Records,
1874 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001875 Records = BuiltinInfo;
1876 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001877 }
Craig Topper3164f332014-03-11 03:39:26 +00001878 void getGCCRegNames(const char * const *&Names,
1879 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001880 Names = GCCRegNames;
1881 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001882 }
Craig Topper3164f332014-03-11 03:39:26 +00001883 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1884 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001885 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001886 NumAliases = 0;
1887 }
Craig Topper3164f332014-03-11 03:39:26 +00001888 void getGCCAddlRegNames(const AddlRegName *&Names,
1889 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001890 Names = AddlRegNames;
1891 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001892 }
Craig Topper3164f332014-03-11 03:39:26 +00001893 bool validateAsmConstraint(const char *&Name,
1894 TargetInfo::ConstraintInfo &info) const override;
1895 std::string convertConstraint(const char *&Constraint) const override;
1896 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001897 return "~{dirflag},~{fpsr},~{flags}";
1898 }
Craig Topper3164f332014-03-11 03:39:26 +00001899 void getTargetDefines(const LangOptions &Opts,
1900 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001901 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1902 bool Enabled);
1903 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1904 bool Enabled);
1905 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1906 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001907 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1908 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001909 setFeatureEnabledImpl(Features, Name, Enabled);
1910 }
1911 // This exists purely to cut down on the number of virtual calls in
1912 // getDefaultFeatures which calls this repeatedly.
1913 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1914 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001915 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1916 bool hasFeature(StringRef Feature) const override;
1917 bool handleTargetFeatures(std::vector<std::string> &Features,
1918 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001919 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001920 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001921 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001922 else if (getTriple().getArch() == llvm::Triple::x86 &&
1923 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001924 return "no-mmx";
1925 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001926 }
Craig Topper3164f332014-03-11 03:39:26 +00001927 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001928 CPU = llvm::StringSwitch<CPUKind>(Name)
1929 .Case("i386", CK_i386)
1930 .Case("i486", CK_i486)
1931 .Case("winchip-c6", CK_WinChipC6)
1932 .Case("winchip2", CK_WinChip2)
1933 .Case("c3", CK_C3)
1934 .Case("i586", CK_i586)
1935 .Case("pentium", CK_Pentium)
1936 .Case("pentium-mmx", CK_PentiumMMX)
1937 .Case("i686", CK_i686)
1938 .Case("pentiumpro", CK_PentiumPro)
1939 .Case("pentium2", CK_Pentium2)
1940 .Case("pentium3", CK_Pentium3)
1941 .Case("pentium3m", CK_Pentium3M)
1942 .Case("pentium-m", CK_PentiumM)
1943 .Case("c3-2", CK_C3_2)
1944 .Case("yonah", CK_Yonah)
1945 .Case("pentium4", CK_Pentium4)
1946 .Case("pentium4m", CK_Pentium4M)
1947 .Case("prescott", CK_Prescott)
1948 .Case("nocona", CK_Nocona)
1949 .Case("core2", CK_Core2)
1950 .Case("penryn", CK_Penryn)
1951 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001952 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001953 .Case("corei7", CK_Corei7)
1954 .Case("corei7-avx", CK_Corei7AVX)
1955 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001956 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001957 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001958 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001959 .Case("k6", CK_K6)
1960 .Case("k6-2", CK_K6_2)
1961 .Case("k6-3", CK_K6_3)
1962 .Case("athlon", CK_Athlon)
1963 .Case("athlon-tbird", CK_AthlonThunderbird)
1964 .Case("athlon-4", CK_Athlon4)
1965 .Case("athlon-xp", CK_AthlonXP)
1966 .Case("athlon-mp", CK_AthlonMP)
1967 .Case("athlon64", CK_Athlon64)
1968 .Case("athlon64-sse3", CK_Athlon64SSE3)
1969 .Case("athlon-fx", CK_AthlonFX)
1970 .Case("k8", CK_K8)
1971 .Case("k8-sse3", CK_K8SSE3)
1972 .Case("opteron", CK_Opteron)
1973 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001974 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001975 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001976 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001977 .Case("bdver1", CK_BDVER1)
1978 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001979 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001980 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001981 .Case("x86-64", CK_x86_64)
1982 .Case("geode", CK_Geode)
1983 .Default(CK_Generic);
1984
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001985 // Perform any per-CPU checks necessary to determine if this CPU is
1986 // acceptable.
1987 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1988 // invalid without explaining *why*.
1989 switch (CPU) {
1990 case CK_Generic:
1991 // No processor selected!
1992 return false;
1993
1994 case CK_i386:
1995 case CK_i486:
1996 case CK_WinChipC6:
1997 case CK_WinChip2:
1998 case CK_C3:
1999 case CK_i586:
2000 case CK_Pentium:
2001 case CK_PentiumMMX:
2002 case CK_i686:
2003 case CK_PentiumPro:
2004 case CK_Pentium2:
2005 case CK_Pentium3:
2006 case CK_Pentium3M:
2007 case CK_PentiumM:
2008 case CK_Yonah:
2009 case CK_C3_2:
2010 case CK_Pentium4:
2011 case CK_Pentium4M:
2012 case CK_Prescott:
2013 case CK_K6:
2014 case CK_K6_2:
2015 case CK_K6_3:
2016 case CK_Athlon:
2017 case CK_AthlonThunderbird:
2018 case CK_Athlon4:
2019 case CK_AthlonXP:
2020 case CK_AthlonMP:
2021 case CK_Geode:
2022 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002023 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002024 return false;
2025
2026 // Fallthrough
2027 case CK_Nocona:
2028 case CK_Core2:
2029 case CK_Penryn:
2030 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002031 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002032 case CK_Corei7:
2033 case CK_Corei7AVX:
2034 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002035 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002036 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002037 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002038 case CK_Athlon64:
2039 case CK_Athlon64SSE3:
2040 case CK_AthlonFX:
2041 case CK_K8:
2042 case CK_K8SSE3:
2043 case CK_Opteron:
2044 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002045 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002046 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002047 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002048 case CK_BDVER1:
2049 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002050 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002051 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002052 case CK_x86_64:
2053 return true;
2054 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002055 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002056 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002057
Craig Topper3164f332014-03-11 03:39:26 +00002058 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002059
Craig Topper3164f332014-03-11 03:39:26 +00002060 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002061 // We accept all non-ARM calling conventions
2062 return (CC == CC_X86ThisCall ||
2063 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002064 CC == CC_X86StdCall ||
2065 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002066 CC == CC_X86Pascal ||
2067 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002068 }
2069
Craig Topper3164f332014-03-11 03:39:26 +00002070 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002071 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002072 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002073};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002074
Rafael Espindolaeb265472013-08-21 21:59:03 +00002075bool X86TargetInfo::setFPMath(StringRef Name) {
2076 if (Name == "387") {
2077 FPMath = FP_387;
2078 return true;
2079 }
2080 if (Name == "sse") {
2081 FPMath = FP_SSE;
2082 return true;
2083 }
2084 return false;
2085}
2086
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002087void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002088 // FIXME: This *really* should not be here.
2089
2090 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002091 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002092 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002093
Chandler Carruth212334f2011-09-28 08:55:37 +00002094 switch (CPU) {
2095 case CK_Generic:
2096 case CK_i386:
2097 case CK_i486:
2098 case CK_i586:
2099 case CK_Pentium:
2100 case CK_i686:
2101 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002102 break;
2103 case CK_PentiumMMX:
2104 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002105 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002106 break;
2107 case CK_Pentium3:
2108 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002109 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002110 break;
2111 case CK_PentiumM:
2112 case CK_Pentium4:
2113 case CK_Pentium4M:
2114 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002115 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002116 break;
2117 case CK_Yonah:
2118 case CK_Prescott:
2119 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002121 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002122 break;
2123 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002124 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002125 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 break;
2127 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002128 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002129 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002130 break;
2131 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002132 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002133 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002134 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002135 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002136 setFeatureEnabledImpl(Features, "sse4.2", true);
2137 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002138 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002140 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002141 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002142 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002143 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002144 break;
2145 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002146 setFeatureEnabledImpl(Features, "avx", true);
2147 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002148 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002149 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002150 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002151 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002152 setFeatureEnabledImpl(Features, "avx", true);
2153 setFeatureEnabledImpl(Features, "aes", true);
2154 setFeatureEnabledImpl(Features, "pclmul", true);
2155 setFeatureEnabledImpl(Features, "rdrnd", true);
2156 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002157 break;
Craig Topper865fff52011-12-17 19:55:21 +00002158 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002159 setFeatureEnabledImpl(Features, "avx2", true);
2160 setFeatureEnabledImpl(Features, "aes", true);
2161 setFeatureEnabledImpl(Features, "pclmul", true);
2162 setFeatureEnabledImpl(Features, "lzcnt", true);
2163 setFeatureEnabledImpl(Features, "rdrnd", true);
2164 setFeatureEnabledImpl(Features, "f16c", true);
2165 setFeatureEnabledImpl(Features, "bmi", true);
2166 setFeatureEnabledImpl(Features, "bmi2", true);
2167 setFeatureEnabledImpl(Features, "rtm", true);
2168 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002169 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002170 break;
Craig Topper449314e2013-08-20 07:09:39 +00002171 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002172 setFeatureEnabledImpl(Features, "avx512f", true);
2173 setFeatureEnabledImpl(Features, "avx512cd", true);
2174 setFeatureEnabledImpl(Features, "avx512er", true);
2175 setFeatureEnabledImpl(Features, "avx512pf", true);
2176 setFeatureEnabledImpl(Features, "aes", true);
2177 setFeatureEnabledImpl(Features, "pclmul", true);
2178 setFeatureEnabledImpl(Features, "lzcnt", true);
2179 setFeatureEnabledImpl(Features, "rdrnd", true);
2180 setFeatureEnabledImpl(Features, "f16c", true);
2181 setFeatureEnabledImpl(Features, "bmi", true);
2182 setFeatureEnabledImpl(Features, "bmi2", true);
2183 setFeatureEnabledImpl(Features, "rtm", true);
2184 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002185 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002186 case CK_SKX:
2187 setFeatureEnabledImpl(Features, "avx512f", true);
2188 setFeatureEnabledImpl(Features, "avx512cd", true);
2189 setFeatureEnabledImpl(Features, "avx512dq", true);
2190 setFeatureEnabledImpl(Features, "avx512bw", true);
2191 setFeatureEnabledImpl(Features, "avx512vl", true);
2192 setFeatureEnabledImpl(Features, "aes", true);
2193 setFeatureEnabledImpl(Features, "pclmul", true);
2194 setFeatureEnabledImpl(Features, "lzcnt", true);
2195 setFeatureEnabledImpl(Features, "rdrnd", true);
2196 setFeatureEnabledImpl(Features, "f16c", true);
2197 setFeatureEnabledImpl(Features, "bmi", true);
2198 setFeatureEnabledImpl(Features, "bmi2", true);
2199 setFeatureEnabledImpl(Features, "rtm", true);
2200 setFeatureEnabledImpl(Features, "fma", true);
2201 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002202 case CK_K6:
2203 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002204 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002205 break;
2206 case CK_K6_2:
2207 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002208 case CK_WinChip2:
2209 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002210 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002211 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002212 case CK_Athlon:
2213 case CK_AthlonThunderbird:
2214 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002215 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002216 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002217 case CK_Athlon4:
2218 case CK_AthlonXP:
2219 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002220 setFeatureEnabledImpl(Features, "sse", true);
2221 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002222 break;
2223 case CK_K8:
2224 case CK_Opteron:
2225 case CK_Athlon64:
2226 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002227 setFeatureEnabledImpl(Features, "sse2", true);
2228 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002229 break;
2230 case CK_K8SSE3:
2231 case CK_OpteronSSE3:
2232 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002233 setFeatureEnabledImpl(Features, "sse3", true);
2234 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002235 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002236 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002237 setFeatureEnabledImpl(Features, "sse3", true);
2238 setFeatureEnabledImpl(Features, "sse4a", true);
2239 setFeatureEnabledImpl(Features, "3dnowa", true);
2240 setFeatureEnabledImpl(Features, "lzcnt", true);
2241 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002242 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002243 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002244 setFeatureEnabledImpl(Features, "ssse3", true);
2245 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002246 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002247 setFeatureEnabledImpl(Features, "lzcnt", true);
2248 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002249 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002250 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002251 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002252 setFeatureEnabledImpl(Features, "avx", true);
2253 setFeatureEnabledImpl(Features, "sse4a", true);
2254 setFeatureEnabledImpl(Features, "lzcnt", true);
2255 setFeatureEnabledImpl(Features, "aes", true);
2256 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002257 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002258 setFeatureEnabledImpl(Features, "bmi", true);
2259 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002260 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002261 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002262 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002263 setFeatureEnabledImpl(Features, "xop", true);
2264 setFeatureEnabledImpl(Features, "lzcnt", true);
2265 setFeatureEnabledImpl(Features, "aes", true);
2266 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002267 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002268 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002269 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002270 case CK_BDVER4:
2271 setFeatureEnabledImpl(Features, "avx2", true);
2272 setFeatureEnabledImpl(Features, "bmi2", true);
2273 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002274 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002275 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002276 setFeatureEnabledImpl(Features, "xop", true);
2277 setFeatureEnabledImpl(Features, "lzcnt", true);
2278 setFeatureEnabledImpl(Features, "aes", true);
2279 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002280 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002281 setFeatureEnabledImpl(Features, "bmi", true);
2282 setFeatureEnabledImpl(Features, "fma", true);
2283 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002284 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002285 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002286 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002287 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002288 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002289 break;
Eli Friedman33465822011-07-08 23:31:17 +00002290 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002291}
2292
Rafael Espindolae62e2792013-08-20 13:44:29 +00002293void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002294 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002295 if (Enabled) {
2296 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002297 case AVX512F:
2298 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002299 case AVX2:
2300 Features["avx2"] = true;
2301 case AVX:
2302 Features["avx"] = true;
2303 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002304 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002305 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002306 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002307 case SSSE3:
2308 Features["ssse3"] = true;
2309 case SSE3:
2310 Features["sse3"] = true;
2311 case SSE2:
2312 Features["sse2"] = true;
2313 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002314 Features["sse"] = true;
2315 case NoSSE:
2316 break;
2317 }
2318 return;
2319 }
2320
2321 switch (Level) {
2322 case NoSSE:
2323 case SSE1:
2324 Features["sse"] = false;
2325 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002326 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2327 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002328 case SSE3:
2329 Features["sse3"] = false;
2330 setXOPLevel(Features, NoXOP, false);
2331 case SSSE3:
2332 Features["ssse3"] = false;
2333 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002334 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002335 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002336 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002337 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002338 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002339 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 case AVX2:
2341 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002342 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002343 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2344 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002345 }
2346}
2347
2348void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002349 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002350 if (Enabled) {
2351 switch (Level) {
2352 case AMD3DNowAthlon:
2353 Features["3dnowa"] = true;
2354 case AMD3DNow:
2355 Features["3dnow"] = true;
2356 case MMX:
2357 Features["mmx"] = true;
2358 case NoMMX3DNow:
2359 break;
2360 }
2361 return;
2362 }
2363
2364 switch (Level) {
2365 case NoMMX3DNow:
2366 case MMX:
2367 Features["mmx"] = false;
2368 case AMD3DNow:
2369 Features["3dnow"] = false;
2370 case AMD3DNowAthlon:
2371 Features["3dnowa"] = false;
2372 }
2373}
2374
2375void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002376 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002377 if (Enabled) {
2378 switch (Level) {
2379 case XOP:
2380 Features["xop"] = true;
2381 case FMA4:
2382 Features["fma4"] = true;
2383 setSSELevel(Features, AVX, true);
2384 case SSE4A:
2385 Features["sse4a"] = true;
2386 setSSELevel(Features, SSE3, true);
2387 case NoXOP:
2388 break;
2389 }
2390 return;
2391 }
2392
2393 switch (Level) {
2394 case NoXOP:
2395 case SSE4A:
2396 Features["sse4a"] = false;
2397 case FMA4:
2398 Features["fma4"] = false;
2399 case XOP:
2400 Features["xop"] = false;
2401 }
2402}
2403
Craig Topper86d79ef2013-09-17 04:51:29 +00002404void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2405 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002406 // FIXME: This *really* should not be here. We need some way of translating
2407 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002408 if (Name == "sse4")
2409 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002410
Rafael Espindolae62e2792013-08-20 13:44:29 +00002411 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002412
Craig Topper29561122013-09-19 01:13:07 +00002413 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002414 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002415 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002416 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002417 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002418 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002419 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002420 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002421 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002422 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002423 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002424 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002425 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002426 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002427 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002428 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002429 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002430 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002431 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002432 if (Enabled)
2433 setSSELevel(Features, SSE2, Enabled);
2434 } else if (Name == "pclmul") {
2435 if (Enabled)
2436 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002437 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002438 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002439 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002440 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002441 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002442 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002443 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2444 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002445 if (Enabled)
2446 setSSELevel(Features, AVX512F, Enabled);
2447 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002448 if (Enabled)
2449 setSSELevel(Features, AVX, Enabled);
2450 } else if (Name == "fma4") {
2451 setXOPLevel(Features, FMA4, Enabled);
2452 } else if (Name == "xop") {
2453 setXOPLevel(Features, XOP, Enabled);
2454 } else if (Name == "sse4a") {
2455 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002456 } else if (Name == "f16c") {
2457 if (Enabled)
2458 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002459 } else if (Name == "sha") {
2460 if (Enabled)
2461 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002462 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002463}
2464
Eric Christopher3ff21b32013-10-16 21:26:26 +00002465/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002466/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002467bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002468 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002469 // Remember the maximum enabled sselevel.
2470 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2471 // Ignore disabled features.
2472 if (Features[i][0] == '-')
2473 continue;
2474
Benjamin Kramer27402c62012-03-05 15:10:44 +00002475 StringRef Feature = StringRef(Features[i]).substr(1);
2476
2477 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002478 HasAES = true;
2479 continue;
2480 }
2481
Craig Topper3f122a72012-05-31 05:18:48 +00002482 if (Feature == "pclmul") {
2483 HasPCLMUL = true;
2484 continue;
2485 }
2486
Benjamin Kramer27402c62012-03-05 15:10:44 +00002487 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002488 HasLZCNT = true;
2489 continue;
2490 }
2491
Rafael Espindola89049822013-08-23 20:21:37 +00002492 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002493 HasRDRND = true;
2494 continue;
2495 }
2496
Benjamin Kramer27402c62012-03-05 15:10:44 +00002497 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002498 HasBMI = true;
2499 continue;
2500 }
2501
Benjamin Kramer27402c62012-03-05 15:10:44 +00002502 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002503 HasBMI2 = true;
2504 continue;
2505 }
2506
Benjamin Kramer27402c62012-03-05 15:10:44 +00002507 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002508 HasPOPCNT = true;
2509 continue;
2510 }
2511
Michael Liao625a8752012-11-10 05:17:46 +00002512 if (Feature == "rtm") {
2513 HasRTM = true;
2514 continue;
2515 }
2516
Michael Liao74f4eaf2013-03-26 17:52:08 +00002517 if (Feature == "prfchw") {
2518 HasPRFCHW = true;
2519 continue;
2520 }
2521
Michael Liaoffaae352013-03-29 05:17:55 +00002522 if (Feature == "rdseed") {
2523 HasRDSEED = true;
2524 continue;
2525 }
2526
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002527 if (Feature == "tbm") {
2528 HasTBM = true;
2529 continue;
2530 }
2531
Craig Topperbba778b2012-06-03 21:46:30 +00002532 if (Feature == "fma") {
2533 HasFMA = true;
2534 continue;
2535 }
2536
Manman Rena45358c2012-10-11 00:59:55 +00002537 if (Feature == "f16c") {
2538 HasF16C = true;
2539 continue;
2540 }
2541
Craig Topper679b53a2013-08-21 05:29:10 +00002542 if (Feature == "avx512cd") {
2543 HasAVX512CD = true;
2544 continue;
2545 }
2546
2547 if (Feature == "avx512er") {
2548 HasAVX512ER = true;
2549 continue;
2550 }
2551
2552 if (Feature == "avx512pf") {
2553 HasAVX512PF = true;
2554 continue;
2555 }
2556
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002557 if (Feature == "avx512dq") {
2558 HasAVX512DQ = true;
2559 continue;
2560 }
2561
2562 if (Feature == "avx512bw") {
2563 HasAVX512BW = true;
2564 continue;
2565 }
2566
2567 if (Feature == "avx512vl") {
2568 HasAVX512VL = true;
2569 continue;
2570 }
2571
Ben Langmuir58078d02013-09-19 13:22:04 +00002572 if (Feature == "sha") {
2573 HasSHA = true;
2574 continue;
2575 }
2576
Nick Lewycky50e8f482013-10-05 20:14:27 +00002577 if (Feature == "cx16") {
2578 HasCX16 = true;
2579 continue;
2580 }
2581
Daniel Dunbar979586e2009-11-11 09:38:56 +00002582 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002583 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002584 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002585 .Case("avx2", AVX2)
2586 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002587 .Case("sse4.2", SSE42)
2588 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002589 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002590 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002591 .Case("sse2", SSE2)
2592 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002593 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002594 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002595
Eli Friedman33465822011-07-08 23:31:17 +00002596 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002597 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002598 .Case("3dnowa", AMD3DNowAthlon)
2599 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002600 .Case("mmx", MMX)
2601 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002602 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002603
2604 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2605 .Case("xop", XOP)
2606 .Case("fma4", FMA4)
2607 .Case("sse4a", SSE4A)
2608 .Default(NoXOP);
2609 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002610 }
Eli Friedman33465822011-07-08 23:31:17 +00002611
Craig Topper7481d8a2013-09-10 06:55:47 +00002612 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2613 // Can't do this earlier because we need to be able to explicitly enable
2614 // popcnt and still disable sse4.2.
2615 if (!HasPOPCNT && SSELevel >= SSE42 &&
2616 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2617 HasPOPCNT = true;
2618 Features.push_back("+popcnt");
2619 }
2620
Yunzhong Gao61089362013-10-16 19:07:02 +00002621 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2622 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2623 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2624 HasPRFCHW = true;
2625 Features.push_back("+prfchw");
2626 }
2627
Rafael Espindolaeb265472013-08-21 21:59:03 +00002628 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2629 // matches the selected sse level.
2630 if (FPMath == FP_SSE && SSELevel < SSE1) {
2631 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2632 return false;
2633 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2634 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2635 return false;
2636 }
2637
Eli Friedman33465822011-07-08 23:31:17 +00002638 // Don't tell the backend if we're turning off mmx; it will end up disabling
2639 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002640 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2641 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002642 std::vector<std::string>::iterator it;
2643 it = std::find(Features.begin(), Features.end(), "-mmx");
2644 if (it != Features.end())
2645 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002646 else if (SSELevel > NoSSE)
2647 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002648 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002649}
Chris Lattnerecd49032009-03-02 22:27:17 +00002650
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002651/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2652/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002653void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002654 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002655 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002656 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002657 Builder.defineMacro("__amd64__");
2658 Builder.defineMacro("__amd64");
2659 Builder.defineMacro("__x86_64");
2660 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002661 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002662 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002663 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002664
Chris Lattnerecd49032009-03-02 22:27:17 +00002665 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002666 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2667 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002668 switch (CPU) {
2669 case CK_Generic:
2670 break;
2671 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002672 // The rest are coming from the i386 define above.
2673 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002674 break;
2675 case CK_i486:
2676 case CK_WinChipC6:
2677 case CK_WinChip2:
2678 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002679 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002680 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002681 case CK_PentiumMMX:
2682 Builder.defineMacro("__pentium_mmx__");
2683 Builder.defineMacro("__tune_pentium_mmx__");
2684 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002685 case CK_i586:
2686 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002687 defineCPUMacros(Builder, "i586");
2688 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002689 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 case CK_Pentium3:
2691 case CK_Pentium3M:
2692 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002693 Builder.defineMacro("__tune_pentium3__");
2694 // Fallthrough
2695 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002696 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002697 Builder.defineMacro("__tune_pentium2__");
2698 // Fallthrough
2699 case CK_PentiumPro:
2700 Builder.defineMacro("__tune_i686__");
2701 Builder.defineMacro("__tune_pentiumpro__");
2702 // Fallthrough
2703 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002704 Builder.defineMacro("__i686");
2705 Builder.defineMacro("__i686__");
2706 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2707 Builder.defineMacro("__pentiumpro");
2708 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002709 break;
2710 case CK_Pentium4:
2711 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002712 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002713 break;
2714 case CK_Yonah:
2715 case CK_Prescott:
2716 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002717 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002718 break;
2719 case CK_Core2:
2720 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002721 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002722 break;
2723 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002724 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002726 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002727 defineCPUMacros(Builder, "slm");
2728 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002729 case CK_Corei7:
2730 case CK_Corei7AVX:
2731 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002732 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002733 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002734 break;
Craig Topper449314e2013-08-20 07:09:39 +00002735 case CK_KNL:
2736 defineCPUMacros(Builder, "knl");
2737 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002738 case CK_SKX:
2739 defineCPUMacros(Builder, "skx");
2740 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002741 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002742 Builder.defineMacro("__k6_2__");
2743 Builder.defineMacro("__tune_k6_2__");
2744 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002746 if (CPU != CK_K6_2) { // In case of fallthrough
2747 // FIXME: GCC may be enabling these in cases where some other k6
2748 // architecture is specified but -m3dnow is explicitly provided. The
2749 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002750 Builder.defineMacro("__k6_3__");
2751 Builder.defineMacro("__tune_k6_3__");
2752 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002753 // Fallthrough
2754 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002755 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002756 break;
2757 case CK_Athlon:
2758 case CK_AthlonThunderbird:
2759 case CK_Athlon4:
2760 case CK_AthlonXP:
2761 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002762 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002763 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002764 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002765 Builder.defineMacro("__tune_athlon_sse__");
2766 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002767 break;
2768 case CK_K8:
2769 case CK_K8SSE3:
2770 case CK_x86_64:
2771 case CK_Opteron:
2772 case CK_OpteronSSE3:
2773 case CK_Athlon64:
2774 case CK_Athlon64SSE3:
2775 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002776 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002777 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002778 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002779 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002780 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002781 case CK_BTVER1:
2782 defineCPUMacros(Builder, "btver1");
2783 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002784 case CK_BTVER2:
2785 defineCPUMacros(Builder, "btver2");
2786 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002787 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002788 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002789 break;
2790 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002791 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002792 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002793 case CK_BDVER3:
2794 defineCPUMacros(Builder, "bdver3");
2795 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002796 case CK_BDVER4:
2797 defineCPUMacros(Builder, "bdver4");
2798 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002799 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002800 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002801 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002802 }
Chris Lattner96e43572009-03-02 22:40:39 +00002803
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002804 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002805 Builder.defineMacro("__REGISTER_PREFIX__", "");
2806
Chris Lattner6df41af2009-04-19 17:32:33 +00002807 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2808 // functions in glibc header files that use FP Stack inline asm which the
2809 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002810 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002811
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002812 if (HasAES)
2813 Builder.defineMacro("__AES__");
2814
Craig Topper3f122a72012-05-31 05:18:48 +00002815 if (HasPCLMUL)
2816 Builder.defineMacro("__PCLMUL__");
2817
Craig Topper22967d42011-12-25 05:06:45 +00002818 if (HasLZCNT)
2819 Builder.defineMacro("__LZCNT__");
2820
Benjamin Kramer1e250392012-07-07 09:39:18 +00002821 if (HasRDRND)
2822 Builder.defineMacro("__RDRND__");
2823
Craig Topper22967d42011-12-25 05:06:45 +00002824 if (HasBMI)
2825 Builder.defineMacro("__BMI__");
2826
2827 if (HasBMI2)
2828 Builder.defineMacro("__BMI2__");
2829
Craig Topper1de83482011-12-29 16:10:46 +00002830 if (HasPOPCNT)
2831 Builder.defineMacro("__POPCNT__");
2832
Michael Liao625a8752012-11-10 05:17:46 +00002833 if (HasRTM)
2834 Builder.defineMacro("__RTM__");
2835
Michael Liao74f4eaf2013-03-26 17:52:08 +00002836 if (HasPRFCHW)
2837 Builder.defineMacro("__PRFCHW__");
2838
Michael Liaoffaae352013-03-29 05:17:55 +00002839 if (HasRDSEED)
2840 Builder.defineMacro("__RDSEED__");
2841
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002842 if (HasTBM)
2843 Builder.defineMacro("__TBM__");
2844
Rafael Espindolae62e2792013-08-20 13:44:29 +00002845 switch (XOPLevel) {
2846 case XOP:
2847 Builder.defineMacro("__XOP__");
2848 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002849 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002850 case SSE4A:
2851 Builder.defineMacro("__SSE4A__");
2852 case NoXOP:
2853 break;
2854 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002855
Craig Topperbba778b2012-06-03 21:46:30 +00002856 if (HasFMA)
2857 Builder.defineMacro("__FMA__");
2858
Manman Rena45358c2012-10-11 00:59:55 +00002859 if (HasF16C)
2860 Builder.defineMacro("__F16C__");
2861
Craig Topper679b53a2013-08-21 05:29:10 +00002862 if (HasAVX512CD)
2863 Builder.defineMacro("__AVX512CD__");
2864 if (HasAVX512ER)
2865 Builder.defineMacro("__AVX512ER__");
2866 if (HasAVX512PF)
2867 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002868 if (HasAVX512DQ)
2869 Builder.defineMacro("__AVX512DQ__");
2870 if (HasAVX512BW)
2871 Builder.defineMacro("__AVX512BW__");
2872 if (HasAVX512VL)
2873 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002874
Ben Langmuir58078d02013-09-19 13:22:04 +00002875 if (HasSHA)
2876 Builder.defineMacro("__SHA__");
2877
Nick Lewycky50e8f482013-10-05 20:14:27 +00002878 if (HasCX16)
2879 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2880
Chris Lattner96e43572009-03-02 22:40:39 +00002881 // Each case falls through to the previous one here.
2882 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002883 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002884 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002885 case AVX2:
2886 Builder.defineMacro("__AVX2__");
2887 case AVX:
2888 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002889 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002890 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002891 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002892 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002893 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002894 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002895 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002896 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002897 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002898 Builder.defineMacro("__SSE2__");
2899 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002900 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002901 Builder.defineMacro("__SSE__");
2902 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002903 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002904 break;
2905 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002906
Derek Schuffc7dd7222012-10-11 15:52:22 +00002907 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002908 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002909 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002910 case AVX2:
2911 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002912 case SSE42:
2913 case SSE41:
2914 case SSSE3:
2915 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002916 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002917 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002918 break;
2919 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002920 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002921 break;
2922 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002923 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002924 }
2925 }
2926
Anders Carlssone437c682010-01-27 03:47:49 +00002927 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002928 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002929 case AMD3DNowAthlon:
2930 Builder.defineMacro("__3dNOW_A__");
2931 case AMD3DNow:
2932 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002933 case MMX:
2934 Builder.defineMacro("__MMX__");
2935 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002936 break;
2937 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002938
2939 if (CPU >= CK_i486) {
2940 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2941 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2942 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2943 }
2944 if (CPU >= CK_i586)
2945 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002946}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002947
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002948bool X86TargetInfo::hasFeature(StringRef Feature) const {
2949 return llvm::StringSwitch<bool>(Feature)
2950 .Case("aes", HasAES)
2951 .Case("avx", SSELevel >= AVX)
2952 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002953 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002954 .Case("avx512cd", HasAVX512CD)
2955 .Case("avx512er", HasAVX512ER)
2956 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002957 .Case("avx512dq", HasAVX512DQ)
2958 .Case("avx512bw", HasAVX512BW)
2959 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002960 .Case("bmi", HasBMI)
2961 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002962 .Case("cx16", HasCX16)
2963 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002964 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002965 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002966 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002967 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002968 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002969 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2970 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2971 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002972 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002973 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002974 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002975 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002976 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002977 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002978 .Case("sse", SSELevel >= SSE1)
2979 .Case("sse2", SSELevel >= SSE2)
2980 .Case("sse3", SSELevel >= SSE3)
2981 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002982 .Case("sse4.1", SSELevel >= SSE41)
2983 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002985 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002986 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2987 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002988 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002989 .Default(false);
2990}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002991
Eli Friedman3fd920a2008-08-20 02:34:37 +00002992bool
Anders Carlsson58436352009-02-28 17:11:49 +00002993X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002994 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002995 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002996 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002997 case 'Y': // first letter of a pair:
2998 switch (*(Name+1)) {
2999 default: return false;
3000 case '0': // First SSE register.
3001 case 't': // Any SSE register, when SSE2 is enabled.
3002 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3003 case 'm': // any MMX register, when inter-unit moves enabled.
3004 break; // falls through to setAllowsRegister.
3005 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003006 case 'f': // any x87 floating point stack register.
3007 // Constraint 'f' cannot be used for output operands.
3008 if (Info.ConstraintStr[0] == '=')
3009 return false;
3010
3011 Info.setAllowsRegister();
3012 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003013 case 'a': // eax.
3014 case 'b': // ebx.
3015 case 'c': // ecx.
3016 case 'd': // edx.
3017 case 'S': // esi.
3018 case 'D': // edi.
3019 case 'A': // edx:eax.
3020 case 't': // top of floating point stack.
3021 case 'u': // second from top of floating point stack.
3022 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003023 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003024 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003025 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003026 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3027 case 'l': // "Index" registers: any general register that can be used as an
3028 // index in a base+index memory access.
3029 Info.setAllowsRegister();
3030 return true;
3031 case 'C': // SSE floating point constant.
3032 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003033 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003034 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003035 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003036 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003037 return true;
3038 }
3039}
3040
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003041
Eli Friedman3fd920a2008-08-20 02:34:37 +00003042std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003043X86TargetInfo::convertConstraint(const char *&Constraint) const {
3044 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003045 case 'a': return std::string("{ax}");
3046 case 'b': return std::string("{bx}");
3047 case 'c': return std::string("{cx}");
3048 case 'd': return std::string("{dx}");
3049 case 'S': return std::string("{si}");
3050 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003051 case 'p': // address
3052 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003053 case 't': // top of floating point stack.
3054 return std::string("{st}");
3055 case 'u': // second from top of floating point stack.
3056 return std::string("{st(1)}"); // second from top of floating point stack.
3057 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003058 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003059 }
3060}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003061} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003062
3063namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003064// X86-32 generic target
3065class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003066public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003067 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003068 DoubleAlign = LongLongAlign = 32;
3069 LongDoubleWidth = 96;
3070 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003071 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003072 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003073 SizeType = UnsignedInt;
3074 PtrDiffType = SignedInt;
3075 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003076 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003077
3078 // Use fpret for all types.
3079 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3080 (1 << TargetInfo::Double) |
3081 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003082
3083 // x86-32 has atomics up to 8 bytes
3084 // FIXME: Check that we actually have cmpxchg8b before setting
3085 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3086 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003087 }
Craig Topper3164f332014-03-11 03:39:26 +00003088 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003089 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003090 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003091
Craig Topper3164f332014-03-11 03:39:26 +00003092 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003093 if (RegNo == 0) return 0;
3094 if (RegNo == 1) return 2;
3095 return -1;
3096 }
Craig Topper3164f332014-03-11 03:39:26 +00003097 bool validateInputSize(StringRef Constraint,
3098 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003099 switch (Constraint[0]) {
3100 default: break;
3101 case 'a':
3102 case 'b':
3103 case 'c':
3104 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003105 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00003106 }
3107
3108 return true;
3109 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003110};
3111} // end anonymous namespace
3112
3113namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003114class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3115public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003116 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3117 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003118
Craig Topper3164f332014-03-11 03:39:26 +00003119 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003120 unsigned Major, Minor, Micro;
3121 getTriple().getOSVersion(Major, Minor, Micro);
3122 // New NetBSD uses the default rounding mode.
3123 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3124 return X86_32TargetInfo::getFloatEvalMethod();
3125 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003126 return 1;
3127 }
3128};
3129} // end anonymous namespace
3130
3131namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003132class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003134 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3135 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003136 SizeType = UnsignedLong;
3137 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003138 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003139 }
3140};
3141} // end anonymous namespace
3142
3143namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003144class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3145public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003146 BitrigI386TargetInfo(const llvm::Triple &Triple)
3147 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003148 SizeType = UnsignedLong;
3149 IntPtrType = SignedLong;
3150 PtrDiffType = SignedLong;
3151 }
3152};
3153} // end anonymous namespace
3154
3155namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003156class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003157public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003158 DarwinI386TargetInfo(const llvm::Triple &Triple)
3159 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003160 LongDoubleWidth = 128;
3161 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003162 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003163 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003164 SizeType = UnsignedLong;
3165 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003166 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003167 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003168 }
3169
Eli Friedman3fd920a2008-08-20 02:34:37 +00003170};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003171} // end anonymous namespace
3172
3173namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003174// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003175class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003176public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003177 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3178 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003179 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003180 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003181 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003182 }
Craig Topper3164f332014-03-11 03:39:26 +00003183 void getTargetDefines(const LangOptions &Opts,
3184 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003185 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3186 }
3187};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003188
3189// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003190class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003191public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003192 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003193 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003194 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003195 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3196 }
Craig Topper3164f332014-03-11 03:39:26 +00003197 void getTargetDefines(const LangOptions &Opts,
3198 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003199 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3200 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3201 // The value of the following reflects processor type.
3202 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3203 // We lost the original triple, so we use the default.
3204 Builder.defineMacro("_M_IX86", "600");
3205 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003206};
3207} // end anonymous namespace
3208
Reid Kleckner47606832014-04-21 20:58:00 +00003209static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3210 Builder.defineMacro("__MSVCRT__");
3211 Builder.defineMacro("__MINGW32__");
3212
3213 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3214 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3215 // macro anyway for pre-processor compatibility.
3216 if (Opts.MicrosoftExt)
3217 Builder.defineMacro("__declspec", "__declspec");
3218 else
3219 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3220
3221 if (!Opts.MicrosoftExt) {
3222 // Provide macros for all the calling convention keywords. Provide both
3223 // single and double underscore prefixed variants. These are available on
3224 // x64 as well as x86, even though they have no effect.
3225 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3226 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003227 std::string GCCSpelling = "__attribute__((__";
3228 GCCSpelling += CC;
3229 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003230 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3231 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3232 }
3233 }
3234}
3235
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003236namespace {
3237// x86-32 MinGW target
3238class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003240 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3241 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003242 void getTargetDefines(const LangOptions &Opts,
3243 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003244 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003245 DefineStd(Builder, "WIN32", Opts);
3246 DefineStd(Builder, "WINNT", Opts);
3247 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003248 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003249 }
3250};
3251} // end anonymous namespace
3252
3253namespace {
3254// x86-32 Cygwin target
3255class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3256public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003257 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3258 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003259 TLSSupported = false;
3260 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003261 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003262 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003263 }
Craig Topper3164f332014-03-11 03:39:26 +00003264 void getTargetDefines(const LangOptions &Opts,
3265 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003266 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003267 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003268 Builder.defineMacro("__CYGWIN__");
3269 Builder.defineMacro("__CYGWIN32__");
3270 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003271 if (Opts.CPlusPlus)
3272 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003273 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003274};
3275} // end anonymous namespace
3276
3277namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003278// x86-32 Haiku target
3279class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3280public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003281 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003282 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003283 IntPtrType = SignedLong;
3284 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003285 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003286 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003287 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003288 }
Craig Topper3164f332014-03-11 03:39:26 +00003289 void getTargetDefines(const LangOptions &Opts,
3290 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003291 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3292 Builder.defineMacro("__INTEL__");
3293 Builder.defineMacro("__HAIKU__");
3294 }
3295};
3296} // end anonymous namespace
3297
Douglas Gregor9fabd852011-07-01 22:41:14 +00003298// RTEMS Target
3299template<typename Target>
3300class RTEMSTargetInfo : public OSTargetInfo<Target> {
3301protected:
Craig Topper3164f332014-03-11 03:39:26 +00003302 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3303 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003304 // RTEMS defines; list based off of gcc output
3305
Douglas Gregor9fabd852011-07-01 22:41:14 +00003306 Builder.defineMacro("__rtems__");
3307 Builder.defineMacro("__ELF__");
3308 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003309
Douglas Gregor9fabd852011-07-01 22:41:14 +00003310public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003311 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3312 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003313
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003314 switch (Triple.getArch()) {
3315 default:
3316 case llvm::Triple::x86:
3317 // this->MCountName = ".mcount";
3318 break;
3319 case llvm::Triple::mips:
3320 case llvm::Triple::mipsel:
3321 case llvm::Triple::ppc:
3322 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003323 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003324 // this->MCountName = "_mcount";
3325 break;
3326 case llvm::Triple::arm:
3327 // this->MCountName = "__mcount";
3328 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003329 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003330 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003331};
3332
3333namespace {
3334// x86-32 RTEMS target
3335class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003337 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003338 SizeType = UnsignedLong;
3339 IntPtrType = SignedLong;
3340 PtrDiffType = SignedLong;
3341 this->UserLabelPrefix = "";
3342 }
Craig Topper3164f332014-03-11 03:39:26 +00003343 void getTargetDefines(const LangOptions &Opts,
3344 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003345 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3346 Builder.defineMacro("__INTEL__");
3347 Builder.defineMacro("__rtems__");
3348 }
3349};
3350} // end anonymous namespace
3351
Chris Lattnerb986aba2010-04-11 19:29:39 +00003352namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003353// x86-64 generic target
3354class X86_64TargetInfo : public X86TargetInfo {
3355public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003356 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003357 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003358 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003359 LongDoubleWidth = 128;
3360 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003361 LargeArrayMinWidth = 128;
3362 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003363 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003364 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3365 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3366 IntPtrType = IsX32 ? SignedInt : SignedLong;
3367 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003368 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003369 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003370
Zinovy Nis1db95732014-07-10 15:27:19 +00003371 DescriptionString = (IsX32)
3372 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3373 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003374
3375 // Use fpret only for long double.
3376 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003377
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003378 // Use fp2ret for _Complex long double.
3379 ComplexLongDoubleUsesFP2Ret = true;
3380
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003381 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003382 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003383 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003384 }
Craig Topper3164f332014-03-11 03:39:26 +00003385 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003386 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003387 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003388
Craig Topper3164f332014-03-11 03:39:26 +00003389 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003390 if (RegNo == 0) return 0;
3391 if (RegNo == 1) return 1;
3392 return -1;
3393 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003394
Craig Topper3164f332014-03-11 03:39:26 +00003395 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003396 return (CC == CC_C ||
3397 CC == CC_IntelOclBicc ||
3398 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003399 }
3400
Craig Topper3164f332014-03-11 03:39:26 +00003401 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003402 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003403 }
3404
Eli Friedman3fd920a2008-08-20 02:34:37 +00003405};
3406} // end anonymous namespace
3407
3408namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003409// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003410class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003411public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003412 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3413 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003414 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003415 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003416 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003417 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003418 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003419 SizeType = UnsignedLongLong;
3420 PtrDiffType = SignedLongLong;
3421 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003422 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003423 }
Craig Topper3164f332014-03-11 03:39:26 +00003424 void getTargetDefines(const LangOptions &Opts,
3425 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003426 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003427 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003428 }
Craig Topper3164f332014-03-11 03:39:26 +00003429 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003430 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003431 }
Craig Topper3164f332014-03-11 03:39:26 +00003432 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003433 return (CC == CC_C ||
3434 CC == CC_IntelOclBicc ||
3435 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3436 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003437};
3438} // end anonymous namespace
3439
3440namespace {
3441// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003442class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003443public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003444 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003445 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003446 LongDoubleWidth = LongDoubleAlign = 64;
3447 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003448 }
Craig Topper3164f332014-03-11 03:39:26 +00003449 void getTargetDefines(const LangOptions &Opts,
3450 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003451 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3452 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003453 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003454 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003455 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003456};
3457} // end anonymous namespace
3458
3459namespace {
3460// x86-64 MinGW target
3461class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3462public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003463 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3464 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003465 void getTargetDefines(const LangOptions &Opts,
3466 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003467 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003468 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003469 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003470 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003471 }
3472};
3473} // end anonymous namespace
3474
3475namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003476class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3477public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003478 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3479 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003480 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003481 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003482 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3483 llvm::Triple T = llvm::Triple(Triple);
3484 if (T.getOS() == llvm::Triple::IOS)
3485 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003486 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003487 }
3488};
3489} // end anonymous namespace
3490
3491namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003492class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003494 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3495 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003496 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003497 Int64Type = SignedLongLong;
3498 }
3499};
3500} // end anonymous namespace
3501
3502namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003503class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003505 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3506 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3507 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003508 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003509 }
3510};
Tim Northover9bb857a2013-01-31 12:13:10 +00003511}
3512
Eli Friedman9fa28852012-08-08 23:57:20 +00003513
3514namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003515class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003516 // Possible FPU choices.
3517 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003518 VFP2FPU = (1 << 0),
3519 VFP3FPU = (1 << 1),
3520 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003521 NeonFPU = (1 << 3),
3522 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003523 };
3524
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003525 // Possible HWDiv features.
3526 enum HWDivMode {
3527 HWDivThumb = (1 << 0),
3528 HWDivARM = (1 << 1)
3529 };
3530
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003531 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003532 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003533 }
3534
3535 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3536 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003537
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003538 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003539
Rafael Espindolaeb265472013-08-21 21:59:03 +00003540 enum {
3541 FP_Default,
3542 FP_VFP,
3543 FP_Neon
3544 } FPMath;
3545
Bernard Ogdenda13af32013-10-24 18:32:51 +00003546 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003547
Logan Chien57086ce2012-10-10 06:56:20 +00003548 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003549 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003550 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003551
3552 // Initialized via features.
3553 unsigned SoftFloat : 1;
3554 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003555
Bernard Ogden18b57012013-10-29 09:47:51 +00003556 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003557 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003558
Chris Lattner5cc15e02010-03-03 19:03:45 +00003559 static const Builtin::Info BuiltinInfo[];
3560
Rafael Espindola101d5b92013-05-13 20:09:47 +00003561 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003562 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003563 if (T.getArch() == llvm::Triple::arm ||
3564 T.getArch() == llvm::Triple::armeb) {
3565 StringRef VersionStr;
3566 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003567 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003568 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003569 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003570 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003571 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003572 unsigned Version;
3573 if (VersionStr.getAsInteger(10, Version))
3574 return false;
3575 return Version >= 6;
3576 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003577 assert(T.getArch() == llvm::Triple::thumb ||
3578 T.getArch() == llvm::Triple::thumbeb);
3579 StringRef VersionStr;
3580 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003581 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003582 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003583 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003584 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003585 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003586 unsigned Version;
3587 if (VersionStr.getAsInteger(10, Version))
3588 return false;
3589 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003590 }
3591
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003592 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003593 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003594
3595 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003596 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003597
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003598 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003599 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003600 SizeType = UnsignedLong;
3601 else
3602 SizeType = UnsignedInt;
3603
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003604 switch (T.getOS()) {
3605 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003606 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003607 break;
3608 case llvm::Triple::Win32:
3609 WCharType = UnsignedShort;
3610 break;
3611 case llvm::Triple::Linux:
3612 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003613 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3614 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003615 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003616 }
3617
3618 UseBitFieldTypeAlignment = true;
3619
3620 ZeroLengthBitfieldBoundary = 0;
3621
3622 if (IsThumb) {
3623 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3624 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003625 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003626 DescriptionString = BigEndian ?
3627 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3628 "v128:64:128-a:0:32-n32-S64" :
3629 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3630 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003631 } else if (T.isOSWindows()) {
3632 // FIXME: this is invalid for WindowsCE
3633 assert(!BigEndian && "Windows on ARM does not support big endian");
3634 DescriptionString = "e"
3635 "-m:e"
3636 "-p:32:32"
3637 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3638 "-v128:64:128"
3639 "-a:0:32"
3640 "-n32"
3641 "-S64";
3642 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003643 DescriptionString = BigEndian ?
3644 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3645 "v128:64:128-a:0:32-n32-S64" :
3646 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3647 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003648 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003649 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003650 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003651 DescriptionString = BigEndian ?
3652 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3653 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003654 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003655 DescriptionString = BigEndian ?
3656 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3657 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003658 }
3659
3660 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003661 }
3662
3663 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003664 const llvm::Triple &T = getTriple();
3665
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003666 IsAAPCS = false;
3667
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003668 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003669
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003670 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003671 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003672 SizeType = UnsignedInt;
3673 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003674 SizeType = UnsignedLong;
3675
3676 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3677 WCharType = SignedInt;
3678
3679 // Do not respect the alignment of bit-field types when laying out
3680 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3681 UseBitFieldTypeAlignment = false;
3682
3683 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3684 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3685 /// gcc.
3686 ZeroLengthBitfieldBoundary = 32;
3687
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003688 if (IsThumb) {
3689 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3690 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003691 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003692 DescriptionString = BigEndian ?
3693 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3694 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3695 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3696 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003697 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003698 DescriptionString = BigEndian ?
3699 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3700 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3701 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3702 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003703 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003704 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003705 DescriptionString = BigEndian ?
3706 "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 +00003707 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3708 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003709 DescriptionString = BigEndian ?
3710 "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 +00003711 "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 +00003712 }
3713
3714 // FIXME: Override "preferred align" for double and long long.
3715 }
3716
Chris Lattner17df24e2008-04-21 18:56:49 +00003717public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003718 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003719 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3720 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003721 BigEndian = IsBigEndian;
3722
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003723 switch (getTriple().getOS()) {
3724 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003725 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003726 break;
3727 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003728 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003729 break;
3730 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003731
Chris Lattner1a8f3942010-04-23 16:29:58 +00003732 // {} in inline assembly are neon specifiers, not assembly variant
3733 // specifiers.
3734 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003735
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003736 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003737 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003738
3739 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003740
3741 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003742 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003743
3744 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003745 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003746 if (shouldUseInlineAtomic(getTriple()))
3747 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003748
3749 // Do force alignment of members that follow zero length bitfields. If
3750 // the alignment of the zero-length bitfield is greater than the member
3751 // that follows it, `bar', `bar' will be aligned as the type of the
3752 // zero length bitfield.
3753 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003754 }
Alp Toker4925ba72014-06-07 23:30:42 +00003755 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003756 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003757 ABI = Name;
3758
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003759 // The defaults (above) are for AAPCS, check if we need to change them.
3760 //
3761 // FIXME: We need support for -meabi... we could just mangle it into the
3762 // name.
3763 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003764 setABIAPCS();
3765 return true;
3766 }
3767 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3768 setABIAAPCS();
3769 return true;
3770 }
3771 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003772 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003773
Craig Topper3164f332014-03-11 03:39:26 +00003774 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003775 if (IsAAPCS)
3776 Features["aapcs"] = true;
3777 else
3778 Features["apcs"] = true;
3779
Silviu Barangae5690462013-10-21 10:59:33 +00003780 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003781 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3782 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003783 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3784 CPU == "cortex-a9-mp") {
3785 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003786 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003787 }
3788 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003789 Features["vfp4"] = true;
3790 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003791 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3792 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3793 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003794 Features["vfp4"] = true;
3795 Features["neon"] = true;
3796 Features["hwdiv"] = true;
3797 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003798 } else if (CPU == "cyclone") {
3799 Features["v8fp"] = true;
3800 Features["neon"] = true;
3801 Features["hwdiv"] = true;
3802 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003803 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3804 Features["fp-armv8"] = true;
3805 Features["neon"] = true;
3806 Features["hwdiv"] = true;
3807 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003808 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003809 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003810 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003811 // Enable the hwdiv extension for all v8a AArch32 cores by
3812 // default.
3813 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003814 ArchName == "armebv8a" || ArchName == "armebv8" ||
3815 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3816 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003817 Features["hwdiv"] = true;
3818 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003819 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3820 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003821 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003822 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003823
Craig Topper3164f332014-03-11 03:39:26 +00003824 bool handleTargetFeatures(std::vector<std::string> &Features,
3825 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003826 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003827 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003828 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003829 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003830 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003831 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3832 if (Features[i] == "+soft-float")
3833 SoftFloat = true;
3834 else if (Features[i] == "+soft-float-abi")
3835 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003836 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003837 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003838 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003839 FPU |= VFP3FPU;
3840 else if (Features[i] == "+vfp4")
3841 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003842 else if (Features[i] == "+fp-armv8")
3843 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003844 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003845 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003846 else if (Features[i] == "+hwdiv")
3847 HWDiv |= HWDivThumb;
3848 else if (Features[i] == "+hwdiv-arm")
3849 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003850 else if (Features[i] == "+crc")
3851 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003852 else if (Features[i] == "+crypto")
3853 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003854 }
3855
Rafael Espindolaeb265472013-08-21 21:59:03 +00003856 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3857 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3858 return false;
3859 }
3860
3861 if (FPMath == FP_Neon)
3862 Features.push_back("+neonfp");
3863 else if (FPMath == FP_VFP)
3864 Features.push_back("-neonfp");
3865
Daniel Dunbar893d4752009-12-19 04:15:38 +00003866 // Remove front-end specific options which the backend handles differently.
3867 std::vector<std::string>::iterator it;
3868 it = std::find(Features.begin(), Features.end(), "+soft-float");
3869 if (it != Features.end())
3870 Features.erase(it);
3871 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3872 if (it != Features.end())
3873 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003874 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003875 }
3876
Craig Topper3164f332014-03-11 03:39:26 +00003877 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003878 return llvm::StringSwitch<bool>(Feature)
3879 .Case("arm", true)
3880 .Case("softfloat", SoftFloat)
3881 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003882 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003883 .Case("hwdiv", HWDiv & HWDivThumb)
3884 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003885 .Default(false);
3886 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003887 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003888 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003889 return llvm::StringSwitch<const char*>(Name)
3890 .Cases("arm8", "arm810", "4")
3891 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3892 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3893 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3894 .Case("ep9312", "4T")
3895 .Cases("arm10tdmi", "arm1020t", "5T")
3896 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3897 .Case("arm926ej-s", "5TEJ")
3898 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3899 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003900 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003901 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003902 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003903 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003904 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003905 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003906 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003907 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003908 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003909 .Case("cortex-m3", "7M")
3910 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003911 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003912 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003913 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003914 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003915 static const char *getCPUProfile(StringRef Name) {
3916 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003917 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003918 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003919 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003920 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003921 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003922 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003923 }
Craig Topper3164f332014-03-11 03:39:26 +00003924 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003925 if (!getCPUDefineSuffix(Name))
3926 return false;
3927
Tim Northovere8c37212014-07-09 09:24:43 +00003928 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3929 StringRef Profile = getCPUProfile(Name);
3930 if (Profile == "M" && MaxAtomicInlineWidth) {
3931 MaxAtomicPromoteWidth = 32;
3932 MaxAtomicInlineWidth = 32;
3933 }
3934
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003935 CPU = Name;
3936 return true;
3937 }
Craig Topper3164f332014-03-11 03:39:26 +00003938 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003939 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3940 unsigned CPUArchVer) const {
3941 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3942 (CPUArch.find('M') != StringRef::npos);
3943 }
3944 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3945 unsigned CPUArchVer) const {
3946 // We check both CPUArchVer and ArchName because when only triple is
3947 // specified, the default CPU is arm1136j-s.
3948 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3949 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3950 }
Craig Topper3164f332014-03-11 03:39:26 +00003951 void getTargetDefines(const LangOptions &Opts,
3952 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00003953 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003954 Builder.defineMacro("__arm");
3955 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003956
Chris Lattnerecd49032009-03-02 22:27:17 +00003957 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003959
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003960 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003961 unsigned int CPUArchVer;
3962 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3963 llvm_unreachable("Invalid char for architecture version number");
3964 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003965 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003966
3967 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003968 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003969 StringRef ArchName = getTriple().getArchName();
3970
3971 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3972 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3973
3974 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3975 // is not defined for the M-profile.
3976 // NOTE that the deffault profile is assumed to be 'A'
3977 if (CPUProfile.empty() || CPUProfile != "M")
3978 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3979
3980 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3981 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3982 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3983 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3984 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3985 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3986 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3987
3988 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3989 // instruction set such as ARM or Thumb.
3990 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3991
3992 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3993
3994 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003995 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003996 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003997
Yi Konga44c4d72014-06-27 21:25:42 +00003998 // ACLE predefines.
3999 Builder.defineMacro("__ARM_ACLE", "200");
4000
Mike Stump9d54bd72009-04-08 02:07:04 +00004001 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004002
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004003 // FIXME: It's more complicated than this and we don't really support
4004 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004005 // Windows on ARM does not "support" interworking
4006 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004007 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004008
David Tweed8f676532012-10-25 13:33:01 +00004009 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004010 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004011 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4012 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004013 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004014 Builder.defineMacro("__ARM_PCS", "1");
4015
David Tweed8f676532012-10-25 13:33:01 +00004016 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004017 Builder.defineMacro("__ARM_PCS_VFP", "1");
4018 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004019
Daniel Dunbar893d4752009-12-19 04:15:38 +00004020 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004021 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004022
4023 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004024 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004025
4026 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004027 Builder.defineMacro("__THUMBEL__");
4028 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004029 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004030 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004031 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004032 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4033 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004034
4035 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004036 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004037
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004038 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004039 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004040 if (FPU & VFP2FPU)
4041 Builder.defineMacro("__ARM_VFPV2__");
4042 if (FPU & VFP3FPU)
4043 Builder.defineMacro("__ARM_VFPV3__");
4044 if (FPU & VFP4FPU)
4045 Builder.defineMacro("__ARM_VFPV4__");
4046 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004047
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004048 // This only gets set when Neon instructions are actually available, unlike
4049 // the VFP define, hence the soft float and arch check. This is subtly
4050 // different from gcc, we follow the intent which was that it should be set
4051 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004052 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4053 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004054 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004055 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004056
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004057 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4058 Opts.ShortWChar ? "2" : "4");
4059
4060 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4061 Opts.ShortEnums ? "1" : "4");
4062
Bernard Ogden18b57012013-10-29 09:47:51 +00004063 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004064 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004065
Tim Northover02e38602014-02-03 17:28:04 +00004066 if (Crypto)
4067 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4068
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004069 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004070 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4071 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4072 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4073 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4074 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004075 }
Craig Topper3164f332014-03-11 03:39:26 +00004076 void getTargetBuiltins(const Builtin::Info *&Records,
4077 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004078 Records = BuiltinInfo;
4079 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004080 }
Craig Topper3164f332014-03-11 03:39:26 +00004081 bool isCLZForZeroUndef() const override { return false; }
4082 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004083 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004084 }
Craig Topper3164f332014-03-11 03:39:26 +00004085 void getGCCRegNames(const char * const *&Names,
4086 unsigned &NumNames) const override;
4087 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4088 unsigned &NumAliases) const override;
4089 bool validateAsmConstraint(const char *&Name,
4090 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004091 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004092 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004093 case 'l': // r0-r7
4094 case 'h': // r8-r15
4095 case 'w': // VFP Floating point register single precision
4096 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004097 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004098 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004099 case 'Q': // A memory address that is a single base register.
4100 Info.setAllowsMemory();
4101 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004102 case 'U': // a memory reference...
4103 switch (Name[1]) {
4104 case 'q': // ...ARMV4 ldrsb
4105 case 'v': // ...VFP load/store (reg+constant offset)
4106 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004107 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004108 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004109 case 'n': // valid address for Neon doubleword vector load/store
4110 case 'm': // valid address for Neon element and structure load/store
4111 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004112 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004113 Info.setAllowsMemory();
4114 Name++;
4115 return true;
4116 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004117 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004118 return false;
4119 }
Craig Topper3164f332014-03-11 03:39:26 +00004120 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004121 std::string R;
4122 switch (*Constraint) {
4123 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004124 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004125 Constraint++;
4126 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004127 case 'p': // 'p' should be translated to 'r' by default.
4128 R = std::string("r");
4129 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004130 default:
4131 return std::string(1, *Constraint);
4132 }
4133 return R;
4134 }
Craig Topper3164f332014-03-11 03:39:26 +00004135 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4136 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004137 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004138 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004139
Bill Wendling9d1ee112012-10-25 23:28:48 +00004140 // Strip off constraint modifiers.
4141 while (Constraint[0] == '=' ||
4142 Constraint[0] == '+' ||
4143 Constraint[0] == '&')
4144 Constraint = Constraint.substr(1);
4145
4146 switch (Constraint[0]) {
4147 default: break;
4148 case 'r': {
4149 switch (Modifier) {
4150 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004151 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004152 case 'q':
4153 // A register of size 32 cannot fit a vector type.
4154 return false;
4155 }
4156 }
4157 }
4158
4159 return true;
4160 }
Craig Topper3164f332014-03-11 03:39:26 +00004161 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004162 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004163 return "";
4164 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004165
Craig Topper3164f332014-03-11 03:39:26 +00004166 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004167 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4168 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004169
Craig Topper3164f332014-03-11 03:39:26 +00004170 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004171 if (RegNo == 0) return 0;
4172 if (RegNo == 1) return 1;
4173 return -1;
4174 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004175};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004176
Rafael Espindolaeb265472013-08-21 21:59:03 +00004177bool ARMTargetInfo::setFPMath(StringRef Name) {
4178 if (Name == "neon") {
4179 FPMath = FP_Neon;
4180 return true;
4181 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4182 Name == "vfp4") {
4183 FPMath = FP_VFP;
4184 return true;
4185 }
4186 return false;
4187}
4188
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004189const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004190 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004191 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004192 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4193
4194 // Float registers
4195 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4196 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4197 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004198 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004199
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004200 // Double registers
4201 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4202 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004203 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4204 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004205
4206 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004207 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4208 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004209};
4210
4211void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004212 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004213 Names = GCCRegNames;
4214 NumNames = llvm::array_lengthof(GCCRegNames);
4215}
4216
4217const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004218 { { "a1" }, "r0" },
4219 { { "a2" }, "r1" },
4220 { { "a3" }, "r2" },
4221 { { "a4" }, "r3" },
4222 { { "v1" }, "r4" },
4223 { { "v2" }, "r5" },
4224 { { "v3" }, "r6" },
4225 { { "v4" }, "r7" },
4226 { { "v5" }, "r8" },
4227 { { "v6", "rfp" }, "r9" },
4228 { { "sl" }, "r10" },
4229 { { "fp" }, "r11" },
4230 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004231 { { "r13" }, "sp" },
4232 { { "r14" }, "lr" },
4233 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004234 // The S, D and Q registers overlap, but aren't really aliases; we
4235 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004236};
4237
4238void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4239 unsigned &NumAliases) const {
4240 Aliases = GCCRegAliases;
4241 NumAliases = llvm::array_lengthof(GCCRegAliases);
4242}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004243
4244const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004245#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004246#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004247 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004248#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004249
4250#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004251#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004252#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4253 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004254#include "clang/Basic/BuiltinsARM.def"
4255};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004256
4257class ARMleTargetInfo : public ARMTargetInfo {
4258public:
4259 ARMleTargetInfo(const llvm::Triple &Triple)
4260 : ARMTargetInfo(Triple, false) { }
4261 virtual void getTargetDefines(const LangOptions &Opts,
4262 MacroBuilder &Builder) const {
4263 Builder.defineMacro("__ARMEL__");
4264 ARMTargetInfo::getTargetDefines(Opts, Builder);
4265 }
4266};
4267
4268class ARMbeTargetInfo : public ARMTargetInfo {
4269public:
4270 ARMbeTargetInfo(const llvm::Triple &Triple)
4271 : ARMTargetInfo(Triple, true) { }
4272 virtual void getTargetDefines(const LangOptions &Opts,
4273 MacroBuilder &Builder) const {
4274 Builder.defineMacro("__ARMEB__");
4275 Builder.defineMacro("__ARM_BIG_ENDIAN");
4276 ARMTargetInfo::getTargetDefines(Opts, Builder);
4277 }
4278};
Chris Lattner17df24e2008-04-21 18:56:49 +00004279} // end anonymous namespace.
4280
Eli Friedmanf05b7722008-08-20 07:44:10 +00004281namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004282class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4283 const llvm::Triple Triple;
4284public:
4285 WindowsARMTargetInfo(const llvm::Triple &Triple)
4286 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4287 TLSSupported = false;
4288 WCharType = UnsignedShort;
4289 SizeType = UnsignedInt;
4290 UserLabelPrefix = "";
4291 }
4292 void getVisualStudioDefines(const LangOptions &Opts,
4293 MacroBuilder &Builder) const {
4294 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4295
4296 // FIXME: this is invalid for WindowsCE
4297 Builder.defineMacro("_M_ARM_NT", "1");
4298 Builder.defineMacro("_M_ARMT", "_M_ARM");
4299 Builder.defineMacro("_M_THUMB", "_M_ARM");
4300
4301 assert((Triple.getArch() == llvm::Triple::arm ||
4302 Triple.getArch() == llvm::Triple::thumb) &&
4303 "invalid architecture for Windows ARM target info");
4304 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4305 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4306
4307 // TODO map the complete set of values
4308 // 31: VFPv3 40: VFPv4
4309 Builder.defineMacro("_M_ARM_FP", "31");
4310 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004311 BuiltinVaListKind getBuiltinVaListKind() const override {
4312 return TargetInfo::CharPtrBuiltinVaList;
4313 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004314};
4315
4316// Windows ARM + Itanium C++ ABI Target
4317class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4318public:
4319 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4320 : WindowsARMTargetInfo(Triple) {
4321 TheCXXABI.set(TargetCXXABI::GenericARM);
4322 }
4323
4324 void getTargetDefines(const LangOptions &Opts,
4325 MacroBuilder &Builder) const override {
4326 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4327
4328 if (Opts.MSVCCompat)
4329 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4330 }
4331};
4332
4333// Windows ARM, MS (C++) ABI
4334class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4335public:
4336 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4337 : WindowsARMTargetInfo(Triple) {
4338 TheCXXABI.set(TargetCXXABI::Microsoft);
4339 }
4340
4341 void getTargetDefines(const LangOptions &Opts,
4342 MacroBuilder &Builder) const override {
4343 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4344 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4345 }
4346};
4347}
4348
4349
4350namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004351class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004352 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004353protected:
Craig Topper3164f332014-03-11 03:39:26 +00004354 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4355 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004356 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004357 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004358
Torok Edwinb2b37c62009-06-30 17:10:35 +00004359public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004360 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004361 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004362 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004363 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004364 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004365 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004366
4367 // Darwin on iOS uses a variant of the ARM C++ ABI.
4368 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004369 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004370};
4371} // end anonymous namespace.
4372
Tony Linthicum76329bf2011-12-12 21:14:55 +00004373
4374namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004375class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004376 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004377 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4378 static const char *const GCCRegNames[];
4379
James Molloy75f5f9e2014-04-16 15:33:48 +00004380 enum FPUModeEnum {
4381 FPUMode,
4382 NeonMode
4383 };
4384
4385 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004386 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004387 unsigned Crypto;
4388
Tim Northovera2ee4332014-03-29 15:09:45 +00004389 static const Builtin::Info BuiltinInfo[];
4390
4391 std::string ABI;
4392
4393public:
Tim Northover573cbee2014-05-24 12:52:07 +00004394 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004395 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004396
4397 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4398 WCharType = SignedInt;
4399
4400 // NetBSD apparently prefers consistency across ARM targets to consistency
4401 // across 64-bit targets.
4402 Int64Type = SignedLongLong;
4403 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004404 } else {
4405 WCharType = UnsignedInt;
4406 Int64Type = SignedLong;
4407 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004408 }
4409
Tim Northovera2ee4332014-03-29 15:09:45 +00004410 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004411 MaxVectorAlign = 128;
4412 RegParmMax = 8;
4413 MaxAtomicInlineWidth = 128;
4414 MaxAtomicPromoteWidth = 128;
4415
4416 LongDoubleWidth = LongDoubleAlign = 128;
4417 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4418
Tim Northovera2ee4332014-03-29 15:09:45 +00004419 // {} in inline assembly are neon specifiers, not assembly variant
4420 // specifiers.
4421 NoAsmVariants = true;
4422
Tim Northover573cbee2014-05-24 12:52:07 +00004423 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004424 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4425 }
4426
Alp Toker4925ba72014-06-07 23:30:42 +00004427 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004428 virtual bool setABI(const std::string &Name) {
4429 if (Name != "aapcs" && Name != "darwinpcs")
4430 return false;
4431
4432 ABI = Name;
4433 return true;
4434 }
4435
4436 virtual bool setCPU(const std::string &Name) {
4437 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004438 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004439 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004440 .Case("cyclone", true)
4441 .Default(false);
4442 return CPUKnown;
4443 }
4444
4445 virtual void getTargetDefines(const LangOptions &Opts,
4446 MacroBuilder &Builder) const {
4447 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004448 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004449
4450 // Target properties.
4451 Builder.defineMacro("_LP64");
4452 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004453
4454 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4455 Builder.defineMacro("__ARM_ACLE", "200");
4456 Builder.defineMacro("__ARM_ARCH", "8");
4457 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4458
4459 Builder.defineMacro("__ARM_64BIT_STATE");
4460 Builder.defineMacro("__ARM_PCS_AAPCS64");
4461 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4462
4463 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4464 Builder.defineMacro("__ARM_FEATURE_CLZ");
4465 Builder.defineMacro("__ARM_FEATURE_FMA");
4466 Builder.defineMacro("__ARM_FEATURE_DIV");
4467
4468 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4469
4470 // 0xe implies support for half, single and double precision operations.
4471 Builder.defineMacro("__ARM_FP", "0xe");
4472
4473 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4474 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4475 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4476
4477 if (Opts.FastMath || Opts.FiniteMathOnly)
4478 Builder.defineMacro("__ARM_FP_FAST");
4479
4480 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4481 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4482
4483 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4484
4485 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4486 Opts.ShortEnums ? "1" : "4");
4487
James Molloy75f5f9e2014-04-16 15:33:48 +00004488 if (FPU == NeonMode) {
4489 Builder.defineMacro("__ARM_NEON");
4490 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004491 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004492 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004493
Bradley Smith418c5932014-05-02 15:17:51 +00004494 if (CRC)
4495 Builder.defineMacro("__ARM_FEATURE_CRC32");
4496
James Molloy75f5f9e2014-04-16 15:33:48 +00004497 if (Crypto)
4498 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004499 }
4500
4501 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4502 unsigned &NumRecords) const {
4503 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004504 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004505 }
4506
4507 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004508 return Feature == "aarch64" ||
4509 Feature == "arm64" ||
4510 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004511 }
4512
James Molloy5e73df52014-04-16 15:06:20 +00004513 bool handleTargetFeatures(std::vector<std::string> &Features,
4514 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004515 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004516 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004517 Crypto = 0;
4518 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4519 if (Features[i] == "+neon")
4520 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004521 if (Features[i] == "+crc")
4522 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004523 if (Features[i] == "+crypto")
4524 Crypto = 1;
4525 }
4526
James Molloy5e73df52014-04-16 15:06:20 +00004527 setDescriptionString();
4528
4529 return true;
4530 }
4531
Tim Northovera2ee4332014-03-29 15:09:45 +00004532 virtual bool isCLZForZeroUndef() const { return false; }
4533
4534 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4535 return TargetInfo::AArch64ABIBuiltinVaList;
4536 }
4537
4538 virtual void getGCCRegNames(const char *const *&Names,
4539 unsigned &NumNames) const;
4540 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4541 unsigned &NumAliases) const;
4542
4543 virtual bool validateAsmConstraint(const char *&Name,
4544 TargetInfo::ConstraintInfo &Info) const {
4545 switch (*Name) {
4546 default:
4547 return false;
4548 case 'w': // Floating point and SIMD registers (V0-V31)
4549 Info.setAllowsRegister();
4550 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004551 case 'I': // Constant that can be used with an ADD instruction
4552 case 'J': // Constant that can be used with a SUB instruction
4553 case 'K': // Constant that can be used with a 32-bit logical instruction
4554 case 'L': // Constant that can be used with a 64-bit logical instruction
4555 case 'M': // Constant that can be used as a 32-bit MOV immediate
4556 case 'N': // Constant that can be used as a 64-bit MOV immediate
4557 case 'Y': // Floating point constant zero
4558 case 'Z': // Integer constant zero
4559 return true;
4560 case 'Q': // A memory reference with base register and no offset
4561 Info.setAllowsMemory();
4562 return true;
4563 case 'S': // A symbolic address
4564 Info.setAllowsRegister();
4565 return true;
4566 case 'U':
4567 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4568 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4569 // Usa: An absolute symbolic address
4570 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4571 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004572 case 'z': // Zero register, wzr or xzr
4573 Info.setAllowsRegister();
4574 return true;
4575 case 'x': // Floating point and SIMD registers (V0-V15)
4576 Info.setAllowsRegister();
4577 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004578 }
4579 return false;
4580 }
4581
James Molloy8a157bf2014-07-25 10:19:47 +00004582 virtual bool validateConstraintModifier(StringRef Constraint,
4583 const char Modifier,
4584 unsigned Size) const {
4585 // Strip off constraint modifiers.
4586 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4587 Constraint = Constraint.substr(1);
4588
4589 switch (Constraint[0]) {
4590 default:
4591 return true;
4592 case 'z':
4593 case 'r': {
4594 switch (Modifier) {
4595 case 'x':
4596 case 'w':
4597 // For now assume that the person knows what they're
4598 // doing with the modifier.
4599 return true;
4600 default:
4601 // By default an 'r' constraint will be in the 'x'
4602 // registers.
4603 return Size == 64;
4604 }
4605 }
4606 }
4607 }
4608
Tim Northovera2ee4332014-03-29 15:09:45 +00004609 virtual const char *getClobbers() const { return ""; }
4610
4611 int getEHDataRegisterNumber(unsigned RegNo) const {
4612 if (RegNo == 0)
4613 return 0;
4614 if (RegNo == 1)
4615 return 1;
4616 return -1;
4617 }
4618};
4619
Tim Northover573cbee2014-05-24 12:52:07 +00004620const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004621 // 32-bit Integer registers
4622 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4623 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4624 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4625
4626 // 64-bit Integer registers
4627 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4628 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4629 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4630
4631 // 32-bit floating point regsisters
4632 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4633 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4634 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4635
4636 // 64-bit floating point regsisters
4637 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4638 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4639 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4640
4641 // Vector registers
4642 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4643 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4644 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4645};
4646
Tim Northover573cbee2014-05-24 12:52:07 +00004647void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004648 unsigned &NumNames) const {
4649 Names = GCCRegNames;
4650 NumNames = llvm::array_lengthof(GCCRegNames);
4651}
4652
Tim Northover573cbee2014-05-24 12:52:07 +00004653const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004654 { { "w31" }, "wsp" },
4655 { { "x29" }, "fp" },
4656 { { "x30" }, "lr" },
4657 { { "x31" }, "sp" },
4658 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4659 // don't want to substitute one of these for a different-sized one.
4660};
4661
Tim Northover573cbee2014-05-24 12:52:07 +00004662void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004663 unsigned &NumAliases) const {
4664 Aliases = GCCRegAliases;
4665 NumAliases = llvm::array_lengthof(GCCRegAliases);
4666}
4667
Tim Northover573cbee2014-05-24 12:52:07 +00004668const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004669#define BUILTIN(ID, TYPE, ATTRS) \
4670 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4671#include "clang/Basic/BuiltinsNEON.def"
4672
4673#define BUILTIN(ID, TYPE, ATTRS) \
4674 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004675#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004676};
James Molloy5e73df52014-04-16 15:06:20 +00004677
Tim Northover573cbee2014-05-24 12:52:07 +00004678class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004679 void setDescriptionString() override {
4680 if (getTriple().isOSBinFormatMachO())
4681 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4682 else
4683 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4684 }
4685
4686public:
Tim Northover573cbee2014-05-24 12:52:07 +00004687 AArch64leTargetInfo(const llvm::Triple &Triple)
4688 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004689 BigEndian = false;
4690 }
4691 void getTargetDefines(const LangOptions &Opts,
4692 MacroBuilder &Builder) const override {
4693 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004694 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004695 }
4696};
4697
Tim Northover573cbee2014-05-24 12:52:07 +00004698class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004699 void setDescriptionString() override {
4700 assert(!getTriple().isOSBinFormatMachO());
4701 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4702 }
4703
4704public:
Tim Northover573cbee2014-05-24 12:52:07 +00004705 AArch64beTargetInfo(const llvm::Triple &Triple)
4706 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004707 void getTargetDefines(const LangOptions &Opts,
4708 MacroBuilder &Builder) const override {
4709 Builder.defineMacro("__AARCH64EB__");
4710 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4711 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004712 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004713 }
4714};
Tim Northovera2ee4332014-03-29 15:09:45 +00004715} // end anonymous namespace.
4716
4717namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004718class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004719protected:
4720 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4721 MacroBuilder &Builder) const override {
4722 Builder.defineMacro("__AARCH64_SIMD__");
4723 Builder.defineMacro("__ARM64_ARCH_8__");
4724 Builder.defineMacro("__ARM_NEON__");
4725 Builder.defineMacro("__LITTLE_ENDIAN__");
4726 Builder.defineMacro("__REGISTER_PREFIX__", "");
4727 Builder.defineMacro("__arm64", "1");
4728 Builder.defineMacro("__arm64__", "1");
4729
4730 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4731 }
4732
Tim Northovera2ee4332014-03-29 15:09:45 +00004733public:
Tim Northover573cbee2014-05-24 12:52:07 +00004734 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4735 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004736 Int64Type = SignedLongLong;
4737 WCharType = SignedInt;
4738 UseSignedCharForObjCBool = false;
4739
4740 LongDoubleWidth = LongDoubleAlign = 64;
4741 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4742
4743 TheCXXABI.set(TargetCXXABI::iOS64);
4744 }
4745
4746 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4747 return TargetInfo::CharPtrBuiltinVaList;
4748 }
4749};
4750} // end anonymous namespace
4751
4752namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004753// Hexagon abstract base class
4754class HexagonTargetInfo : public TargetInfo {
4755 static const Builtin::Info BuiltinInfo[];
4756 static const char * const GCCRegNames[];
4757 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4758 std::string CPU;
4759public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004760 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004761 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004762 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004763
4764 // {} in inline assembly are packet specifiers, not assembly variant
4765 // specifiers.
4766 NoAsmVariants = true;
4767 }
4768
Craig Topper3164f332014-03-11 03:39:26 +00004769 void getTargetBuiltins(const Builtin::Info *&Records,
4770 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004771 Records = BuiltinInfo;
4772 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4773 }
4774
Craig Topper3164f332014-03-11 03:39:26 +00004775 bool validateAsmConstraint(const char *&Name,
4776 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004777 return true;
4778 }
4779
Craig Topper3164f332014-03-11 03:39:26 +00004780 void getTargetDefines(const LangOptions &Opts,
4781 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004782
Craig Topper3164f332014-03-11 03:39:26 +00004783 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004784 return Feature == "hexagon";
4785 }
Craig Topper3164f332014-03-11 03:39:26 +00004786
4787 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004788 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004789 }
Craig Topper3164f332014-03-11 03:39:26 +00004790 void getGCCRegNames(const char * const *&Names,
4791 unsigned &NumNames) const override;
4792 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4793 unsigned &NumAliases) const override;
4794 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004795 return "";
4796 }
Sebastian Pop86500282012-01-13 20:37:10 +00004797
4798 static const char *getHexagonCPUSuffix(StringRef Name) {
4799 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004800 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004801 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004802 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004803 }
4804
Craig Topper3164f332014-03-11 03:39:26 +00004805 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004806 if (!getHexagonCPUSuffix(Name))
4807 return false;
4808
Tony Linthicum76329bf2011-12-12 21:14:55 +00004809 CPU = Name;
4810 return true;
4811 }
4812};
4813
4814void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4815 MacroBuilder &Builder) const {
4816 Builder.defineMacro("qdsp6");
4817 Builder.defineMacro("__qdsp6", "1");
4818 Builder.defineMacro("__qdsp6__", "1");
4819
4820 Builder.defineMacro("hexagon");
4821 Builder.defineMacro("__hexagon", "1");
4822 Builder.defineMacro("__hexagon__", "1");
4823
4824 if(CPU == "hexagonv1") {
4825 Builder.defineMacro("__HEXAGON_V1__");
4826 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4827 if(Opts.HexagonQdsp6Compat) {
4828 Builder.defineMacro("__QDSP6_V1__");
4829 Builder.defineMacro("__QDSP6_ARCH__", "1");
4830 }
4831 }
4832 else if(CPU == "hexagonv2") {
4833 Builder.defineMacro("__HEXAGON_V2__");
4834 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4835 if(Opts.HexagonQdsp6Compat) {
4836 Builder.defineMacro("__QDSP6_V2__");
4837 Builder.defineMacro("__QDSP6_ARCH__", "2");
4838 }
4839 }
4840 else if(CPU == "hexagonv3") {
4841 Builder.defineMacro("__HEXAGON_V3__");
4842 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4843 if(Opts.HexagonQdsp6Compat) {
4844 Builder.defineMacro("__QDSP6_V3__");
4845 Builder.defineMacro("__QDSP6_ARCH__", "3");
4846 }
4847 }
4848 else if(CPU == "hexagonv4") {
4849 Builder.defineMacro("__HEXAGON_V4__");
4850 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4851 if(Opts.HexagonQdsp6Compat) {
4852 Builder.defineMacro("__QDSP6_V4__");
4853 Builder.defineMacro("__QDSP6_ARCH__", "4");
4854 }
4855 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004856 else if(CPU == "hexagonv5") {
4857 Builder.defineMacro("__HEXAGON_V5__");
4858 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4859 if(Opts.HexagonQdsp6Compat) {
4860 Builder.defineMacro("__QDSP6_V5__");
4861 Builder.defineMacro("__QDSP6_ARCH__", "5");
4862 }
4863 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004864}
4865
4866const char * const HexagonTargetInfo::GCCRegNames[] = {
4867 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4868 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4869 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4870 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4871 "p0", "p1", "p2", "p3",
4872 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4873};
4874
4875void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4876 unsigned &NumNames) const {
4877 Names = GCCRegNames;
4878 NumNames = llvm::array_lengthof(GCCRegNames);
4879}
4880
4881
4882const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4883 { { "sp" }, "r29" },
4884 { { "fp" }, "r30" },
4885 { { "lr" }, "r31" },
4886 };
4887
4888void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4889 unsigned &NumAliases) const {
4890 Aliases = GCCRegAliases;
4891 NumAliases = llvm::array_lengthof(GCCRegAliases);
4892}
4893
4894
4895const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4896#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4897#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4898 ALL_LANGUAGES },
4899#include "clang/Basic/BuiltinsHexagon.def"
4900};
4901}
4902
4903
Chris Lattner5ba61f02006-10-14 07:39:34 +00004904namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004905// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4906class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004907 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4908 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004909 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004910public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004911 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004912
Craig Topper3164f332014-03-11 03:39:26 +00004913 bool handleTargetFeatures(std::vector<std::string> &Features,
4914 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004915 SoftFloat = false;
4916 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4917 if (Features[i] == "+soft-float")
4918 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004919 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004920 }
Craig Topper3164f332014-03-11 03:39:26 +00004921 void getTargetDefines(const LangOptions &Opts,
4922 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004923 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004924 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004925
4926 if (SoftFloat)
4927 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004928 }
Craig Topper3164f332014-03-11 03:39:26 +00004929
4930 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004931 return llvm::StringSwitch<bool>(Feature)
4932 .Case("softfloat", SoftFloat)
4933 .Case("sparc", true)
4934 .Default(false);
4935 }
Craig Topper3164f332014-03-11 03:39:26 +00004936
4937 void getTargetBuiltins(const Builtin::Info *&Records,
4938 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004939 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004940 }
Craig Topper3164f332014-03-11 03:39:26 +00004941 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004942 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004943 }
Craig Topper3164f332014-03-11 03:39:26 +00004944 void getGCCRegNames(const char * const *&Names,
4945 unsigned &NumNames) const override;
4946 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4947 unsigned &NumAliases) const override;
4948 bool validateAsmConstraint(const char *&Name,
4949 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004950 // FIXME: Implement!
4951 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004952 }
Craig Topper3164f332014-03-11 03:39:26 +00004953 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004954 // FIXME: Implement!
4955 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004956 }
4957};
4958
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004959const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004960 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4961 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4962 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4963 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4964};
4965
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004966void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4967 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004968 Names = GCCRegNames;
4969 NumNames = llvm::array_lengthof(GCCRegNames);
4970}
4971
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004972const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004973 { { "g0" }, "r0" },
4974 { { "g1" }, "r1" },
4975 { { "g2" }, "r2" },
4976 { { "g3" }, "r3" },
4977 { { "g4" }, "r4" },
4978 { { "g5" }, "r5" },
4979 { { "g6" }, "r6" },
4980 { { "g7" }, "r7" },
4981 { { "o0" }, "r8" },
4982 { { "o1" }, "r9" },
4983 { { "o2" }, "r10" },
4984 { { "o3" }, "r11" },
4985 { { "o4" }, "r12" },
4986 { { "o5" }, "r13" },
4987 { { "o6", "sp" }, "r14" },
4988 { { "o7" }, "r15" },
4989 { { "l0" }, "r16" },
4990 { { "l1" }, "r17" },
4991 { { "l2" }, "r18" },
4992 { { "l3" }, "r19" },
4993 { { "l4" }, "r20" },
4994 { { "l5" }, "r21" },
4995 { { "l6" }, "r22" },
4996 { { "l7" }, "r23" },
4997 { { "i0" }, "r24" },
4998 { { "i1" }, "r25" },
4999 { { "i2" }, "r26" },
5000 { { "i3" }, "r27" },
5001 { { "i4" }, "r28" },
5002 { { "i5" }, "r29" },
5003 { { "i6", "fp" }, "r30" },
5004 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005005};
5006
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005007void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5008 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005009 Aliases = GCCRegAliases;
5010 NumAliases = llvm::array_lengthof(GCCRegAliases);
5011}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005012
5013// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5014class SparcV8TargetInfo : public SparcTargetInfo {
5015public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005016 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005017 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005018 }
5019
Craig Topper3164f332014-03-11 03:39:26 +00005020 void getTargetDefines(const LangOptions &Opts,
5021 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005022 SparcTargetInfo::getTargetDefines(Opts, Builder);
5023 Builder.defineMacro("__sparcv8");
5024 }
5025};
5026
5027// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5028class SparcV9TargetInfo : public SparcTargetInfo {
5029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005030 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005031 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005032 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005033 // This is an LP64 platform.
5034 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005035
5036 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005037 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005038 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005039 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005040 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005041 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005042
5043 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5044 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5045 LongDoubleWidth = 128;
5046 LongDoubleAlign = 128;
5047 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005048 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005049 }
5050
Craig Topper3164f332014-03-11 03:39:26 +00005051 void getTargetDefines(const LangOptions &Opts,
5052 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005053 SparcTargetInfo::getTargetDefines(Opts, Builder);
5054 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005055 Builder.defineMacro("__arch64__");
5056 // Solaris and its derivative AuroraUX don't need these variants, but the
5057 // BSDs do.
5058 if (getTriple().getOS() != llvm::Triple::Solaris &&
5059 getTriple().getOS() != llvm::Triple::AuroraUX) {
5060 Builder.defineMacro("__sparc64__");
5061 Builder.defineMacro("__sparc_v9__");
5062 Builder.defineMacro("__sparcv9__");
5063 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005064 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005065
Craig Topper3164f332014-03-11 03:39:26 +00005066 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005067 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5068 .Case("v9", true)
5069 .Case("ultrasparc", true)
5070 .Case("ultrasparc3", true)
5071 .Case("niagara", true)
5072 .Case("niagara2", true)
5073 .Case("niagara3", true)
5074 .Case("niagara4", true)
5075 .Default(false);
5076
5077 // No need to store the CPU yet. There aren't any CPU-specific
5078 // macros to define.
5079 return CPUKnown;
5080 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005081};
5082
Gabor Greif49991682008-02-21 16:29:08 +00005083} // end anonymous namespace.
5084
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005085namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005086class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5087public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005088 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5089 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005090 SizeType = UnsignedInt;
5091 PtrDiffType = SignedInt;
5092 }
5093};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005094class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005095public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005096 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5097 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005098 SizeType = UnsignedInt;
5099 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005100 }
5101};
5102} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005103
Chris Lattnerb781dc792008-05-08 05:58:21 +00005104namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005105class SystemZTargetInfo : public TargetInfo {
5106 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005107
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005108public:
5109 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5110 TLSSupported = true;
5111 IntWidth = IntAlign = 32;
5112 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5113 PointerWidth = PointerAlign = 64;
5114 LongDoubleWidth = 128;
5115 LongDoubleAlign = 64;
5116 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5117 MinGlobalAlign = 16;
5118 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5119 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5120 }
5121 void getTargetDefines(const LangOptions &Opts,
5122 MacroBuilder &Builder) const override {
5123 Builder.defineMacro("__s390__");
5124 Builder.defineMacro("__s390x__");
5125 Builder.defineMacro("__zarch__");
5126 Builder.defineMacro("__LONG_DOUBLE_128__");
5127 }
5128 void getTargetBuiltins(const Builtin::Info *&Records,
5129 unsigned &NumRecords) const override {
5130 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005131 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005132 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005133 }
5134
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005135 void getGCCRegNames(const char *const *&Names,
5136 unsigned &NumNames) const override;
5137 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5138 unsigned &NumAliases) const override {
5139 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005140 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005141 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005142 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005143 bool validateAsmConstraint(const char *&Name,
5144 TargetInfo::ConstraintInfo &info) const override;
5145 const char *getClobbers() const override {
5146 // FIXME: Is this really right?
5147 return "";
5148 }
5149 BuiltinVaListKind getBuiltinVaListKind() const override {
5150 return TargetInfo::SystemZBuiltinVaList;
5151 }
5152 bool setCPU(const std::string &Name) override {
5153 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5154 .Case("z10", true)
5155 .Case("z196", true)
5156 .Case("zEC12", true)
5157 .Default(false);
5158
5159 // No need to store the CPU yet. There aren't any CPU-specific
5160 // macros to define.
5161 return CPUKnown;
5162 }
5163};
5164
5165const char *const SystemZTargetInfo::GCCRegNames[] = {
5166 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5167 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5168 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5169 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5170};
5171
5172void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5173 unsigned &NumNames) const {
5174 Names = GCCRegNames;
5175 NumNames = llvm::array_lengthof(GCCRegNames);
5176}
5177
5178bool SystemZTargetInfo::
5179validateAsmConstraint(const char *&Name,
5180 TargetInfo::ConstraintInfo &Info) const {
5181 switch (*Name) {
5182 default:
5183 return false;
5184
5185 case 'a': // Address register
5186 case 'd': // Data register (equivalent to 'r')
5187 case 'f': // Floating-point register
5188 Info.setAllowsRegister();
5189 return true;
5190
5191 case 'I': // Unsigned 8-bit constant
5192 case 'J': // Unsigned 12-bit constant
5193 case 'K': // Signed 16-bit constant
5194 case 'L': // Signed 20-bit displacement (on all targets we support)
5195 case 'M': // 0x7fffffff
5196 return true;
5197
5198 case 'Q': // Memory with base and unsigned 12-bit displacement
5199 case 'R': // Likewise, plus an index
5200 case 'S': // Memory with base and signed 20-bit displacement
5201 case 'T': // Likewise, plus an index
5202 Info.setAllowsMemory();
5203 return true;
5204 }
5205}
Ulrich Weigand47445072013-05-06 16:26:41 +00005206}
5207
5208namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005209 class MSP430TargetInfo : public TargetInfo {
5210 static const char * const GCCRegNames[];
5211 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005212 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005213 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005214 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005215 IntWidth = 16; IntAlign = 16;
5216 LongWidth = 32; LongLongWidth = 64;
5217 LongAlign = LongLongAlign = 16;
5218 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005219 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005220 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005221 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005222 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005223 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005224 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005225 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005226 }
5227 void getTargetDefines(const LangOptions &Opts,
5228 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005229 Builder.defineMacro("MSP430");
5230 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005231 // FIXME: defines for different 'flavours' of MCU
5232 }
Craig Topper3164f332014-03-11 03:39:26 +00005233 void getTargetBuiltins(const Builtin::Info *&Records,
5234 unsigned &NumRecords) const override {
5235 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005236 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005237 NumRecords = 0;
5238 }
Craig Topper3164f332014-03-11 03:39:26 +00005239 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005240 return Feature == "msp430";
5241 }
Craig Topper3164f332014-03-11 03:39:26 +00005242 void getGCCRegNames(const char * const *&Names,
5243 unsigned &NumNames) const override;
5244 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5245 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005246 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005247 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005248 NumAliases = 0;
5249 }
Craig Topper3164f332014-03-11 03:39:26 +00005250 bool validateAsmConstraint(const char *&Name,
5251 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005252 // No target constraints for now.
5253 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005254 }
Craig Topper3164f332014-03-11 03:39:26 +00005255 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005256 // FIXME: Is this really right?
5257 return "";
5258 }
Craig Topper3164f332014-03-11 03:39:26 +00005259 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005260 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005261 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005262 }
5263 };
5264
5265 const char * const MSP430TargetInfo::GCCRegNames[] = {
5266 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5267 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5268 };
5269
5270 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5271 unsigned &NumNames) const {
5272 Names = GCCRegNames;
5273 NumNames = llvm::array_lengthof(GCCRegNames);
5274 }
5275}
5276
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005277namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005278
Mike Stump11289f42009-09-09 15:08:12 +00005279 // LLVM and Clang cannot be used directly to output native binaries for
5280 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005281 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005282 //
5283 // TCE uses the llvm bitcode as input and uses it for generating customized
5284 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005285 // publicly available in http://tce.cs.tut.fi
5286
Eli Friedman1f191002011-10-07 19:51:42 +00005287 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5288 3, // opencl_global
5289 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005290 5, // opencl_constant
5291 0, // cuda_device
5292 0, // cuda_constant
5293 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005294 };
5295
Eli Friedmana9c3d712009-08-19 20:47:07 +00005296 class TCETargetInfo : public TargetInfo{
5297 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005298 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005299 TLSSupported = false;
5300 IntWidth = 32;
5301 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005302 PointerWidth = 32;
5303 IntAlign = 32;
5304 LongAlign = LongLongAlign = 32;
5305 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005306 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005307 SizeType = UnsignedInt;
5308 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005309 IntPtrType = SignedInt;
5310 PtrDiffType = SignedInt;
5311 FloatWidth = 32;
5312 FloatAlign = 32;
5313 DoubleWidth = 32;
5314 DoubleAlign = 32;
5315 LongDoubleWidth = 32;
5316 LongDoubleAlign = 32;
5317 FloatFormat = &llvm::APFloat::IEEEsingle;
5318 DoubleFormat = &llvm::APFloat::IEEEsingle;
5319 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005320 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5321 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005322 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005323 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005324 }
5325
Craig Topper3164f332014-03-11 03:39:26 +00005326 void getTargetDefines(const LangOptions &Opts,
5327 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005328 DefineStd(Builder, "tce", Opts);
5329 Builder.defineMacro("__TCE__");
5330 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005331 }
Craig Topper3164f332014-03-11 03:39:26 +00005332 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005333 return Feature == "tce";
5334 }
Craig Topper3164f332014-03-11 03:39:26 +00005335
5336 void getTargetBuiltins(const Builtin::Info *&Records,
5337 unsigned &NumRecords) const override {}
5338 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005339 return "";
5340 }
Craig Topper3164f332014-03-11 03:39:26 +00005341 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005342 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005343 }
Craig Topper3164f332014-03-11 03:39:26 +00005344 void getGCCRegNames(const char * const *&Names,
5345 unsigned &NumNames) const override {}
5346 bool validateAsmConstraint(const char *&Name,
5347 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005348 return true;
5349 }
Craig Topper3164f332014-03-11 03:39:26 +00005350 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5351 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005352 };
5353}
5354
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005355namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005356class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005357 virtual void setDescriptionString() = 0;
5358
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005359 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005360 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005361 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005362 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005363 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005364 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005365 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005366 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005367 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005368 enum DspRevEnum {
5369 NoDSP, DSP1, DSP2
5370 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005371 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005372
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005373protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005374 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005375 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005376
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005377public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005378 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5379 const std::string &CPUStr)
5380 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005381 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005382 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005383
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005384 bool isNaN2008Default() const {
5385 return CPU == "mips32r6" || CPU == "mips64r6";
5386 }
5387
5388 bool isFP64Default() const {
5389 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5390 }
5391
Alp Toker4925ba72014-06-07 23:30:42 +00005392 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005393 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005394 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5395 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005396 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005397 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005398 .Case("mips1", IsMips32)
5399 .Case("mips2", IsMips32)
5400 .Case("mips3", true)
5401 .Case("mips4", true)
5402 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005403 .Case("mips32", IsMips32)
5404 .Case("mips32r2", IsMips32)
5405 .Case("mips32r6", IsMips32)
5406 .Case("mips64", true)
5407 .Case("mips64r2", true)
5408 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005409 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005410 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005411 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005412 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005413 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005414 // The backend enables certain ABI's by default according to the
5415 // architecture.
5416 // Disable both possible defaults so that we don't end up with multiple
5417 // ABI's selected and trigger an assertion.
5418 Features["o32"] = false;
5419 Features["n64"] = false;
5420
Eric Christopher0b26a612010-03-02 02:41:08 +00005421 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005422 if (CPU == "octeon")
5423 Features["mips64r2"] = Features["cnmips"] = true;
5424 else
5425 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005426 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005427
Craig Topper3164f332014-03-11 03:39:26 +00005428 void getTargetDefines(const LangOptions &Opts,
5429 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005430 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005431 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005432 if (Opts.GNUMode)
5433 Builder.defineMacro("mips");
5434
Simon Atanasyan683535b2012-08-29 19:14:58 +00005435 Builder.defineMacro("__REGISTER_PREFIX__", "");
5436
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005437 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005438 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005439 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005440 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005441 case SoftFloat:
5442 Builder.defineMacro("__mips_soft_float", Twine(1));
5443 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005444 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005445
Simon Atanasyan16071912013-04-14 14:07:30 +00005446 if (IsSingleFloat)
5447 Builder.defineMacro("__mips_single_float", Twine(1));
5448
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005449 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5450 Builder.defineMacro("_MIPS_FPSET",
5451 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5452
Simon Atanasyan72244b62012-07-05 16:06:06 +00005453 if (IsMips16)
5454 Builder.defineMacro("__mips16", Twine(1));
5455
Simon Atanasyan60777612013-04-14 14:07:51 +00005456 if (IsMicromips)
5457 Builder.defineMacro("__mips_micromips", Twine(1));
5458
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005459 if (IsNan2008)
5460 Builder.defineMacro("__mips_nan2008", Twine(1));
5461
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005462 switch (DspRev) {
5463 default:
5464 break;
5465 case DSP1:
5466 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5467 Builder.defineMacro("__mips_dsp", Twine(1));
5468 break;
5469 case DSP2:
5470 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5471 Builder.defineMacro("__mips_dspr2", Twine(1));
5472 Builder.defineMacro("__mips_dsp", Twine(1));
5473 break;
5474 }
5475
Jack Carter44ff1e52013-08-12 17:20:29 +00005476 if (HasMSA)
5477 Builder.defineMacro("__mips_msa", Twine(1));
5478
Simon Atanasyan26f19672012-04-05 19:28:31 +00005479 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5480 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5481 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005482
5483 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5484 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005485 }
5486
Craig Topper3164f332014-03-11 03:39:26 +00005487 void getTargetBuiltins(const Builtin::Info *&Records,
5488 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005489 Records = BuiltinInfo;
5490 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005491 }
Craig Topper3164f332014-03-11 03:39:26 +00005492 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005493 return llvm::StringSwitch<bool>(Feature)
5494 .Case("mips", true)
5495 .Case("fp64", HasFP64)
5496 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005497 }
Craig Topper3164f332014-03-11 03:39:26 +00005498 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005499 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005500 }
Craig Topper3164f332014-03-11 03:39:26 +00005501 void getGCCRegNames(const char * const *&Names,
5502 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005503 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005504 // CPU register names
5505 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005506 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5507 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5508 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005509 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5510 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005511 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5512 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5513 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5514 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005515 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005516 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005517 "$fcc5","$fcc6","$fcc7",
5518 // MSA register names
5519 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5520 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5521 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5522 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5523 // MSA control register names
5524 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5525 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005526 };
5527 Names = GCCRegNames;
5528 NumNames = llvm::array_lengthof(GCCRegNames);
5529 }
Craig Topper3164f332014-03-11 03:39:26 +00005530 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5531 unsigned &NumAliases) const override = 0;
5532 bool validateAsmConstraint(const char *&Name,
5533 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005534 switch (*Name) {
5535 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005536 return false;
5537
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005538 case 'r': // CPU registers.
5539 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005540 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005541 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005542 case 'c': // $25 for indirect jumps
5543 case 'l': // lo register
5544 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005545 Info.setAllowsRegister();
5546 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005547 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005548 Info.setAllowsMemory();
5549 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005550 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005551 }
5552
Craig Topper3164f332014-03-11 03:39:26 +00005553 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005554 // FIXME: Implement!
5555 return "";
5556 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005557
Craig Topper3164f332014-03-11 03:39:26 +00005558 bool handleTargetFeatures(std::vector<std::string> &Features,
5559 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005560 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005561 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005562 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005563 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005564 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005565 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005566 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005567
5568 for (std::vector<std::string>::iterator it = Features.begin(),
5569 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005570 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005571 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005572 else if (*it == "+soft-float")
5573 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005574 else if (*it == "+mips16")
5575 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005576 else if (*it == "+micromips")
5577 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005578 else if (*it == "+dsp")
5579 DspRev = std::max(DspRev, DSP1);
5580 else if (*it == "+dspr2")
5581 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005582 else if (*it == "+msa")
5583 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005584 else if (*it == "+fp64")
5585 HasFP64 = true;
5586 else if (*it == "-fp64")
5587 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005588 else if (*it == "+nan2008")
5589 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005590 else if (*it == "-nan2008")
5591 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005592 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005593
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005594 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005595 std::vector<std::string>::iterator it =
5596 std::find(Features.begin(), Features.end(), "+soft-float");
5597 if (it != Features.end())
5598 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005599
Akira Hatanaka9064e362013-10-29 18:30:33 +00005600 setDescriptionString();
5601
Rafael Espindolaeb265472013-08-21 21:59:03 +00005602 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005603 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005604
Craig Topper3164f332014-03-11 03:39:26 +00005605 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005606 if (RegNo == 0) return 4;
5607 if (RegNo == 1) return 5;
5608 return -1;
5609 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005610
5611 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005612};
5613
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005614const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5615#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5616#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5617 ALL_LANGUAGES },
5618#include "clang/Basic/BuiltinsMips.def"
5619};
5620
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005621class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005622public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005623 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005624 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005625 SizeType = UnsignedInt;
5626 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005627 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005628 }
Craig Topper3164f332014-03-11 03:39:26 +00005629 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005630 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005631 ABI = Name;
5632 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005633 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005634 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005635 }
Craig Topper3164f332014-03-11 03:39:26 +00005636 void getTargetDefines(const LangOptions &Opts,
5637 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005638 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005639
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005640 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005641 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5642
5643 const std::string& CPUStr = getCPU();
5644 if (CPUStr == "mips32")
5645 Builder.defineMacro("__mips_isa_rev", "1");
5646 else if (CPUStr == "mips32r2")
5647 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005648
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005649 if (ABI == "o32") {
5650 Builder.defineMacro("__mips_o32");
5651 Builder.defineMacro("_ABIO32", "1");
5652 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5653 }
5654 else if (ABI == "eabi")
5655 Builder.defineMacro("__mips_eabi");
5656 else
David Blaikie83d382b2011-09-23 05:06:16 +00005657 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005658 }
Craig Topper3164f332014-03-11 03:39:26 +00005659 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5660 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005661 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5662 { { "at" }, "$1" },
5663 { { "v0" }, "$2" },
5664 { { "v1" }, "$3" },
5665 { { "a0" }, "$4" },
5666 { { "a1" }, "$5" },
5667 { { "a2" }, "$6" },
5668 { { "a3" }, "$7" },
5669 { { "t0" }, "$8" },
5670 { { "t1" }, "$9" },
5671 { { "t2" }, "$10" },
5672 { { "t3" }, "$11" },
5673 { { "t4" }, "$12" },
5674 { { "t5" }, "$13" },
5675 { { "t6" }, "$14" },
5676 { { "t7" }, "$15" },
5677 { { "s0" }, "$16" },
5678 { { "s1" }, "$17" },
5679 { { "s2" }, "$18" },
5680 { { "s3" }, "$19" },
5681 { { "s4" }, "$20" },
5682 { { "s5" }, "$21" },
5683 { { "s6" }, "$22" },
5684 { { "s7" }, "$23" },
5685 { { "t8" }, "$24" },
5686 { { "t9" }, "$25" },
5687 { { "k0" }, "$26" },
5688 { { "k1" }, "$27" },
5689 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005690 { { "sp","$sp" }, "$29" },
5691 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005692 { { "ra" }, "$31" }
5693 };
5694 Aliases = GCCRegAliases;
5695 NumAliases = llvm::array_lengthof(GCCRegAliases);
5696 }
5697};
5698
5699class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005700 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005701 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005702 }
5703
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005704public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005705 Mips32EBTargetInfo(const llvm::Triple &Triple)
5706 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005707 }
Craig Topper3164f332014-03-11 03:39:26 +00005708 void getTargetDefines(const LangOptions &Opts,
5709 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005710 DefineStd(Builder, "MIPSEB", Opts);
5711 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005712 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005713 }
5714};
5715
5716class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005717 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005718 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005719 }
5720
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005721public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005722 Mips32ELTargetInfo(const llvm::Triple &Triple)
5723 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005724 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005725 }
Craig Topper3164f332014-03-11 03:39:26 +00005726 void getTargetDefines(const LangOptions &Opts,
5727 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005728 DefineStd(Builder, "MIPSEL", Opts);
5729 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005730 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005731 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005732};
Akira Hatanakabef17452011-09-20 19:21:49 +00005733
5734class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005735public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005736 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005737 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005738 LongDoubleWidth = LongDoubleAlign = 128;
5739 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005740 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5741 LongDoubleWidth = LongDoubleAlign = 64;
5742 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5743 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005744 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005745 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005746 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005747 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005748
5749 void setN64ABITypes() {
5750 LongWidth = LongAlign = 64;
5751 PointerWidth = PointerAlign = 64;
5752 SizeType = UnsignedLong;
5753 PtrDiffType = SignedLong;
5754 }
5755
5756 void setN32ABITypes() {
5757 LongWidth = LongAlign = 32;
5758 PointerWidth = PointerAlign = 32;
5759 SizeType = UnsignedInt;
5760 PtrDiffType = SignedInt;
5761 }
5762
Craig Topper3164f332014-03-11 03:39:26 +00005763 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005764 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005765 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005766 ABI = Name;
5767 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005768 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005769 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005770 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005771 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005772 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005773 }
5774 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005775 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005776
Craig Topper3164f332014-03-11 03:39:26 +00005777 void getTargetDefines(const LangOptions &Opts,
5778 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005779 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005780
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005781 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005782 Builder.defineMacro("__mips64");
5783 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005784 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5785
5786 const std::string& CPUStr = getCPU();
5787 if (CPUStr == "mips64")
5788 Builder.defineMacro("__mips_isa_rev", "1");
5789 else if (CPUStr == "mips64r2")
5790 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005791
Akira Hatanakabef17452011-09-20 19:21:49 +00005792 if (ABI == "n32") {
5793 Builder.defineMacro("__mips_n32");
5794 Builder.defineMacro("_ABIN32", "2");
5795 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5796 }
5797 else if (ABI == "n64") {
5798 Builder.defineMacro("__mips_n64");
5799 Builder.defineMacro("_ABI64", "3");
5800 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5801 }
5802 else
David Blaikie83d382b2011-09-23 05:06:16 +00005803 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005804 }
Craig Topper3164f332014-03-11 03:39:26 +00005805 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5806 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005807 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5808 { { "at" }, "$1" },
5809 { { "v0" }, "$2" },
5810 { { "v1" }, "$3" },
5811 { { "a0" }, "$4" },
5812 { { "a1" }, "$5" },
5813 { { "a2" }, "$6" },
5814 { { "a3" }, "$7" },
5815 { { "a4" }, "$8" },
5816 { { "a5" }, "$9" },
5817 { { "a6" }, "$10" },
5818 { { "a7" }, "$11" },
5819 { { "t0" }, "$12" },
5820 { { "t1" }, "$13" },
5821 { { "t2" }, "$14" },
5822 { { "t3" }, "$15" },
5823 { { "s0" }, "$16" },
5824 { { "s1" }, "$17" },
5825 { { "s2" }, "$18" },
5826 { { "s3" }, "$19" },
5827 { { "s4" }, "$20" },
5828 { { "s5" }, "$21" },
5829 { { "s6" }, "$22" },
5830 { { "s7" }, "$23" },
5831 { { "t8" }, "$24" },
5832 { { "t9" }, "$25" },
5833 { { "k0" }, "$26" },
5834 { { "k1" }, "$27" },
5835 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005836 { { "sp","$sp" }, "$29" },
5837 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005838 { { "ra" }, "$31" }
5839 };
5840 Aliases = GCCRegAliases;
5841 NumAliases = llvm::array_lengthof(GCCRegAliases);
5842 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005843
5844 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005845};
5846
5847class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005848 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005849 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005850 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 +00005851 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005852 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005853
Akira Hatanakabef17452011-09-20 19:21:49 +00005854 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005855
Akira Hatanakabef17452011-09-20 19:21:49 +00005856public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005857 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005858 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005859 void getTargetDefines(const LangOptions &Opts,
5860 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005861 DefineStd(Builder, "MIPSEB", Opts);
5862 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005863 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005864 }
5865};
5866
5867class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005868 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005869 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005870 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 +00005871 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005872 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005873 }
5874public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005875 Mips64ELTargetInfo(const llvm::Triple &Triple)
5876 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005877 // Default ABI is n64.
5878 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005879 }
Craig Topper3164f332014-03-11 03:39:26 +00005880 void getTargetDefines(const LangOptions &Opts,
5881 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005882 DefineStd(Builder, "MIPSEL", Opts);
5883 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005884 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005885 }
5886};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005887} // end anonymous namespace.
5888
Ivan Krasindd7403e2011-08-24 20:22:22 +00005889namespace {
5890class PNaClTargetInfo : public TargetInfo {
5891public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005892 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005893 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005894 this->UserLabelPrefix = "";
5895 this->LongAlign = 32;
5896 this->LongWidth = 32;
5897 this->PointerAlign = 32;
5898 this->PointerWidth = 32;
5899 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005900 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005901 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005902 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005903 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005904 this->SizeType = TargetInfo::UnsignedInt;
5905 this->PtrDiffType = TargetInfo::SignedInt;
5906 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005907 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005908 }
5909
Craig Topper3164f332014-03-11 03:39:26 +00005910 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005911 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005912 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005913 Builder.defineMacro("__le32__");
5914 Builder.defineMacro("__pnacl__");
5915 }
Craig Topper3164f332014-03-11 03:39:26 +00005916 void getTargetDefines(const LangOptions &Opts,
5917 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005918 getArchDefines(Opts, Builder);
5919 }
Craig Topper3164f332014-03-11 03:39:26 +00005920 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005921 return Feature == "pnacl";
5922 }
Craig Topper3164f332014-03-11 03:39:26 +00005923 void getTargetBuiltins(const Builtin::Info *&Records,
5924 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005925 }
Craig Topper3164f332014-03-11 03:39:26 +00005926 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005927 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005928 }
Craig Topper3164f332014-03-11 03:39:26 +00005929 void getGCCRegNames(const char * const *&Names,
5930 unsigned &NumNames) const override;
5931 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5932 unsigned &NumAliases) const override;
5933 bool validateAsmConstraint(const char *&Name,
5934 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005935 return false;
5936 }
5937
Craig Topper3164f332014-03-11 03:39:26 +00005938 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005939 return "";
5940 }
5941};
5942
5943void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5944 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005945 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005946 NumNames = 0;
5947}
5948
5949void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5950 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005951 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005952 NumAliases = 0;
5953}
5954} // end anonymous namespace.
5955
Guy Benyeib798fc92012-12-11 21:38:14 +00005956namespace {
5957 static const unsigned SPIRAddrSpaceMap[] = {
5958 1, // opencl_global
5959 3, // opencl_local
5960 2, // opencl_constant
5961 0, // cuda_device
5962 0, // cuda_constant
5963 0 // cuda_shared
5964 };
5965 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005966 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005967 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005968 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5969 "SPIR target must use unknown OS");
5970 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5971 "SPIR target must use unknown environment type");
5972 BigEndian = false;
5973 TLSSupported = false;
5974 LongWidth = LongAlign = 64;
5975 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005976 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005977 // Define available target features
5978 // These must be defined in sorted order!
5979 NoAsmVariants = true;
5980 }
Craig Topper3164f332014-03-11 03:39:26 +00005981 void getTargetDefines(const LangOptions &Opts,
5982 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005983 DefineStd(Builder, "SPIR", Opts);
5984 }
Craig Topper3164f332014-03-11 03:39:26 +00005985 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005986 return Feature == "spir";
5987 }
Craig Topper3164f332014-03-11 03:39:26 +00005988
5989 void getTargetBuiltins(const Builtin::Info *&Records,
5990 unsigned &NumRecords) const override {}
5991 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005992 return "";
5993 }
Craig Topper3164f332014-03-11 03:39:26 +00005994 void getGCCRegNames(const char * const *&Names,
5995 unsigned &NumNames) const override {}
5996 bool validateAsmConstraint(const char *&Name,
5997 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005998 return true;
5999 }
Craig Topper3164f332014-03-11 03:39:26 +00006000 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6001 unsigned &NumAliases) const override {}
6002 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006003 return TargetInfo::VoidPtrBuiltinVaList;
6004 }
6005 };
6006
6007
6008 class SPIR32TargetInfo : public SPIRTargetInfo {
6009 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006010 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006011 PointerWidth = PointerAlign = 32;
6012 SizeType = TargetInfo::UnsignedInt;
6013 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6014 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006015 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6016 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006017 }
Craig Topper3164f332014-03-11 03:39:26 +00006018 void getTargetDefines(const LangOptions &Opts,
6019 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006020 DefineStd(Builder, "SPIR32", Opts);
6021 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006022 };
6023
6024 class SPIR64TargetInfo : public SPIRTargetInfo {
6025 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006026 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006027 PointerWidth = PointerAlign = 64;
6028 SizeType = TargetInfo::UnsignedLong;
6029 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006030 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6031 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006032 }
Craig Topper3164f332014-03-11 03:39:26 +00006033 void getTargetDefines(const LangOptions &Opts,
6034 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006035 DefineStd(Builder, "SPIR64", Opts);
6036 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006037 };
6038}
6039
Robert Lytton0e076492013-08-13 09:43:10 +00006040namespace {
6041class XCoreTargetInfo : public TargetInfo {
6042 static const Builtin::Info BuiltinInfo[];
6043public:
6044 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6045 BigEndian = false;
6046 NoAsmVariants = true;
6047 LongLongAlign = 32;
6048 SuitableAlign = 32;
6049 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006050 SizeType = UnsignedInt;
6051 PtrDiffType = SignedInt;
6052 IntPtrType = SignedInt;
6053 WCharType = UnsignedChar;
6054 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006055 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006056 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 +00006057 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006058 }
Craig Topper3164f332014-03-11 03:39:26 +00006059 void getTargetDefines(const LangOptions &Opts,
6060 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006061 Builder.defineMacro("__XS1B__");
6062 }
Craig Topper3164f332014-03-11 03:39:26 +00006063 void getTargetBuiltins(const Builtin::Info *&Records,
6064 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006065 Records = BuiltinInfo;
6066 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6067 }
Craig Topper3164f332014-03-11 03:39:26 +00006068 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006069 return TargetInfo::VoidPtrBuiltinVaList;
6070 }
Craig Topper3164f332014-03-11 03:39:26 +00006071 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006072 return "";
6073 }
Craig Topper3164f332014-03-11 03:39:26 +00006074 void getGCCRegNames(const char * const *&Names,
6075 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006076 static const char * const GCCRegNames[] = {
6077 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6078 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6079 };
6080 Names = GCCRegNames;
6081 NumNames = llvm::array_lengthof(GCCRegNames);
6082 }
Craig Topper3164f332014-03-11 03:39:26 +00006083 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6084 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006085 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006086 NumAliases = 0;
6087 }
Craig Topper3164f332014-03-11 03:39:26 +00006088 bool validateAsmConstraint(const char *&Name,
6089 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006090 return false;
6091 }
Craig Topper3164f332014-03-11 03:39:26 +00006092 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006093 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6094 return (RegNo < 2)? RegNo : -1;
6095 }
Robert Lytton0e076492013-08-13 09:43:10 +00006096};
6097
6098const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6099#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6100#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6101 ALL_LANGUAGES },
6102#include "clang/Basic/BuiltinsXCore.def"
6103};
6104} // end anonymous namespace.
6105
Ivan Krasindd7403e2011-08-24 20:22:22 +00006106
Chris Lattner5ba61f02006-10-14 07:39:34 +00006107//===----------------------------------------------------------------------===//
6108// Driver code
6109//===----------------------------------------------------------------------===//
6110
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006111static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006112 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006113
Daniel Dunbar52322032009-08-18 05:47:58 +00006114 switch (Triple.getArch()) {
6115 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006116 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006117
Tim Northover2a0783d2014-05-30 14:14:07 +00006118 case llvm::Triple::xcore:
6119 return new XCoreTargetInfo(Triple);
6120
6121 case llvm::Triple::hexagon:
6122 return new HexagonTargetInfo(Triple);
6123
6124 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006125 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006126 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006127
6128 switch (os) {
6129 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006130 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006131 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006132 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006133 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006134 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006135 }
6136
Christian Pirker9b019ae2014-02-25 13:51:00 +00006137 case llvm::Triple::aarch64_be:
6138 switch (os) {
6139 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006140 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006141 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006142 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006143 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006144 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006145 }
6146
Daniel Dunbar52322032009-08-18 05:47:58 +00006147 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006148 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006149 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006150 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006151
Daniel Dunbar52322032009-08-18 05:47:58 +00006152 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006153 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006154 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006155 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006156 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006157 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006158 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006159 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006160 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006161 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006162 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006163 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006164 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006165 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006166 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006167 case llvm::Triple::Win32:
6168 switch (Triple.getEnvironment()) {
6169 default:
6170 return new ARMleTargetInfo(Triple);
6171 case llvm::Triple::Itanium:
6172 return new ItaniumWindowsARMleTargetInfo(Triple);
6173 case llvm::Triple::MSVC:
6174 return new MicrosoftARMleTargetInfo(Triple);
6175 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006176 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006177 return new ARMleTargetInfo(Triple);
6178 }
6179
6180 case llvm::Triple::armeb:
6181 case llvm::Triple::thumbeb:
6182 if (Triple.isOSDarwin())
6183 return new DarwinARMTargetInfo(Triple);
6184
6185 switch (os) {
6186 case llvm::Triple::Linux:
6187 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6188 case llvm::Triple::FreeBSD:
6189 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6190 case llvm::Triple::NetBSD:
6191 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6192 case llvm::Triple::OpenBSD:
6193 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6194 case llvm::Triple::Bitrig:
6195 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6196 case llvm::Triple::RTEMS:
6197 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6198 case llvm::Triple::NaCl:
6199 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6200 default:
6201 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006202 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006203
Daniel Dunbar52322032009-08-18 05:47:58 +00006204 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006205 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006206
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006207 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006208 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006209 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006210 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006211 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006212 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006213 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006214 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006215 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006216 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006217 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006218 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006219 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006220
6221 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006222 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006223 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006224 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006225 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006226 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006227 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006228 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006229 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006230 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006231 case llvm::Triple::NaCl:
6232 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006233 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006234 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006235 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006236
Akira Hatanakabef17452011-09-20 19:21:49 +00006237 case llvm::Triple::mips64:
6238 switch (os) {
6239 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006240 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006241 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006242 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006243 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006244 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006245 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006246 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006247 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006248 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006249 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006250 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006251 }
6252
6253 case llvm::Triple::mips64el:
6254 switch (os) {
6255 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006256 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006257 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006258 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006259 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006260 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006261 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006262 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006263 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006264 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006265 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006266 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006267 }
6268
Ivan Krasindd7403e2011-08-24 20:22:22 +00006269 case llvm::Triple::le32:
6270 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006271 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006272 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006273 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006274 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006275 }
6276
Daniel Dunbar52322032009-08-18 05:47:58 +00006277 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006278 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006279 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006280 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006281 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006282 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006283 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006284 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006285 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006286 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006287 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006288 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006289 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006291 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006293 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006294
6295 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006296 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006297 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006298 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006299 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006300 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006301 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006302 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006303 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006304 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006305 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006306 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006307 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006308 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006309 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006310
Bill Schmidt778d3872013-07-26 01:36:11 +00006311 case llvm::Triple::ppc64le:
6312 switch (os) {
6313 case llvm::Triple::Linux:
6314 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6315 default:
6316 return new PPC64TargetInfo(Triple);
6317 }
6318
Peter Collingbournec947aae2012-05-20 23:28:41 +00006319 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006320 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006321 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006322 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006323
Eli Friedmand13b41e2012-10-12 23:32:00 +00006324 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006325 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006326
Daniel Dunbar52322032009-08-18 05:47:58 +00006327 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006328 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006329 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006331 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006333 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006334 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006335 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006336 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006337 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006339 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006341 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006343 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006344
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006345 case llvm::Triple::sparcv9:
6346 switch (os) {
6347 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006348 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006349 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006351 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006352 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006353 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006354 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006355 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006357 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006359 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006360 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006361 }
6362
Ulrich Weigand47445072013-05-06 16:26:41 +00006363 case llvm::Triple::systemz:
6364 switch (os) {
6365 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006367 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006369 }
6370
Eli Friedmana9c3d712009-08-19 20:47:07 +00006371 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006373
Daniel Dunbar52322032009-08-18 05:47:58 +00006374 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006375 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006377
Daniel Dunbar52322032009-08-18 05:47:58 +00006378 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006379 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006380 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006381 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006383 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006385 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006387 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006389 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006390 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006391 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006392 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006393 case llvm::Triple::KFreeBSD:
6394 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006395 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006397 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006399 case llvm::Triple::Win32: {
6400 switch (Triple.getEnvironment()) {
6401 default:
6402 return new X86_32TargetInfo(Triple);
6403 case llvm::Triple::Cygnus:
6404 return new CygwinX86_32TargetInfo(Triple);
6405 case llvm::Triple::GNU:
6406 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006407 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006408 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006409 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006410 }
6411 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006412 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006413 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006414 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006415 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006416 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006417 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006418 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006419 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006420 }
6421
6422 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006423 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006424 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006425
Daniel Dunbar52322032009-08-18 05:47:58 +00006426 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006427 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006428 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006429 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006430 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006431 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006433 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006434 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006435 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006436 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006437 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006438 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006439 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006441 case llvm::Triple::KFreeBSD:
6442 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006443 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006445 case llvm::Triple::Win32: {
6446 switch (Triple.getEnvironment()) {
6447 default:
6448 return new X86_64TargetInfo(Triple);
6449 case llvm::Triple::GNU:
6450 return new MinGWX86_64TargetInfo(Triple);
6451 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006452 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006453 }
6454 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006455 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006456 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006457 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006459 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006460
6461 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006462 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006463 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006464 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006465 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006466 }
6467 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006468 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006469 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006470 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006471 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006472 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006473 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006474}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006475
6476/// CreateTargetInfo - Return the target info object for the specified target
6477/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006478TargetInfo *
6479TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6480 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006481 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006482
6483 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006484 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006485 if (!Target) {
6486 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006487 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006488 }
Alp Toker80758082014-07-06 05:26:44 +00006489 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006490
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006491 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006492 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6493 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006494 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006495 }
6496
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006497 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006498 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6499 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006500 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006501 }
6502
Rafael Espindolaeb265472013-08-21 21:59:03 +00006503 // Set the fp math unit.
6504 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6505 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006506 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006507 }
6508
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006509 // Compute the default target features, we need the target to handle this
6510 // because features may have dependencies on one another.
6511 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006512 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006513
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006514 // Apply the user specified deltas.
6515 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6516 I < N; ++I) {
6517 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006518 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006519 bool Enabled = Name[0] == '+';
6520 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006521 }
6522
6523 // Add the features to the compile options.
6524 //
6525 // FIXME: If we are completely confident that we have the right set, we only
6526 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006527 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006528 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6529 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006530 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006531 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006532 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006533
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006534 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006535}