blob: a5144663281f4a88338793365d6280bcc271e617 [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");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000387 }
388public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000389 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
390 this->UserLabelPrefix = "";
391 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000392};
393
Torok Edwinb2b37c62009-06-30 17:10:35 +0000394// OpenBSD Target
395template<typename Target>
396class OpenBSDTargetInfo : public OSTargetInfo<Target> {
397protected:
Craig Topper3164f332014-03-11 03:39:26 +0000398 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
399 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 // OpenBSD defines; list based off of gcc output
401
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("__OpenBSD__");
403 DefineStd(Builder, "unix", Opts);
404 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000405 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000406 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000407 }
408public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000409 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
410 this->UserLabelPrefix = "";
411 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000412
Eli Friedman3715d1f2011-12-15 02:15:56 +0000413 switch (Triple.getArch()) {
414 default:
415 case llvm::Triple::x86:
416 case llvm::Triple::x86_64:
417 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000418 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000419 this->MCountName = "__mcount";
420 break;
421 case llvm::Triple::mips64:
422 case llvm::Triple::mips64el:
423 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000424 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000425 this->MCountName = "_mcount";
426 break;
427 }
428 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000429};
430
Eli Friedman9fa28852012-08-08 23:57:20 +0000431// Bitrig Target
432template<typename Target>
433class BitrigTargetInfo : public OSTargetInfo<Target> {
434protected:
Craig Topper3164f332014-03-11 03:39:26 +0000435 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000437 // Bitrig defines; list based off of gcc output
438
439 Builder.defineMacro("__Bitrig__");
440 DefineStd(Builder, "unix", Opts);
441 Builder.defineMacro("__ELF__");
442 if (Opts.POSIXThreads)
443 Builder.defineMacro("_REENTRANT");
444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000448 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000449 }
450};
451
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000452// PSP Target
453template<typename Target>
454class PSPTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000458 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("PSP");
460 Builder.defineMacro("_PSP");
461 Builder.defineMacro("__psp__");
462 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000466 this->UserLabelPrefix = "";
467 }
468};
469
John Thompsone467e192009-11-19 17:18:50 +0000470// PS3 PPU Target
471template<typename Target>
472class PS3PPUTargetInfo : public OSTargetInfo<Target> {
473protected:
Craig Topper3164f332014-03-11 03:39:26 +0000474 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000476 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000477 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000478 Builder.defineMacro("__PPU__");
479 Builder.defineMacro("__CELLOS_LV2__");
480 Builder.defineMacro("__ELF__");
481 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000482 Builder.defineMacro("_ARCH_PPC64");
483 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000484 }
485public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000486 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000487 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000488 this->LongWidth = this->LongAlign = 32;
489 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000490 this->IntMaxType = TargetInfo::SignedLongLong;
491 this->UIntMaxType = TargetInfo::UnsignedLongLong;
492 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000493 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000494 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000495 }
496};
497
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000498// AuroraUX target
499template<typename Target>
500class AuroraUXTargetInfo : public OSTargetInfo<Target> {
501protected:
Craig Topper3164f332014-03-11 03:39:26 +0000502 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
503 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000504 DefineStd(Builder, "sun", Opts);
505 DefineStd(Builder, "unix", Opts);
506 Builder.defineMacro("__ELF__");
507 Builder.defineMacro("__svr4__");
508 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000509 }
510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000511 AuroraUXTargetInfo(const llvm::Triple &Triple)
512 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000513 this->UserLabelPrefix = "";
514 this->WCharType = this->SignedLong;
515 // FIXME: WIntType should be SignedLong
516 }
517};
518
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519// Solaris target
520template<typename Target>
521class SolarisTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000525 DefineStd(Builder, "sun", Opts);
526 DefineStd(Builder, "unix", Opts);
527 Builder.defineMacro("__ELF__");
528 Builder.defineMacro("__svr4__");
529 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000530 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
531 // newer, but to 500 for everything else. feature_test.h has a check to
532 // ensure that you are not using C99 with an old version of X/Open or C89
533 // with a new version.
534 if (Opts.C99 || Opts.C11)
535 Builder.defineMacro("_XOPEN_SOURCE", "600");
536 else
537 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000538 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000539 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000540 Builder.defineMacro("_LARGEFILE_SOURCE");
541 Builder.defineMacro("_LARGEFILE64_SOURCE");
542 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000543 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000544 }
545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000546 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000547 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000548 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000549 // FIXME: WIntType should be SignedLong
550 }
551};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000552
553// Windows target
554template<typename Target>
555class WindowsTargetInfo : public OSTargetInfo<Target> {
556protected:
Craig Topper3164f332014-03-11 03:39:26 +0000557 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
558 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000559 Builder.defineMacro("_WIN32");
560 }
561 void getVisualStudioDefines(const LangOptions &Opts,
562 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000563 if (Opts.CPlusPlus) {
564 if (Opts.RTTI)
565 Builder.defineMacro("_CPPRTTI");
566
567 if (Opts.Exceptions)
568 Builder.defineMacro("_CPPUNWIND");
569 }
570
571 if (!Opts.CharIsSigned)
572 Builder.defineMacro("_CHAR_UNSIGNED");
573
574 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
575 // but it works for now.
576 if (Opts.POSIXThreads)
577 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000578
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000579 if (Opts.MSCVersion != 0)
580 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
581
582 if (Opts.MicrosoftExt) {
583 Builder.defineMacro("_MSC_EXTENSIONS");
584
585 if (Opts.CPlusPlus11) {
586 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
587 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
588 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
589 }
590 }
591
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000593 }
594
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000595public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000596 WindowsTargetInfo(const llvm::Triple &Triple)
597 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000598};
599
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000600template <typename Target>
601class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602protected:
Craig Topper3164f332014-03-11 03:39:26 +0000603 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
604 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000605 if (Opts.POSIXThreads)
606 Builder.defineMacro("_REENTRANT");
607 if (Opts.CPlusPlus)
608 Builder.defineMacro("_GNU_SOURCE");
609
610 DefineStd(Builder, "unix", Opts);
611 Builder.defineMacro("__ELF__");
612 Builder.defineMacro("__native_client__");
613 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000614
615public:
616 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000617 this->UserLabelPrefix = "";
618 this->LongAlign = 32;
619 this->LongWidth = 32;
620 this->PointerAlign = 32;
621 this->PointerWidth = 32;
622 this->IntMaxType = TargetInfo::SignedLongLong;
623 this->UIntMaxType = TargetInfo::UnsignedLongLong;
624 this->Int64Type = TargetInfo::SignedLongLong;
625 this->DoubleAlign = 64;
626 this->LongDoubleWidth = 64;
627 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000628 this->LongLongWidth = 64;
629 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000630 this->SizeType = TargetInfo::UnsignedInt;
631 this->PtrDiffType = TargetInfo::SignedInt;
632 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000633 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000634 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000635 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000636 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000637 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000638 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000639 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000640 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000641 } else if (Triple.getArch() == llvm::Triple::mipsel) {
642 // Handled on mips' setDescriptionString.
643 } else {
644 assert(Triple.getArch() == llvm::Triple::le32);
645 this->DescriptionString = "e-p:32:32-i64:64";
646 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000647 }
Craig Topper3164f332014-03-11 03:39:26 +0000648 typename Target::CallingConvCheckResult checkCallingConvention(
649 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000650 return CC == CC_PnaclCall ? Target::CCCR_OK :
651 Target::checkCallingConvention(CC);
652 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000653};
Mike Stump11289f42009-09-09 15:08:12 +0000654} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000655
Chris Lattner09d98f52008-10-05 21:50:58 +0000656//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000657// Specific target implementations.
658//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000659
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000660namespace {
661// PPC abstract base class
662class PPCTargetInfo : public TargetInfo {
663 static const Builtin::Info BuiltinInfo[];
664 static const char * const GCCRegNames[];
665 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000666 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000667
668 // Target cpu features.
669 bool HasVSX;
670
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000671public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000672 PPCTargetInfo(const llvm::Triple &Triple)
673 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000674 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000675 LongDoubleWidth = LongDoubleAlign = 128;
676 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
677 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000678
Hal Finkel6b984f02012-07-03 16:51:04 +0000679 /// \brief Flags for architecture specific defines.
680 typedef enum {
681 ArchDefineNone = 0,
682 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
683 ArchDefinePpcgr = 1 << 1,
684 ArchDefinePpcsq = 1 << 2,
685 ArchDefine440 = 1 << 3,
686 ArchDefine603 = 1 << 4,
687 ArchDefine604 = 1 << 5,
688 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000689 ArchDefinePwr5 = 1 << 7,
690 ArchDefinePwr5x = 1 << 8,
691 ArchDefinePwr6 = 1 << 9,
692 ArchDefinePwr6x = 1 << 10,
693 ArchDefinePwr7 = 1 << 11,
694 ArchDefineA2 = 1 << 12,
695 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000696 } ArchDefineTypes;
697
Bill Schmidt38378a02013-02-01 20:23:10 +0000698 // Note: GCC recognizes the following additional cpus:
699 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
700 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
701 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000702 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000703 bool CPUKnown = llvm::StringSwitch<bool>(Name)
704 .Case("generic", true)
705 .Case("440", true)
706 .Case("450", true)
707 .Case("601", true)
708 .Case("602", true)
709 .Case("603", true)
710 .Case("603e", true)
711 .Case("603ev", true)
712 .Case("604", true)
713 .Case("604e", true)
714 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000715 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000716 .Case("g3", true)
717 .Case("7400", true)
718 .Case("g4", true)
719 .Case("7450", true)
720 .Case("g4+", true)
721 .Case("750", true)
722 .Case("970", true)
723 .Case("g5", true)
724 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000725 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000726 .Case("e500mc", true)
727 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000728 .Case("power3", true)
729 .Case("pwr3", true)
730 .Case("power4", true)
731 .Case("pwr4", true)
732 .Case("power5", true)
733 .Case("pwr5", true)
734 .Case("power5x", true)
735 .Case("pwr5x", true)
736 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000737 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000738 .Case("power6x", true)
739 .Case("pwr6x", true)
740 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000741 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000742 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000743 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000744 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000745 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000746 .Case("powerpc64le", true)
747 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000748 .Default(false);
749
750 if (CPUKnown)
751 CPU = Name;
752
753 return CPUKnown;
754 }
755
Craig Topper3164f332014-03-11 03:39:26 +0000756 void getTargetBuiltins(const Builtin::Info *&Records,
757 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000758 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000759 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000760 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000761
Craig Topper3164f332014-03-11 03:39:26 +0000762 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000763
Craig Topper3164f332014-03-11 03:39:26 +0000764 void getTargetDefines(const LangOptions &Opts,
765 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000766
Craig Topper3164f332014-03-11 03:39:26 +0000767 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000768
Craig Topper3164f332014-03-11 03:39:26 +0000769 bool handleTargetFeatures(std::vector<std::string> &Features,
770 DiagnosticsEngine &Diags) override;
771 bool hasFeature(StringRef Feature) const override;
772
773 void getGCCRegNames(const char * const *&Names,
774 unsigned &NumNames) const override;
775 void getGCCRegAliases(const GCCRegAlias *&Aliases,
776 unsigned &NumAliases) const override;
777 bool validateAsmConstraint(const char *&Name,
778 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000779 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000780 default: return false;
781 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000782 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000783 case 'b': // Base register
784 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000785 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000786 break;
787 // FIXME: The following are added to allow parsing.
788 // I just took a guess at what the actions should be.
789 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000790 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000791 case 'v': // Altivec vector register
792 Info.setAllowsRegister();
793 break;
794 case 'w':
795 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000796 case 'd':// VSX vector register to hold vector double data
797 case 'f':// VSX vector register to hold vector float data
798 case 's':// VSX vector register to hold scalar float data
799 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000800 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000801 break;
802 default:
803 return false;
804 }
805 Info.setAllowsRegister();
806 Name++; // Skip over 'w'.
807 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'h': // `MQ', `CTR', or `LINK' register
809 case 'q': // `MQ' register
810 case 'c': // `CTR' register
811 case 'l': // `LINK' register
812 case 'x': // `CR' register (condition register) number 0
813 case 'y': // `CR' register (condition register)
814 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000815 Info.setAllowsRegister();
816 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000818 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // (use `L' instead for SImode constants)
820 case 'K': // Unsigned 16-bit constant
821 case 'L': // Signed 16-bit constant shifted left 16 bits
822 case 'M': // Constant larger than 31
823 case 'N': // Exact power of 2
824 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000825 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000826 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000827 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000828 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000829 break;
830 case 'm': // Memory operand. Note that on PowerPC targets, m can
831 // include addresses that update the base register. It
832 // is therefore only safe to use `m' in an asm statement
833 // if that asm statement accesses the operand exactly once.
834 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000835 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000837 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000838 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000839 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
840 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 // register to be updated.
842 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000843 if (Name[1] != 's')
844 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000845 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000846 // include any automodification of the base register. Unlike
847 // `m', this constraint can be used in asm statements that
848 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000849 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000850 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000851 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000855 case 'Z': // Memory operand that is an indexed or indirect from a
856 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000857 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000858 Info.setAllowsMemory();
859 Info.setAllowsRegister();
860 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000861 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000862 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000863 // register (`p' is preferable for asm statements)
864 case 'S': // Constant suitable as a 64-bit mask operand
865 case 'T': // Constant suitable as a 32-bit mask operand
866 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000867 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000868 // instructions
869 case 'W': // Vector constant that does not require memory
870 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000871 break;
872 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000873 }
John Thompson07a61a42010-06-24 22:44:13 +0000874 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000875 }
Craig Topper3164f332014-03-11 03:39:26 +0000876 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000877 std::string R;
878 switch (*Constraint) {
879 case 'e':
880 case 'w':
881 // Two-character constraint; add "^" hint for later parsing.
882 R = std::string("^") + std::string(Constraint, 2);
883 Constraint++;
884 break;
885 default:
886 return TargetInfo::convertConstraint(Constraint);
887 }
888 return R;
889 }
Craig Topper3164f332014-03-11 03:39:26 +0000890 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000891 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000892 }
Craig Topper3164f332014-03-11 03:39:26 +0000893 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000894 if (RegNo == 0) return 3;
895 if (RegNo == 1) return 4;
896 return -1;
897 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000898};
Anders Carlssonf511f642007-11-27 04:11:28 +0000899
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000900const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000901#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000902#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000903 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000904#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000905};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000906
Eric Christopher3ff21b32013-10-16 21:26:26 +0000907 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000908/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000909bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000910 DiagnosticsEngine &Diags) {
911 // Remember the maximum enabled sselevel.
912 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
913 // Ignore disabled features.
914 if (Features[i][0] == '-')
915 continue;
916
917 StringRef Feature = StringRef(Features[i]).substr(1);
918
919 if (Feature == "vsx") {
920 HasVSX = true;
921 continue;
922 }
923
924 // TODO: Finish this list and add an assert that we've handled them
925 // all.
926 }
927
928 return true;
929}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000930
Chris Lattnerecd49032009-03-02 22:27:17 +0000931/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
932/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000933void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000934 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000935 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000936 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000937 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000938 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000939 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000940 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000941 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000942 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000943 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000944 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000945 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000946 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000947
Chris Lattnerecd49032009-03-02 22:27:17 +0000948 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000949 if (getTriple().getArch() == llvm::Triple::ppc64le) {
950 Builder.defineMacro("_LITTLE_ENDIAN");
Will Schmidt22d24352014-03-24 17:27:03 +0000951 Builder.defineMacro("_CALL_ELF","2");
Bill Schmidt778d3872013-07-26 01:36:11 +0000952 } else {
953 if (getTriple().getOS() != llvm::Triple::NetBSD &&
954 getTriple().getOS() != llvm::Triple::OpenBSD)
955 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000956 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000957
Chris Lattnerecd49032009-03-02 22:27:17 +0000958 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("__NATURAL_ALIGNMENT__");
960 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000961
Chris Lattnerecd49032009-03-02 22:27:17 +0000962 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000963 if (LongDoubleWidth == 128)
964 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000965
John Thompsone467e192009-11-19 17:18:50 +0000966 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000967 Builder.defineMacro("__VEC__", "10206");
968 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000969 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000970
971 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000972 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
973 .Case("440", ArchDefineName)
974 .Case("450", ArchDefineName | ArchDefine440)
975 .Case("601", ArchDefineName)
976 .Case("602", ArchDefineName | ArchDefinePpcgr)
977 .Case("603", ArchDefineName | ArchDefinePpcgr)
978 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
979 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
980 .Case("604", ArchDefineName | ArchDefinePpcgr)
981 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
982 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000984 .Case("7400", ArchDefineName | ArchDefinePpcgr)
985 .Case("7450", ArchDefineName | ArchDefinePpcgr)
986 .Case("750", ArchDefineName | ArchDefinePpcgr)
987 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
988 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000989 .Case("a2", ArchDefineA2)
990 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000991 .Case("pwr3", ArchDefinePpcgr)
992 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
993 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
994 | ArchDefinePpcsq)
995 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
996 | ArchDefinePpcgr | ArchDefinePpcsq)
997 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
998 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
999 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1000 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1001 | ArchDefinePpcsq)
1002 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1003 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1004 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
1005 .Case("power3", ArchDefinePpcgr)
1006 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1007 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1008 | ArchDefinePpcsq)
1009 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1010 | ArchDefinePpcgr | ArchDefinePpcsq)
1011 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1012 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1013 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1014 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
1016 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1017 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1018 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001019 .Default(ArchDefineNone);
1020
1021 if (defs & ArchDefineName)
1022 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1023 if (defs & ArchDefinePpcgr)
1024 Builder.defineMacro("_ARCH_PPCGR");
1025 if (defs & ArchDefinePpcsq)
1026 Builder.defineMacro("_ARCH_PPCSQ");
1027 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001028 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001029 if (defs & ArchDefine603)
1030 Builder.defineMacro("_ARCH_603");
1031 if (defs & ArchDefine604)
1032 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001033 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001034 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001035 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001036 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001037 if (defs & ArchDefinePwr5x)
1038 Builder.defineMacro("_ARCH_PWR5X");
1039 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001040 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001041 if (defs & ArchDefinePwr6x)
1042 Builder.defineMacro("_ARCH_PWR6X");
1043 if (defs & ArchDefinePwr7)
1044 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001045 if (defs & ArchDefineA2)
1046 Builder.defineMacro("_ARCH_A2");
1047 if (defs & ArchDefineA2q) {
1048 Builder.defineMacro("_ARCH_A2Q");
1049 Builder.defineMacro("_ARCH_QP");
1050 }
1051
1052 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1053 Builder.defineMacro("__bg__");
1054 Builder.defineMacro("__THW_BLUEGENE__");
1055 Builder.defineMacro("__bgq__");
1056 Builder.defineMacro("__TOS_BGQ__");
1057 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001058
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001059 if (HasVSX)
1060 Builder.defineMacro("__VSX__");
1061
Bill Schmidt38378a02013-02-01 20:23:10 +00001062 // FIXME: The following are not yet generated here by Clang, but are
1063 // generated by GCC:
1064 //
1065 // _SOFT_FLOAT_
1066 // __RECIP_PRECISION__
1067 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 // __RECIP__
1069 // __RECIPF__
1070 // __RSQRTE__
1071 // __RSQRTEF__
1072 // _SOFT_DOUBLE_
1073 // __NO_LWSYNC__
1074 // __HAVE_BSWAP__
1075 // __LONGDOUBLE128
1076 // __CMODEL_MEDIUM__
1077 // __CMODEL_LARGE__
1078 // _CALL_SYSV
1079 // _CALL_DARWIN
1080 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001081}
1082
1083void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1084 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1085 .Case("7400", true)
1086 .Case("g4", true)
1087 .Case("7450", true)
1088 .Case("g4+", true)
1089 .Case("970", true)
1090 .Case("g5", true)
1091 .Case("pwr6", true)
1092 .Case("pwr7", true)
1093 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001094 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001095 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001096
1097 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001098}
1099
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001100bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1101 return Feature == "powerpc";
1102}
Chris Lattner17df24e2008-04-21 18:56:49 +00001103
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001104
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001105const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001106 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1107 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1108 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1109 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1110 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1111 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1112 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1113 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001114 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001115 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001117 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1118 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1119 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1120 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001121 "vrsave", "vscr",
1122 "spe_acc", "spefscr",
1123 "sfp"
1124};
Chris Lattner10a5b382007-01-29 05:24:35 +00001125
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001126void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001127 unsigned &NumNames) const {
1128 Names = GCCRegNames;
1129 NumNames = llvm::array_lengthof(GCCRegNames);
1130}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001131
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001132const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1133 // While some of these aliases do map to different registers
1134 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001135 { { "0" }, "r0" },
1136 { { "1"}, "r1" },
1137 { { "2" }, "r2" },
1138 { { "3" }, "r3" },
1139 { { "4" }, "r4" },
1140 { { "5" }, "r5" },
1141 { { "6" }, "r6" },
1142 { { "7" }, "r7" },
1143 { { "8" }, "r8" },
1144 { { "9" }, "r9" },
1145 { { "10" }, "r10" },
1146 { { "11" }, "r11" },
1147 { { "12" }, "r12" },
1148 { { "13" }, "r13" },
1149 { { "14" }, "r14" },
1150 { { "15" }, "r15" },
1151 { { "16" }, "r16" },
1152 { { "17" }, "r17" },
1153 { { "18" }, "r18" },
1154 { { "19" }, "r19" },
1155 { { "20" }, "r20" },
1156 { { "21" }, "r21" },
1157 { { "22" }, "r22" },
1158 { { "23" }, "r23" },
1159 { { "24" }, "r24" },
1160 { { "25" }, "r25" },
1161 { { "26" }, "r26" },
1162 { { "27" }, "r27" },
1163 { { "28" }, "r28" },
1164 { { "29" }, "r29" },
1165 { { "30" }, "r30" },
1166 { { "31" }, "r31" },
1167 { { "fr0" }, "f0" },
1168 { { "fr1" }, "f1" },
1169 { { "fr2" }, "f2" },
1170 { { "fr3" }, "f3" },
1171 { { "fr4" }, "f4" },
1172 { { "fr5" }, "f5" },
1173 { { "fr6" }, "f6" },
1174 { { "fr7" }, "f7" },
1175 { { "fr8" }, "f8" },
1176 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001177 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001178 { { "fr11" }, "f11" },
1179 { { "fr12" }, "f12" },
1180 { { "fr13" }, "f13" },
1181 { { "fr14" }, "f14" },
1182 { { "fr15" }, "f15" },
1183 { { "fr16" }, "f16" },
1184 { { "fr17" }, "f17" },
1185 { { "fr18" }, "f18" },
1186 { { "fr19" }, "f19" },
1187 { { "fr20" }, "f20" },
1188 { { "fr21" }, "f21" },
1189 { { "fr22" }, "f22" },
1190 { { "fr23" }, "f23" },
1191 { { "fr24" }, "f24" },
1192 { { "fr25" }, "f25" },
1193 { { "fr26" }, "f26" },
1194 { { "fr27" }, "f27" },
1195 { { "fr28" }, "f28" },
1196 { { "fr29" }, "f29" },
1197 { { "fr30" }, "f30" },
1198 { { "fr31" }, "f31" },
1199 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001200};
1201
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001202void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001203 unsigned &NumAliases) const {
1204 Aliases = GCCRegAliases;
1205 NumAliases = llvm::array_lengthof(GCCRegAliases);
1206}
1207} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001208
Chris Lattner5ba61f02006-10-14 07:39:34 +00001209namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001210class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001211public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001212 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001213 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001214
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001215 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001216 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001217 case llvm::Triple::FreeBSD:
1218 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001219 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001220 PtrDiffType = SignedInt;
1221 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001222 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001223 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001224 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001225 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001226
Roman Divacky3ffe7462012-03-13 19:20:17 +00001227 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1228 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001229 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001230 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001231
1232 // PPC32 supports atomics up to 4 bytes.
1233 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001234 }
1235
Craig Topper3164f332014-03-11 03:39:26 +00001236 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001237 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001238 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001239 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001240};
1241} // end anonymous namespace.
1242
Bill Schmidt778d3872013-07-26 01:36:11 +00001243// Note: ABI differences may eventually require us to have a separate
1244// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001245namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001246class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001247public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001248 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001249 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001250 IntMaxType = SignedLong;
1251 UIntMaxType = UnsignedLong;
1252 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001253
Roman Divacky3ffe7462012-03-13 19:20:17 +00001254 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1255 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001256 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001257 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001258 } else {
1259 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1260 DescriptionString = "e-m:e-i64:64-n32:64";
1261 } else {
1262 DescriptionString = "E-m:e-i64:64-n32:64";
1263 }
1264}
Benjamin Kramer37196de2012-11-17 17:30:55 +00001265
1266 // PPC64 supports atomics up to 8 bytes.
1267 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001268 }
Craig Topper3164f332014-03-11 03:39:26 +00001269 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001270 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001271 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272};
1273} // end anonymous namespace.
1274
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001275
1276namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001277class DarwinPPC32TargetInfo :
1278 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001279public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001280 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1281 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001282 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001283 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001284 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001285 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001286 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001287 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001288 }
Craig Topper3164f332014-03-11 03:39:26 +00001289 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001290 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001291 }
1292};
1293
1294class DarwinPPC64TargetInfo :
1295 public DarwinTargetInfo<PPC64TargetInfo> {
1296public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001297 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1298 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001299 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001300 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001301 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001302 }
1303};
1304} // end anonymous namespace.
1305
Chris Lattner5ba61f02006-10-14 07:39:34 +00001306namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001307 static const unsigned NVPTXAddrSpaceMap[] = {
1308 1, // opencl_global
1309 3, // opencl_local
1310 4, // opencl_constant
1311 1, // cuda_device
1312 4, // cuda_constant
1313 3, // cuda_shared
1314 };
1315 class NVPTXTargetInfo : public TargetInfo {
1316 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001317 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001318 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001319 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001320 BigEndian = false;
1321 TLSSupported = false;
1322 LongWidth = LongAlign = 64;
1323 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001324 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001325 // Define available target features
1326 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001327 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001328 }
Craig Topper3164f332014-03-11 03:39:26 +00001329 void getTargetDefines(const LangOptions &Opts,
1330 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001331 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001332 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001333 }
Craig Topper3164f332014-03-11 03:39:26 +00001334 void getTargetBuiltins(const Builtin::Info *&Records,
1335 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001336 Records = BuiltinInfo;
1337 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001338 }
Craig Topper3164f332014-03-11 03:39:26 +00001339 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001340 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001341 }
Craig Topper3164f332014-03-11 03:39:26 +00001342
1343 void getGCCRegNames(const char * const *&Names,
1344 unsigned &NumNames) const override;
1345 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1346 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001347 // No aliases.
1348 Aliases = 0;
1349 NumAliases = 0;
1350 }
Craig Topper3164f332014-03-11 03:39:26 +00001351 bool validateAsmConstraint(const char *&Name,
1352 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001353 switch (*Name) {
1354 default: return false;
1355 case 'c':
1356 case 'h':
1357 case 'r':
1358 case 'l':
1359 case 'f':
1360 case 'd':
1361 Info.setAllowsRegister();
1362 return true;
1363 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001364 }
Craig Topper3164f332014-03-11 03:39:26 +00001365 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001366 // FIXME: Is this really right?
1367 return "";
1368 }
Craig Topper3164f332014-03-11 03:39:26 +00001369 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001370 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001371 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001372 }
Craig Topper3164f332014-03-11 03:39:26 +00001373 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001374 bool Valid = llvm::StringSwitch<bool>(Name)
1375 .Case("sm_20", true)
1376 .Case("sm_21", true)
1377 .Case("sm_30", true)
1378 .Case("sm_35", true)
1379 .Default(false);
1380
1381 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001382 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001383 };
1384
1385 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1386#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1387#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1388 ALL_LANGUAGES },
1389#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 };
1391
1392 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1393 "r0"
1394 };
1395
1396 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1397 unsigned &NumNames) const {
1398 Names = GCCRegNames;
1399 NumNames = llvm::array_lengthof(GCCRegNames);
1400 }
1401
1402 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1403 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001404 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001406 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001407 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001408 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001409 };
1410
1411 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1412 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001413 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001414 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001415 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001416 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001417 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001418 };
1419}
1420
1421namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001422
1423static const unsigned R600AddrSpaceMap[] = {
1424 1, // opencl_global
1425 3, // opencl_local
1426 2, // opencl_constant
1427 1, // cuda_device
1428 2, // cuda_constant
1429 3 // cuda_shared
1430};
1431
Tom Stellardc74b1e02013-03-04 17:40:53 +00001432static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001433 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1434 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001435
1436static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001437 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1438 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001439
1440static const char *DescriptionStringSI =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001441 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
1442 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1443 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001444
Eli Friedmand13b41e2012-10-12 23:32:00 +00001445class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001446 /// \brief The GPU profiles supported by the R600 target.
1447 enum GPUKind {
1448 GK_NONE,
1449 GK_R600,
1450 GK_R600_DOUBLE_OPS,
1451 GK_R700,
1452 GK_R700_DOUBLE_OPS,
1453 GK_EVERGREEN,
1454 GK_EVERGREEN_DOUBLE_OPS,
1455 GK_NORTHERN_ISLANDS,
1456 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001457 GK_SOUTHERN_ISLANDS,
1458 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001459 } GPU;
1460
Eli Friedmand13b41e2012-10-12 23:32:00 +00001461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001462 R600TargetInfo(const llvm::Triple &Triple)
1463 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001464 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001465 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001466 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001467 }
1468
Craig Topper3164f332014-03-11 03:39:26 +00001469 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001470 return "";
1471 }
1472
Craig Topper3164f332014-03-11 03:39:26 +00001473 void getGCCRegNames(const char * const *&Names,
1474 unsigned &numNames) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001475 Names = NULL;
1476 numNames = 0;
1477 }
1478
Craig Topper3164f332014-03-11 03:39:26 +00001479 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1480 unsigned &NumAliases) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001481 Aliases = NULL;
1482 NumAliases = 0;
1483 }
1484
Craig Topper3164f332014-03-11 03:39:26 +00001485 bool validateAsmConstraint(const char *&Name,
1486 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001487 return true;
1488 }
1489
Craig Topper3164f332014-03-11 03:39:26 +00001490 void getTargetBuiltins(const Builtin::Info *&Records,
1491 unsigned &NumRecords) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001492 Records = NULL;
1493 NumRecords = 0;
1494 }
1495
1496
Craig Topper3164f332014-03-11 03:39:26 +00001497 void getTargetDefines(const LangOptions &Opts,
1498 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001499 Builder.defineMacro("__R600__");
1500 }
1501
Craig Topper3164f332014-03-11 03:39:26 +00001502 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001503 return TargetInfo::CharPtrBuiltinVaList;
1504 }
1505
Craig Topper3164f332014-03-11 03:39:26 +00001506 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001507 GPU = llvm::StringSwitch<GPUKind>(Name)
1508 .Case("r600" , GK_R600)
1509 .Case("rv610", GK_R600)
1510 .Case("rv620", GK_R600)
1511 .Case("rv630", GK_R600)
1512 .Case("rv635", GK_R600)
1513 .Case("rs780", GK_R600)
1514 .Case("rs880", GK_R600)
1515 .Case("rv670", GK_R600_DOUBLE_OPS)
1516 .Case("rv710", GK_R700)
1517 .Case("rv730", GK_R700)
1518 .Case("rv740", GK_R700_DOUBLE_OPS)
1519 .Case("rv770", GK_R700_DOUBLE_OPS)
1520 .Case("palm", GK_EVERGREEN)
1521 .Case("cedar", GK_EVERGREEN)
1522 .Case("sumo", GK_EVERGREEN)
1523 .Case("sumo2", GK_EVERGREEN)
1524 .Case("redwood", GK_EVERGREEN)
1525 .Case("juniper", GK_EVERGREEN)
1526 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1527 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1528 .Case("barts", GK_NORTHERN_ISLANDS)
1529 .Case("turks", GK_NORTHERN_ISLANDS)
1530 .Case("caicos", GK_NORTHERN_ISLANDS)
1531 .Case("cayman", GK_CAYMAN)
1532 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001533 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001534 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1535 .Case("verde", GK_SOUTHERN_ISLANDS)
1536 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001537 .Case("bonaire", GK_SEA_ISLANDS)
1538 .Case("kabini", GK_SEA_ISLANDS)
1539 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001540 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001541 .Default(GK_NONE);
1542
1543 if (GPU == GK_NONE) {
1544 return false;
1545 }
1546
1547 // Set the correct data layout
1548 switch (GPU) {
1549 case GK_NONE:
1550 case GK_R600:
1551 case GK_R700:
1552 case GK_EVERGREEN:
1553 case GK_NORTHERN_ISLANDS:
1554 DescriptionString = DescriptionStringR600;
1555 break;
1556 case GK_R600_DOUBLE_OPS:
1557 case GK_R700_DOUBLE_OPS:
1558 case GK_EVERGREEN_DOUBLE_OPS:
1559 case GK_CAYMAN:
1560 DescriptionString = DescriptionStringR600DoubleOps;
1561 break;
1562 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001563 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001564 DescriptionString = DescriptionStringSI;
1565 break;
1566 }
1567
1568 return true;
1569 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001570};
1571
1572} // end anonymous namespace
1573
1574namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001575// Namespace for x86 abstract base class
1576const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001577#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001578#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001579 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001580#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001581};
Eli Friedmanb5366062008-05-20 14:21:01 +00001582
Nuno Lopescfca1f02009-12-23 17:49:57 +00001583static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001584 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1585 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001586 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001587 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1588 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1589 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001590 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001591 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1592 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001593};
1594
Eric Christophercdd36352011-06-21 00:05:20 +00001595const TargetInfo::AddlRegName AddlRegNames[] = {
1596 { { "al", "ah", "eax", "rax" }, 0 },
1597 { { "bl", "bh", "ebx", "rbx" }, 3 },
1598 { { "cl", "ch", "ecx", "rcx" }, 2 },
1599 { { "dl", "dh", "edx", "rdx" }, 1 },
1600 { { "esi", "rsi" }, 4 },
1601 { { "edi", "rdi" }, 5 },
1602 { { "esp", "rsp" }, 7 },
1603 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001604};
1605
1606// X86 target abstract base class; x86-32 and x86-64 are very close, so
1607// most of the implementation can be shared.
1608class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001609 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001610 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001611 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001612 enum MMX3DNowEnum {
1613 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1614 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001615 enum XOPEnum {
1616 NoXOP,
1617 SSE4A,
1618 FMA4,
1619 XOP
1620 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001621
Eric Christophere1ddaf92010-04-02 23:50:19 +00001622 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001623 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001624 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001625 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001626 bool HasBMI;
1627 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001628 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001629 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001630 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001631 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001632 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001633 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001634 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001635 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001636 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001637 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001638
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001639 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1640 ///
1641 /// Each enumeration represents a particular CPU supported by Clang. These
1642 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1643 enum CPUKind {
1644 CK_Generic,
1645
1646 /// \name i386
1647 /// i386-generation processors.
1648 //@{
1649 CK_i386,
1650 //@}
1651
1652 /// \name i486
1653 /// i486-generation processors.
1654 //@{
1655 CK_i486,
1656 CK_WinChipC6,
1657 CK_WinChip2,
1658 CK_C3,
1659 //@}
1660
1661 /// \name i586
1662 /// i586-generation processors, P5 microarchitecture based.
1663 //@{
1664 CK_i586,
1665 CK_Pentium,
1666 CK_PentiumMMX,
1667 //@}
1668
1669 /// \name i686
1670 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1671 //@{
1672 CK_i686,
1673 CK_PentiumPro,
1674 CK_Pentium2,
1675 CK_Pentium3,
1676 CK_Pentium3M,
1677 CK_PentiumM,
1678 CK_C3_2,
1679
1680 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1681 /// Clang however has some logic to suport this.
1682 // FIXME: Warn, deprecate, and potentially remove this.
1683 CK_Yonah,
1684 //@}
1685
1686 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001687 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001688 //@{
1689 CK_Pentium4,
1690 CK_Pentium4M,
1691 CK_Prescott,
1692 CK_Nocona,
1693 //@}
1694
1695 /// \name Core
1696 /// Core microarchitecture based processors.
1697 //@{
1698 CK_Core2,
1699
1700 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1701 /// codename which GCC no longer accepts as an option to -march, but Clang
1702 /// has some logic for recognizing it.
1703 // FIXME: Warn, deprecate, and potentially remove this.
1704 CK_Penryn,
1705 //@}
1706
1707 /// \name Atom
1708 /// Atom processors
1709 //@{
1710 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001711 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001712 //@}
1713
1714 /// \name Nehalem
1715 /// Nehalem microarchitecture based processors.
1716 //@{
1717 CK_Corei7,
1718 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001719 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001720 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001721 //@}
1722
Craig Topper449314e2013-08-20 07:09:39 +00001723 /// \name Knights Landing
1724 /// Knights Landing processor.
1725 CK_KNL,
1726
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001727 /// \name K6
1728 /// K6 architecture processors.
1729 //@{
1730 CK_K6,
1731 CK_K6_2,
1732 CK_K6_3,
1733 //@}
1734
1735 /// \name K7
1736 /// K7 architecture processors.
1737 //@{
1738 CK_Athlon,
1739 CK_AthlonThunderbird,
1740 CK_Athlon4,
1741 CK_AthlonXP,
1742 CK_AthlonMP,
1743 //@}
1744
1745 /// \name K8
1746 /// K8 architecture processors.
1747 //@{
1748 CK_Athlon64,
1749 CK_Athlon64SSE3,
1750 CK_AthlonFX,
1751 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001752 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001753 CK_Opteron,
1754 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001755 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001756 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001757
Benjamin Kramer569f2152012-01-10 11:50:18 +00001758 /// \name Bobcat
1759 /// Bobcat architecture processors.
1760 //@{
1761 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001762 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001763 //@}
1764
1765 /// \name Bulldozer
1766 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001767 //@{
1768 CK_BDVER1,
1769 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001770 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001771 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001772
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001773 /// This specification is deprecated and will be removed in the future.
1774 /// Users should prefer \see CK_K8.
1775 // FIXME: Warn on this when the CPU is set to it.
1776 CK_x86_64,
1777 //@}
1778
1779 /// \name Geode
1780 /// Geode processors.
1781 //@{
1782 CK_Geode
1783 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001784 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001785
Rafael Espindolaeb265472013-08-21 21:59:03 +00001786 enum FPMathKind {
1787 FP_Default,
1788 FP_SSE,
1789 FP_387
1790 } FPMath;
1791
Eli Friedman3fd920a2008-08-20 02:34:37 +00001792public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001793 X86TargetInfo(const llvm::Triple &Triple)
1794 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001795 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1796 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001797 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1798 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001799 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1800 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001801 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001802 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001803 }
Craig Topper3164f332014-03-11 03:39:26 +00001804 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001805 // X87 evaluates with 80 bits "long double" precision.
1806 return SSELevel == NoSSE ? 2 : 0;
1807 }
Craig Topper3164f332014-03-11 03:39:26 +00001808 void getTargetBuiltins(const Builtin::Info *&Records,
1809 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001810 Records = BuiltinInfo;
1811 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001812 }
Craig Topper3164f332014-03-11 03:39:26 +00001813 void getGCCRegNames(const char * const *&Names,
1814 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001815 Names = GCCRegNames;
1816 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001817 }
Craig Topper3164f332014-03-11 03:39:26 +00001818 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1819 unsigned &NumAliases) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001820 Aliases = 0;
1821 NumAliases = 0;
1822 }
Craig Topper3164f332014-03-11 03:39:26 +00001823 void getGCCAddlRegNames(const AddlRegName *&Names,
1824 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001825 Names = AddlRegNames;
1826 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001827 }
Craig Topper3164f332014-03-11 03:39:26 +00001828 bool validateAsmConstraint(const char *&Name,
1829 TargetInfo::ConstraintInfo &info) const override;
1830 std::string convertConstraint(const char *&Constraint) const override;
1831 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001832 return "~{dirflag},~{fpsr},~{flags}";
1833 }
Craig Topper3164f332014-03-11 03:39:26 +00001834 void getTargetDefines(const LangOptions &Opts,
1835 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001836 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1837 bool Enabled);
1838 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1839 bool Enabled);
1840 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1841 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001842 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1843 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001844 setFeatureEnabledImpl(Features, Name, Enabled);
1845 }
1846 // This exists purely to cut down on the number of virtual calls in
1847 // getDefaultFeatures which calls this repeatedly.
1848 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1849 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001850 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1851 bool hasFeature(StringRef Feature) const override;
1852 bool handleTargetFeatures(std::vector<std::string> &Features,
1853 DiagnosticsEngine &Diags) override;
1854 const char* getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001855 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001856 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001857 else if (getTriple().getArch() == llvm::Triple::x86 &&
1858 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001859 return "no-mmx";
1860 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001861 }
Craig Topper3164f332014-03-11 03:39:26 +00001862 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001863 CPU = llvm::StringSwitch<CPUKind>(Name)
1864 .Case("i386", CK_i386)
1865 .Case("i486", CK_i486)
1866 .Case("winchip-c6", CK_WinChipC6)
1867 .Case("winchip2", CK_WinChip2)
1868 .Case("c3", CK_C3)
1869 .Case("i586", CK_i586)
1870 .Case("pentium", CK_Pentium)
1871 .Case("pentium-mmx", CK_PentiumMMX)
1872 .Case("i686", CK_i686)
1873 .Case("pentiumpro", CK_PentiumPro)
1874 .Case("pentium2", CK_Pentium2)
1875 .Case("pentium3", CK_Pentium3)
1876 .Case("pentium3m", CK_Pentium3M)
1877 .Case("pentium-m", CK_PentiumM)
1878 .Case("c3-2", CK_C3_2)
1879 .Case("yonah", CK_Yonah)
1880 .Case("pentium4", CK_Pentium4)
1881 .Case("pentium4m", CK_Pentium4M)
1882 .Case("prescott", CK_Prescott)
1883 .Case("nocona", CK_Nocona)
1884 .Case("core2", CK_Core2)
1885 .Case("penryn", CK_Penryn)
1886 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001887 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001888 .Case("corei7", CK_Corei7)
1889 .Case("corei7-avx", CK_Corei7AVX)
1890 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001891 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001892 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001893 .Case("k6", CK_K6)
1894 .Case("k6-2", CK_K6_2)
1895 .Case("k6-3", CK_K6_3)
1896 .Case("athlon", CK_Athlon)
1897 .Case("athlon-tbird", CK_AthlonThunderbird)
1898 .Case("athlon-4", CK_Athlon4)
1899 .Case("athlon-xp", CK_AthlonXP)
1900 .Case("athlon-mp", CK_AthlonMP)
1901 .Case("athlon64", CK_Athlon64)
1902 .Case("athlon64-sse3", CK_Athlon64SSE3)
1903 .Case("athlon-fx", CK_AthlonFX)
1904 .Case("k8", CK_K8)
1905 .Case("k8-sse3", CK_K8SSE3)
1906 .Case("opteron", CK_Opteron)
1907 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001908 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001909 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001910 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001911 .Case("bdver1", CK_BDVER1)
1912 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001913 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001914 .Case("x86-64", CK_x86_64)
1915 .Case("geode", CK_Geode)
1916 .Default(CK_Generic);
1917
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001918 // Perform any per-CPU checks necessary to determine if this CPU is
1919 // acceptable.
1920 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1921 // invalid without explaining *why*.
1922 switch (CPU) {
1923 case CK_Generic:
1924 // No processor selected!
1925 return false;
1926
1927 case CK_i386:
1928 case CK_i486:
1929 case CK_WinChipC6:
1930 case CK_WinChip2:
1931 case CK_C3:
1932 case CK_i586:
1933 case CK_Pentium:
1934 case CK_PentiumMMX:
1935 case CK_i686:
1936 case CK_PentiumPro:
1937 case CK_Pentium2:
1938 case CK_Pentium3:
1939 case CK_Pentium3M:
1940 case CK_PentiumM:
1941 case CK_Yonah:
1942 case CK_C3_2:
1943 case CK_Pentium4:
1944 case CK_Pentium4M:
1945 case CK_Prescott:
1946 case CK_K6:
1947 case CK_K6_2:
1948 case CK_K6_3:
1949 case CK_Athlon:
1950 case CK_AthlonThunderbird:
1951 case CK_Athlon4:
1952 case CK_AthlonXP:
1953 case CK_AthlonMP:
1954 case CK_Geode:
1955 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001956 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001957 return false;
1958
1959 // Fallthrough
1960 case CK_Nocona:
1961 case CK_Core2:
1962 case CK_Penryn:
1963 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001964 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001965 case CK_Corei7:
1966 case CK_Corei7AVX:
1967 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001968 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001969 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001970 case CK_Athlon64:
1971 case CK_Athlon64SSE3:
1972 case CK_AthlonFX:
1973 case CK_K8:
1974 case CK_K8SSE3:
1975 case CK_Opteron:
1976 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001977 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001978 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001979 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001980 case CK_BDVER1:
1981 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001982 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001983 case CK_x86_64:
1984 return true;
1985 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001986 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001987 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001988
Craig Topper3164f332014-03-11 03:39:26 +00001989 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00001990
Craig Topper3164f332014-03-11 03:39:26 +00001991 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001992 // We accept all non-ARM calling conventions
1993 return (CC == CC_X86ThisCall ||
1994 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001995 CC == CC_X86StdCall ||
1996 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001997 CC == CC_X86Pascal ||
1998 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001999 }
2000
Craig Topper3164f332014-03-11 03:39:26 +00002001 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002002 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002003 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002004};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002005
Rafael Espindolaeb265472013-08-21 21:59:03 +00002006bool X86TargetInfo::setFPMath(StringRef Name) {
2007 if (Name == "387") {
2008 FPMath = FP_387;
2009 return true;
2010 }
2011 if (Name == "sse") {
2012 FPMath = FP_SSE;
2013 return true;
2014 }
2015 return false;
2016}
2017
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002018void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002019 // FIXME: This *really* should not be here.
2020
2021 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002022 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002023 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002024
Chandler Carruth212334f2011-09-28 08:55:37 +00002025 switch (CPU) {
2026 case CK_Generic:
2027 case CK_i386:
2028 case CK_i486:
2029 case CK_i586:
2030 case CK_Pentium:
2031 case CK_i686:
2032 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002033 break;
2034 case CK_PentiumMMX:
2035 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002036 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002037 break;
2038 case CK_Pentium3:
2039 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002040 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002041 break;
2042 case CK_PentiumM:
2043 case CK_Pentium4:
2044 case CK_Pentium4M:
2045 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002046 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002047 break;
2048 case CK_Yonah:
2049 case CK_Prescott:
2050 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002051 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002052 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002053 break;
2054 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002056 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002057 break;
2058 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002059 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002060 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002061 break;
2062 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002063 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002064 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002065 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002066 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002067 setFeatureEnabledImpl(Features, "sse4.2", true);
2068 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002069 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002070 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002071 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002072 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002074 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 break;
2076 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "avx", true);
2078 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002079 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002080 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002081 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002082 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002083 setFeatureEnabledImpl(Features, "avx", true);
2084 setFeatureEnabledImpl(Features, "aes", true);
2085 setFeatureEnabledImpl(Features, "pclmul", true);
2086 setFeatureEnabledImpl(Features, "rdrnd", true);
2087 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002088 break;
Craig Topper865fff52011-12-17 19:55:21 +00002089 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002090 setFeatureEnabledImpl(Features, "avx2", true);
2091 setFeatureEnabledImpl(Features, "aes", true);
2092 setFeatureEnabledImpl(Features, "pclmul", true);
2093 setFeatureEnabledImpl(Features, "lzcnt", true);
2094 setFeatureEnabledImpl(Features, "rdrnd", true);
2095 setFeatureEnabledImpl(Features, "f16c", true);
2096 setFeatureEnabledImpl(Features, "bmi", true);
2097 setFeatureEnabledImpl(Features, "bmi2", true);
2098 setFeatureEnabledImpl(Features, "rtm", true);
2099 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002100 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002101 break;
Craig Topper449314e2013-08-20 07:09:39 +00002102 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002103 setFeatureEnabledImpl(Features, "avx512f", true);
2104 setFeatureEnabledImpl(Features, "avx512cd", true);
2105 setFeatureEnabledImpl(Features, "avx512er", true);
2106 setFeatureEnabledImpl(Features, "avx512pf", true);
2107 setFeatureEnabledImpl(Features, "aes", true);
2108 setFeatureEnabledImpl(Features, "pclmul", true);
2109 setFeatureEnabledImpl(Features, "lzcnt", true);
2110 setFeatureEnabledImpl(Features, "rdrnd", true);
2111 setFeatureEnabledImpl(Features, "f16c", true);
2112 setFeatureEnabledImpl(Features, "bmi", true);
2113 setFeatureEnabledImpl(Features, "bmi2", true);
2114 setFeatureEnabledImpl(Features, "rtm", true);
2115 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002116 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002117 case CK_K6:
2118 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002119 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 break;
2121 case CK_K6_2:
2122 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002123 case CK_WinChip2:
2124 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002125 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002127 case CK_Athlon:
2128 case CK_AthlonThunderbird:
2129 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002131 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002132 case CK_Athlon4:
2133 case CK_AthlonXP:
2134 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002135 setFeatureEnabledImpl(Features, "sse", true);
2136 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002137 break;
2138 case CK_K8:
2139 case CK_Opteron:
2140 case CK_Athlon64:
2141 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002142 setFeatureEnabledImpl(Features, "sse2", true);
2143 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002144 break;
2145 case CK_K8SSE3:
2146 case CK_OpteronSSE3:
2147 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "sse3", true);
2149 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002150 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002151 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002152 setFeatureEnabledImpl(Features, "sse3", true);
2153 setFeatureEnabledImpl(Features, "sse4a", true);
2154 setFeatureEnabledImpl(Features, "3dnowa", true);
2155 setFeatureEnabledImpl(Features, "lzcnt", true);
2156 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002157 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002158 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002159 setFeatureEnabledImpl(Features, "ssse3", true);
2160 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002161 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "lzcnt", true);
2163 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002164 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002165 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002166 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "avx", true);
2168 setFeatureEnabledImpl(Features, "sse4a", true);
2169 setFeatureEnabledImpl(Features, "lzcnt", true);
2170 setFeatureEnabledImpl(Features, "aes", true);
2171 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002172 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "bmi", true);
2174 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002175 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002176 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002177 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002178 setFeatureEnabledImpl(Features, "xop", true);
2179 setFeatureEnabledImpl(Features, "lzcnt", true);
2180 setFeatureEnabledImpl(Features, "aes", true);
2181 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002182 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002183 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002184 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002185 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002186 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "xop", true);
2188 setFeatureEnabledImpl(Features, "lzcnt", true);
2189 setFeatureEnabledImpl(Features, "aes", true);
2190 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002191 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002192 setFeatureEnabledImpl(Features, "bmi", true);
2193 setFeatureEnabledImpl(Features, "fma", true);
2194 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002195 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002196 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002197 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002198 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002199 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002200 break;
Eli Friedman33465822011-07-08 23:31:17 +00002201 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002202}
2203
Rafael Espindolae62e2792013-08-20 13:44:29 +00002204void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002205 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002206 if (Enabled) {
2207 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002208 case AVX512F:
2209 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002210 case AVX2:
2211 Features["avx2"] = true;
2212 case AVX:
2213 Features["avx"] = true;
2214 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002215 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002216 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002217 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002218 case SSSE3:
2219 Features["ssse3"] = true;
2220 case SSE3:
2221 Features["sse3"] = true;
2222 case SSE2:
2223 Features["sse2"] = true;
2224 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002225 Features["sse"] = true;
2226 case NoSSE:
2227 break;
2228 }
2229 return;
2230 }
2231
2232 switch (Level) {
2233 case NoSSE:
2234 case SSE1:
2235 Features["sse"] = false;
2236 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002237 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2238 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002239 case SSE3:
2240 Features["sse3"] = false;
2241 setXOPLevel(Features, NoXOP, false);
2242 case SSSE3:
2243 Features["ssse3"] = false;
2244 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002245 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002247 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002248 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002249 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002250 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002251 case AVX2:
2252 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002253 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002254 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2255 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002256 }
2257}
2258
2259void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002260 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002261 if (Enabled) {
2262 switch (Level) {
2263 case AMD3DNowAthlon:
2264 Features["3dnowa"] = true;
2265 case AMD3DNow:
2266 Features["3dnow"] = true;
2267 case MMX:
2268 Features["mmx"] = true;
2269 case NoMMX3DNow:
2270 break;
2271 }
2272 return;
2273 }
2274
2275 switch (Level) {
2276 case NoMMX3DNow:
2277 case MMX:
2278 Features["mmx"] = false;
2279 case AMD3DNow:
2280 Features["3dnow"] = false;
2281 case AMD3DNowAthlon:
2282 Features["3dnowa"] = false;
2283 }
2284}
2285
2286void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002287 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002288 if (Enabled) {
2289 switch (Level) {
2290 case XOP:
2291 Features["xop"] = true;
2292 case FMA4:
2293 Features["fma4"] = true;
2294 setSSELevel(Features, AVX, true);
2295 case SSE4A:
2296 Features["sse4a"] = true;
2297 setSSELevel(Features, SSE3, true);
2298 case NoXOP:
2299 break;
2300 }
2301 return;
2302 }
2303
2304 switch (Level) {
2305 case NoXOP:
2306 case SSE4A:
2307 Features["sse4a"] = false;
2308 case FMA4:
2309 Features["fma4"] = false;
2310 case XOP:
2311 Features["xop"] = false;
2312 }
2313}
2314
Craig Topper86d79ef2013-09-17 04:51:29 +00002315void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2316 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002317 // FIXME: This *really* should not be here. We need some way of translating
2318 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002319 if (Name == "sse4")
2320 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002321
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002323
Craig Topper29561122013-09-19 01:13:07 +00002324 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002326 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002328 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002330 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002331 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002332 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002333 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002334 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002335 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002336 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002337 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002338 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002340 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002341 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002342 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002343 if (Enabled)
2344 setSSELevel(Features, SSE2, Enabled);
2345 } else if (Name == "pclmul") {
2346 if (Enabled)
2347 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002348 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002349 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002350 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002352 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002353 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002354 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002355 if (Enabled)
2356 setSSELevel(Features, AVX512F, Enabled);
2357 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002358 if (Enabled)
2359 setSSELevel(Features, AVX, Enabled);
2360 } else if (Name == "fma4") {
2361 setXOPLevel(Features, FMA4, Enabled);
2362 } else if (Name == "xop") {
2363 setXOPLevel(Features, XOP, Enabled);
2364 } else if (Name == "sse4a") {
2365 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002366 } else if (Name == "f16c") {
2367 if (Enabled)
2368 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002369 } else if (Name == "sha") {
2370 if (Enabled)
2371 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002372 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002373}
2374
Eric Christopher3ff21b32013-10-16 21:26:26 +00002375/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002376/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002377bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002378 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002379 // Remember the maximum enabled sselevel.
2380 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2381 // Ignore disabled features.
2382 if (Features[i][0] == '-')
2383 continue;
2384
Benjamin Kramer27402c62012-03-05 15:10:44 +00002385 StringRef Feature = StringRef(Features[i]).substr(1);
2386
2387 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002388 HasAES = true;
2389 continue;
2390 }
2391
Craig Topper3f122a72012-05-31 05:18:48 +00002392 if (Feature == "pclmul") {
2393 HasPCLMUL = true;
2394 continue;
2395 }
2396
Benjamin Kramer27402c62012-03-05 15:10:44 +00002397 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002398 HasLZCNT = true;
2399 continue;
2400 }
2401
Rafael Espindola89049822013-08-23 20:21:37 +00002402 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002403 HasRDRND = true;
2404 continue;
2405 }
2406
Benjamin Kramer27402c62012-03-05 15:10:44 +00002407 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002408 HasBMI = true;
2409 continue;
2410 }
2411
Benjamin Kramer27402c62012-03-05 15:10:44 +00002412 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002413 HasBMI2 = true;
2414 continue;
2415 }
2416
Benjamin Kramer27402c62012-03-05 15:10:44 +00002417 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002418 HasPOPCNT = true;
2419 continue;
2420 }
2421
Michael Liao625a8752012-11-10 05:17:46 +00002422 if (Feature == "rtm") {
2423 HasRTM = true;
2424 continue;
2425 }
2426
Michael Liao74f4eaf2013-03-26 17:52:08 +00002427 if (Feature == "prfchw") {
2428 HasPRFCHW = true;
2429 continue;
2430 }
2431
Michael Liaoffaae352013-03-29 05:17:55 +00002432 if (Feature == "rdseed") {
2433 HasRDSEED = true;
2434 continue;
2435 }
2436
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002437 if (Feature == "tbm") {
2438 HasTBM = true;
2439 continue;
2440 }
2441
Craig Topperbba778b2012-06-03 21:46:30 +00002442 if (Feature == "fma") {
2443 HasFMA = true;
2444 continue;
2445 }
2446
Manman Rena45358c2012-10-11 00:59:55 +00002447 if (Feature == "f16c") {
2448 HasF16C = true;
2449 continue;
2450 }
2451
Craig Topper679b53a2013-08-21 05:29:10 +00002452 if (Feature == "avx512cd") {
2453 HasAVX512CD = true;
2454 continue;
2455 }
2456
2457 if (Feature == "avx512er") {
2458 HasAVX512ER = true;
2459 continue;
2460 }
2461
2462 if (Feature == "avx512pf") {
2463 HasAVX512PF = true;
2464 continue;
2465 }
2466
Ben Langmuir58078d02013-09-19 13:22:04 +00002467 if (Feature == "sha") {
2468 HasSHA = true;
2469 continue;
2470 }
2471
Nick Lewycky50e8f482013-10-05 20:14:27 +00002472 if (Feature == "cx16") {
2473 HasCX16 = true;
2474 continue;
2475 }
2476
Daniel Dunbar979586e2009-11-11 09:38:56 +00002477 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002478 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002479 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002480 .Case("avx2", AVX2)
2481 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002482 .Case("sse4.2", SSE42)
2483 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002484 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002485 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002486 .Case("sse2", SSE2)
2487 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002488 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002489 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002490
Eli Friedman33465822011-07-08 23:31:17 +00002491 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002492 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002493 .Case("3dnowa", AMD3DNowAthlon)
2494 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002495 .Case("mmx", MMX)
2496 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002497 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002498
2499 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2500 .Case("xop", XOP)
2501 .Case("fma4", FMA4)
2502 .Case("sse4a", SSE4A)
2503 .Default(NoXOP);
2504 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002505 }
Eli Friedman33465822011-07-08 23:31:17 +00002506
Craig Topper7481d8a2013-09-10 06:55:47 +00002507 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2508 // Can't do this earlier because we need to be able to explicitly enable
2509 // popcnt and still disable sse4.2.
2510 if (!HasPOPCNT && SSELevel >= SSE42 &&
2511 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2512 HasPOPCNT = true;
2513 Features.push_back("+popcnt");
2514 }
2515
Yunzhong Gao61089362013-10-16 19:07:02 +00002516 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2517 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2518 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2519 HasPRFCHW = true;
2520 Features.push_back("+prfchw");
2521 }
2522
Rafael Espindolaeb265472013-08-21 21:59:03 +00002523 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2524 // matches the selected sse level.
2525 if (FPMath == FP_SSE && SSELevel < SSE1) {
2526 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2527 return false;
2528 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2529 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2530 return false;
2531 }
2532
Eli Friedman33465822011-07-08 23:31:17 +00002533 // Don't tell the backend if we're turning off mmx; it will end up disabling
2534 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002535 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2536 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002537 std::vector<std::string>::iterator it;
2538 it = std::find(Features.begin(), Features.end(), "-mmx");
2539 if (it != Features.end())
2540 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002541 else if (SSELevel > NoSSE)
2542 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002543 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002544}
Chris Lattnerecd49032009-03-02 22:27:17 +00002545
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002546/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2547/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002548void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002549 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002550 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002551 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002552 Builder.defineMacro("__amd64__");
2553 Builder.defineMacro("__amd64");
2554 Builder.defineMacro("__x86_64");
2555 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002556 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002557 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002558 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002559
Chris Lattnerecd49032009-03-02 22:27:17 +00002560 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002561 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2562 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002563 switch (CPU) {
2564 case CK_Generic:
2565 break;
2566 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002567 // The rest are coming from the i386 define above.
2568 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 break;
2570 case CK_i486:
2571 case CK_WinChipC6:
2572 case CK_WinChip2:
2573 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002574 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002575 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002576 case CK_PentiumMMX:
2577 Builder.defineMacro("__pentium_mmx__");
2578 Builder.defineMacro("__tune_pentium_mmx__");
2579 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 case CK_i586:
2581 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002582 defineCPUMacros(Builder, "i586");
2583 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002584 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002585 case CK_Pentium3:
2586 case CK_Pentium3M:
2587 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002588 Builder.defineMacro("__tune_pentium3__");
2589 // Fallthrough
2590 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002592 Builder.defineMacro("__tune_pentium2__");
2593 // Fallthrough
2594 case CK_PentiumPro:
2595 Builder.defineMacro("__tune_i686__");
2596 Builder.defineMacro("__tune_pentiumpro__");
2597 // Fallthrough
2598 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002599 Builder.defineMacro("__i686");
2600 Builder.defineMacro("__i686__");
2601 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2602 Builder.defineMacro("__pentiumpro");
2603 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 break;
2605 case CK_Pentium4:
2606 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002607 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_Yonah:
2610 case CK_Prescott:
2611 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002612 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 break;
2614 case CK_Core2:
2615 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002616 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
2618 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002619 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002621 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002622 defineCPUMacros(Builder, "slm");
2623 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 case CK_Corei7:
2625 case CK_Corei7AVX:
2626 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002627 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002628 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002629 break;
Craig Topper449314e2013-08-20 07:09:39 +00002630 case CK_KNL:
2631 defineCPUMacros(Builder, "knl");
2632 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002634 Builder.defineMacro("__k6_2__");
2635 Builder.defineMacro("__tune_k6_2__");
2636 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002638 if (CPU != CK_K6_2) { // In case of fallthrough
2639 // FIXME: GCC may be enabling these in cases where some other k6
2640 // architecture is specified but -m3dnow is explicitly provided. The
2641 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002642 Builder.defineMacro("__k6_3__");
2643 Builder.defineMacro("__tune_k6_3__");
2644 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002645 // Fallthrough
2646 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002647 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 break;
2649 case CK_Athlon:
2650 case CK_AthlonThunderbird:
2651 case CK_Athlon4:
2652 case CK_AthlonXP:
2653 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002654 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002655 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002656 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002657 Builder.defineMacro("__tune_athlon_sse__");
2658 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
2660 case CK_K8:
2661 case CK_K8SSE3:
2662 case CK_x86_64:
2663 case CK_Opteron:
2664 case CK_OpteronSSE3:
2665 case CK_Athlon64:
2666 case CK_Athlon64SSE3:
2667 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002668 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002669 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002670 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002671 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002672 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002673 case CK_BTVER1:
2674 defineCPUMacros(Builder, "btver1");
2675 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002676 case CK_BTVER2:
2677 defineCPUMacros(Builder, "btver2");
2678 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002679 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002680 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002681 break;
2682 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002683 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002684 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002685 case CK_BDVER3:
2686 defineCPUMacros(Builder, "bdver3");
2687 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002688 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002689 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002691 }
Chris Lattner96e43572009-03-02 22:40:39 +00002692
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002693 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002694 Builder.defineMacro("__REGISTER_PREFIX__", "");
2695
Chris Lattner6df41af2009-04-19 17:32:33 +00002696 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2697 // functions in glibc header files that use FP Stack inline asm which the
2698 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002699 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002700
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002701 if (HasAES)
2702 Builder.defineMacro("__AES__");
2703
Craig Topper3f122a72012-05-31 05:18:48 +00002704 if (HasPCLMUL)
2705 Builder.defineMacro("__PCLMUL__");
2706
Craig Topper22967d42011-12-25 05:06:45 +00002707 if (HasLZCNT)
2708 Builder.defineMacro("__LZCNT__");
2709
Benjamin Kramer1e250392012-07-07 09:39:18 +00002710 if (HasRDRND)
2711 Builder.defineMacro("__RDRND__");
2712
Craig Topper22967d42011-12-25 05:06:45 +00002713 if (HasBMI)
2714 Builder.defineMacro("__BMI__");
2715
2716 if (HasBMI2)
2717 Builder.defineMacro("__BMI2__");
2718
Craig Topper1de83482011-12-29 16:10:46 +00002719 if (HasPOPCNT)
2720 Builder.defineMacro("__POPCNT__");
2721
Michael Liao625a8752012-11-10 05:17:46 +00002722 if (HasRTM)
2723 Builder.defineMacro("__RTM__");
2724
Michael Liao74f4eaf2013-03-26 17:52:08 +00002725 if (HasPRFCHW)
2726 Builder.defineMacro("__PRFCHW__");
2727
Michael Liaoffaae352013-03-29 05:17:55 +00002728 if (HasRDSEED)
2729 Builder.defineMacro("__RDSEED__");
2730
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002731 if (HasTBM)
2732 Builder.defineMacro("__TBM__");
2733
Rafael Espindolae62e2792013-08-20 13:44:29 +00002734 switch (XOPLevel) {
2735 case XOP:
2736 Builder.defineMacro("__XOP__");
2737 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002738 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002739 case SSE4A:
2740 Builder.defineMacro("__SSE4A__");
2741 case NoXOP:
2742 break;
2743 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002744
Craig Topperbba778b2012-06-03 21:46:30 +00002745 if (HasFMA)
2746 Builder.defineMacro("__FMA__");
2747
Manman Rena45358c2012-10-11 00:59:55 +00002748 if (HasF16C)
2749 Builder.defineMacro("__F16C__");
2750
Craig Topper679b53a2013-08-21 05:29:10 +00002751 if (HasAVX512CD)
2752 Builder.defineMacro("__AVX512CD__");
2753 if (HasAVX512ER)
2754 Builder.defineMacro("__AVX512ER__");
2755 if (HasAVX512PF)
2756 Builder.defineMacro("__AVX512PF__");
2757
Ben Langmuir58078d02013-09-19 13:22:04 +00002758 if (HasSHA)
2759 Builder.defineMacro("__SHA__");
2760
Nick Lewycky50e8f482013-10-05 20:14:27 +00002761 if (HasCX16)
2762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2763
Chris Lattner96e43572009-03-02 22:40:39 +00002764 // Each case falls through to the previous one here.
2765 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002766 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002767 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002768 case AVX2:
2769 Builder.defineMacro("__AVX2__");
2770 case AVX:
2771 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002772 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002773 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002774 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002775 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002776 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002778 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002779 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002780 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002781 Builder.defineMacro("__SSE2__");
2782 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002783 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002784 Builder.defineMacro("__SSE__");
2785 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002786 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002787 break;
2788 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002789
Derek Schuffc7dd7222012-10-11 15:52:22 +00002790 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002791 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002792 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002793 case AVX2:
2794 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002795 case SSE42:
2796 case SSE41:
2797 case SSSE3:
2798 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002799 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002800 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002801 break;
2802 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002803 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002804 break;
2805 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002806 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002807 }
2808 }
2809
Anders Carlssone437c682010-01-27 03:47:49 +00002810 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002811 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002812 case AMD3DNowAthlon:
2813 Builder.defineMacro("__3dNOW_A__");
2814 case AMD3DNow:
2815 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002816 case MMX:
2817 Builder.defineMacro("__MMX__");
2818 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002819 break;
2820 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002821
2822 if (CPU >= CK_i486) {
2823 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2824 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2825 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2826 }
2827 if (CPU >= CK_i586)
2828 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002829}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002830
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002831bool X86TargetInfo::hasFeature(StringRef Feature) const {
2832 return llvm::StringSwitch<bool>(Feature)
2833 .Case("aes", HasAES)
2834 .Case("avx", SSELevel >= AVX)
2835 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002836 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002837 .Case("avx512cd", HasAVX512CD)
2838 .Case("avx512er", HasAVX512ER)
2839 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002840 .Case("bmi", HasBMI)
2841 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002842 .Case("cx16", HasCX16)
2843 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002844 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002845 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002846 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002847 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002848 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002849 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2850 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2851 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002852 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002853 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002854 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002855 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002856 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002857 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002858 .Case("sse", SSELevel >= SSE1)
2859 .Case("sse2", SSELevel >= SSE2)
2860 .Case("sse3", SSELevel >= SSE3)
2861 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002862 .Case("sse4.1", SSELevel >= SSE41)
2863 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002865 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002866 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2867 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002869 .Default(false);
2870}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002871
Eli Friedman3fd920a2008-08-20 02:34:37 +00002872bool
Anders Carlsson58436352009-02-28 17:11:49 +00002873X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002874 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002875 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002876 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002877 case 'Y': // first letter of a pair:
2878 switch (*(Name+1)) {
2879 default: return false;
2880 case '0': // First SSE register.
2881 case 't': // Any SSE register, when SSE2 is enabled.
2882 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2883 case 'm': // any MMX register, when inter-unit moves enabled.
2884 break; // falls through to setAllowsRegister.
2885 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002886 case 'a': // eax.
2887 case 'b': // ebx.
2888 case 'c': // ecx.
2889 case 'd': // edx.
2890 case 'S': // esi.
2891 case 'D': // edi.
2892 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002893 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002894 case 't': // top of floating point stack.
2895 case 'u': // second from top of floating point stack.
2896 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002897 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002898 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002899 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002900 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2901 case 'l': // "Index" registers: any general register that can be used as an
2902 // index in a base+index memory access.
2903 Info.setAllowsRegister();
2904 return true;
2905 case 'C': // SSE floating point constant.
2906 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002907 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002908 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002909 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002910 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002911 return true;
2912 }
2913}
2914
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002915
Eli Friedman3fd920a2008-08-20 02:34:37 +00002916std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002917X86TargetInfo::convertConstraint(const char *&Constraint) const {
2918 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002919 case 'a': return std::string("{ax}");
2920 case 'b': return std::string("{bx}");
2921 case 'c': return std::string("{cx}");
2922 case 'd': return std::string("{dx}");
2923 case 'S': return std::string("{si}");
2924 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002925 case 'p': // address
2926 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002927 case 't': // top of floating point stack.
2928 return std::string("{st}");
2929 case 'u': // second from top of floating point stack.
2930 return std::string("{st(1)}"); // second from top of floating point stack.
2931 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002932 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002933 }
2934}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002935} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002936
2937namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002938// X86-32 generic target
2939class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002941 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002942 DoubleAlign = LongLongAlign = 32;
2943 LongDoubleWidth = 96;
2944 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002945 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002946 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002947 SizeType = UnsignedInt;
2948 PtrDiffType = SignedInt;
2949 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002950 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002951
2952 // Use fpret for all types.
2953 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2954 (1 << TargetInfo::Double) |
2955 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002956
2957 // x86-32 has atomics up to 8 bytes
2958 // FIXME: Check that we actually have cmpxchg8b before setting
2959 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2960 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002961 }
Craig Topper3164f332014-03-11 03:39:26 +00002962 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00002963 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002964 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002965
Craig Topper3164f332014-03-11 03:39:26 +00002966 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00002967 if (RegNo == 0) return 0;
2968 if (RegNo == 1) return 2;
2969 return -1;
2970 }
Craig Topper3164f332014-03-11 03:39:26 +00002971 bool validateInputSize(StringRef Constraint,
2972 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00002973 switch (Constraint[0]) {
2974 default: break;
2975 case 'a':
2976 case 'b':
2977 case 'c':
2978 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002979 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002980 }
2981
2982 return true;
2983 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002984};
2985} // end anonymous namespace
2986
2987namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002988class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2989public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002990 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2991 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002992
Craig Topper3164f332014-03-11 03:39:26 +00002993 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002994 unsigned Major, Minor, Micro;
2995 getTriple().getOSVersion(Major, Minor, Micro);
2996 // New NetBSD uses the default rounding mode.
2997 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2998 return X86_32TargetInfo::getFloatEvalMethod();
2999 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003000 return 1;
3001 }
3002};
3003} // end anonymous namespace
3004
3005namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003006class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3007public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003008 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3009 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003010 SizeType = UnsignedLong;
3011 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003012 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003013 }
3014};
3015} // end anonymous namespace
3016
3017namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003018class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3019public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003020 BitrigI386TargetInfo(const llvm::Triple &Triple)
3021 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003022 SizeType = UnsignedLong;
3023 IntPtrType = SignedLong;
3024 PtrDiffType = SignedLong;
3025 }
3026};
3027} // end anonymous namespace
3028
3029namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003030class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003031public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003032 DarwinI386TargetInfo(const llvm::Triple &Triple)
3033 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003034 LongDoubleWidth = 128;
3035 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003036 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003037 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003038 SizeType = UnsignedLong;
3039 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003040 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003041 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003042 }
3043
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003045} // end anonymous namespace
3046
3047namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003048// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003049class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003051 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3052 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003053 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003054 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003055 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003056 }
Craig Topper3164f332014-03-11 03:39:26 +00003057 void getTargetDefines(const LangOptions &Opts,
3058 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003059 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3060 }
3061};
3062} // end anonymous namespace
3063
3064namespace {
3065
3066// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003067class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003068public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003069 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003070 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003071 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003072 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3073 }
Craig Topper3164f332014-03-11 03:39:26 +00003074 void getTargetDefines(const LangOptions &Opts,
3075 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003076 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3077 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3078 // The value of the following reflects processor type.
3079 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3080 // We lost the original triple, so we use the default.
3081 Builder.defineMacro("_M_IX86", "600");
3082 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003083};
3084} // end anonymous namespace
3085
Reid Kleckner47606832014-04-21 20:58:00 +00003086static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3087 Builder.defineMacro("__MSVCRT__");
3088 Builder.defineMacro("__MINGW32__");
3089
3090 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3091 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3092 // macro anyway for pre-processor compatibility.
3093 if (Opts.MicrosoftExt)
3094 Builder.defineMacro("__declspec", "__declspec");
3095 else
3096 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3097
3098 if (!Opts.MicrosoftExt) {
3099 // Provide macros for all the calling convention keywords. Provide both
3100 // single and double underscore prefixed variants. These are available on
3101 // x64 as well as x86, even though they have no effect.
3102 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3103 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003104 std::string GCCSpelling = "__attribute__((__";
3105 GCCSpelling += CC;
3106 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003107 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3108 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3109 }
3110 }
3111}
3112
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003113namespace {
3114// x86-32 MinGW target
3115class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3116public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003117 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3118 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003119 void getTargetDefines(const LangOptions &Opts,
3120 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003121 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003122 DefineStd(Builder, "WIN32", Opts);
3123 DefineStd(Builder, "WINNT", Opts);
3124 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003125 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003126 }
3127};
3128} // end anonymous namespace
3129
3130namespace {
3131// x86-32 Cygwin target
3132class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003134 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3135 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003136 TLSSupported = false;
3137 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003138 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003139 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003140 }
Craig Topper3164f332014-03-11 03:39:26 +00003141 void getTargetDefines(const LangOptions &Opts,
3142 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003143 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003144 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003145 Builder.defineMacro("__CYGWIN__");
3146 Builder.defineMacro("__CYGWIN32__");
3147 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003148 if (Opts.CPlusPlus)
3149 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003150 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003151};
3152} // end anonymous namespace
3153
3154namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003155// x86-32 Haiku target
3156class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3157public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003158 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003159 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003160 IntPtrType = SignedLong;
3161 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003162 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003163 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003164 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003165 }
Craig Topper3164f332014-03-11 03:39:26 +00003166 void getTargetDefines(const LangOptions &Opts,
3167 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003168 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3169 Builder.defineMacro("__INTEL__");
3170 Builder.defineMacro("__HAIKU__");
3171 }
3172};
3173} // end anonymous namespace
3174
Douglas Gregor9fabd852011-07-01 22:41:14 +00003175// RTEMS Target
3176template<typename Target>
3177class RTEMSTargetInfo : public OSTargetInfo<Target> {
3178protected:
Craig Topper3164f332014-03-11 03:39:26 +00003179 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3180 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003181 // RTEMS defines; list based off of gcc output
3182
Douglas Gregor9fabd852011-07-01 22:41:14 +00003183 Builder.defineMacro("__rtems__");
3184 Builder.defineMacro("__ELF__");
3185 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003186
Douglas Gregor9fabd852011-07-01 22:41:14 +00003187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003188 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3189 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003190
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003191 switch (Triple.getArch()) {
3192 default:
3193 case llvm::Triple::x86:
3194 // this->MCountName = ".mcount";
3195 break;
3196 case llvm::Triple::mips:
3197 case llvm::Triple::mipsel:
3198 case llvm::Triple::ppc:
3199 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003200 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003201 // this->MCountName = "_mcount";
3202 break;
3203 case llvm::Triple::arm:
3204 // this->MCountName = "__mcount";
3205 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003206 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003207 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003208};
3209
3210namespace {
3211// x86-32 RTEMS target
3212class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3213public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003214 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003215 SizeType = UnsignedLong;
3216 IntPtrType = SignedLong;
3217 PtrDiffType = SignedLong;
3218 this->UserLabelPrefix = "";
3219 }
Craig Topper3164f332014-03-11 03:39:26 +00003220 void getTargetDefines(const LangOptions &Opts,
3221 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003222 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3223 Builder.defineMacro("__INTEL__");
3224 Builder.defineMacro("__rtems__");
3225 }
3226};
3227} // end anonymous namespace
3228
Chris Lattnerb986aba2010-04-11 19:29:39 +00003229namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003230// x86-64 generic target
3231class X86_64TargetInfo : public X86TargetInfo {
3232public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003233 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003234 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003235 LongDoubleWidth = 128;
3236 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003237 LargeArrayMinWidth = 128;
3238 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003239 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003240 IntMaxType = SignedLong;
3241 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003242 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003243 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003244
Rafael Espindolac418ae92014-01-03 19:22:05 +00003245 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003246
3247 // Use fpret only for long double.
3248 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003249
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003250 // Use fp2ret for _Complex long double.
3251 ComplexLongDoubleUsesFP2Ret = true;
3252
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003253 // x86-64 has atomics up to 16 bytes.
3254 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3255 // on CPUs with cmpxchg16b
3256 MaxAtomicPromoteWidth = 128;
3257 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003258 }
Craig Topper3164f332014-03-11 03:39:26 +00003259 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003260 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003261 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003262
Craig Topper3164f332014-03-11 03:39:26 +00003263 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003264 if (RegNo == 0) return 0;
3265 if (RegNo == 1) return 1;
3266 return -1;
3267 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003268
Craig Topper3164f332014-03-11 03:39:26 +00003269 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003270 return (CC == CC_C ||
3271 CC == CC_IntelOclBicc ||
3272 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003273 }
3274
Craig Topper3164f332014-03-11 03:39:26 +00003275 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003276 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003277 }
3278
Eli Friedman3fd920a2008-08-20 02:34:37 +00003279};
3280} // end anonymous namespace
3281
3282namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003283// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003284class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003285public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003286 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3287 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003288 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003289 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003290 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003291 IntMaxType = SignedLongLong;
3292 UIntMaxType = UnsignedLongLong;
3293 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003294 SizeType = UnsignedLongLong;
3295 PtrDiffType = SignedLongLong;
3296 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003297 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003298 }
Craig Topper3164f332014-03-11 03:39:26 +00003299 void getTargetDefines(const LangOptions &Opts,
3300 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003301 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003302 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003303 }
Craig Topper3164f332014-03-11 03:39:26 +00003304 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003305 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003306 }
Craig Topper3164f332014-03-11 03:39:26 +00003307 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003308 return (CC == CC_C ||
3309 CC == CC_IntelOclBicc ||
3310 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3311 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003312};
3313} // end anonymous namespace
3314
3315namespace {
3316// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003317class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003318public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003319 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003320 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003321 LongDoubleWidth = LongDoubleAlign = 64;
3322 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003323 }
Craig Topper3164f332014-03-11 03:39:26 +00003324 void getTargetDefines(const LangOptions &Opts,
3325 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003326 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3327 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003328 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003329 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003330 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003331};
3332} // end anonymous namespace
3333
3334namespace {
3335// x86-64 MinGW target
3336class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3337public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003338 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3339 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003340 void getTargetDefines(const LangOptions &Opts,
3341 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003342 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003343 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003344 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003345 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003346 }
3347};
3348} // end anonymous namespace
3349
3350namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003351class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3352public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003353 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3354 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003355 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003356 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003357 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3358 llvm::Triple T = llvm::Triple(Triple);
3359 if (T.getOS() == llvm::Triple::IOS)
3360 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003361 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003362 }
3363};
3364} // end anonymous namespace
3365
3366namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003367class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003369 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3370 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003371 IntMaxType = SignedLongLong;
3372 UIntMaxType = UnsignedLongLong;
3373 Int64Type = SignedLongLong;
3374 }
3375};
3376} // end anonymous namespace
3377
3378namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003379class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3380public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003381 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3382 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3383 IntMaxType = SignedLongLong;
3384 UIntMaxType = UnsignedLongLong;
3385 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003386 }
3387};
Tim Northover9bb857a2013-01-31 12:13:10 +00003388}
3389
3390namespace {
3391class AArch64TargetInfo : public TargetInfo {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003392 virtual void setDescriptionString() = 0;
Tim Northover9bb857a2013-01-31 12:13:10 +00003393 static const char * const GCCRegNames[];
3394 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003395
Tim Northover2fe823a2013-08-01 09:23:19 +00003396 enum FPUModeEnum {
3397 FPUMode,
3398 NeonMode
3399 };
3400
3401 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003402 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003403 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003404
Tim Northover9bb857a2013-01-31 12:13:10 +00003405public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003406 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003407 LongWidth = LongAlign = 64;
3408 LongDoubleWidth = LongDoubleAlign = 128;
3409 PointerWidth = PointerAlign = 64;
3410 SuitableAlign = 128;
Tim Northover9bb857a2013-01-31 12:13:10 +00003411
3412 WCharType = UnsignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003413 if (getTriple().getOS() == llvm::Triple::NetBSD) {
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003414 WCharType = SignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003415 Int64Type = SignedLongLong;
3416 IntMaxType = SignedLongLong;
3417 UIntMaxType = UnsignedLongLong;
3418 } else {
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003419 WCharType = UnsignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003420 Int64Type = SignedLong;
3421 IntMaxType = SignedLong;
3422 UIntMaxType = UnsignedLong;
3423 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003424 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3425
Tim Northover847d2d42013-02-18 12:11:32 +00003426 // AArch64 backend supports 64-bit operations at the moment. In principle
3427 // 128-bit is possible if register-pairs are used.
3428 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3429
Tim Northover9bb857a2013-01-31 12:13:10 +00003430 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3431 }
Craig Topper3164f332014-03-11 03:39:26 +00003432 void getTargetDefines(const LangOptions &Opts,
3433 MacroBuilder &Builder) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003434 // GCC defines theses currently
3435 Builder.defineMacro("__aarch64__");
Tim Northover9bb857a2013-01-31 12:13:10 +00003436
3437 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003438 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003439 Builder.defineMacro("__ARM_ARCH", "8");
3440 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003441
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003442 Builder.defineMacro("__ARM_64BIT_STATE");
3443 Builder.defineMacro("__ARM_PCS_AAPCS64");
3444 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3445
Tim Northoverb85654d2013-04-05 14:08:55 +00003446 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3447 Builder.defineMacro("__ARM_FEATURE_CLZ");
3448 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003449 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003450
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003451 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003452
3453 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003454 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003455
3456 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003457 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3458 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003459
3460 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003461 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003462
3463 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003464 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003465
Tim Northoverb85654d2013-04-05 14:08:55 +00003466 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003467 Opts.ShortWChar ? "2" : "4");
3468
Tim Northoverb85654d2013-04-05 14:08:55 +00003469 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003470 Opts.ShortEnums ? "1" : "4");
3471
Tim Northover2fe823a2013-08-01 09:23:19 +00003472 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003473 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003474 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003475 Builder.defineMacro("__ARM_NEON_FP", "7");
3476 }
3477
3478 if (Crypto) {
3479 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003480 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003481 }
Craig Topper3164f332014-03-11 03:39:26 +00003482 void getTargetBuiltins(const Builtin::Info *&Records,
3483 unsigned &NumRecords) const override {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003484 Records = BuiltinInfo;
3485 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003486 }
Craig Topper3164f332014-03-11 03:39:26 +00003487 bool hasFeature(StringRef Feature) const override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003488 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003489 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003490
Craig Topper3164f332014-03-11 03:39:26 +00003491 bool setCPU(const std::string &Name) override {
Amara Emerson703da2e2013-10-31 09:32:33 +00003492 return llvm::StringSwitch<bool>(Name)
3493 .Case("generic", true)
3494 .Cases("cortex-a53", "cortex-a57", true)
3495 .Default(false);
3496 }
3497
Craig Topper3164f332014-03-11 03:39:26 +00003498 bool handleTargetFeatures(std::vector<std::string> &Features,
3499 DiagnosticsEngine &Diags) override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003500 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003501 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003502 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3503 if (Features[i] == "+neon")
3504 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003505 if (Features[i] == "+crypto")
3506 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003507 }
Christian Pirker9b019ae2014-02-25 13:51:00 +00003508
3509 setDescriptionString();
3510
Rafael Espindolaeb265472013-08-21 21:59:03 +00003511 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003512 }
3513
Craig Topper3164f332014-03-11 03:39:26 +00003514 void getGCCRegNames(const char *const *&Names,
3515 unsigned &NumNames) const override;
3516 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3517 unsigned &NumAliases) const override;
Tim Northover9bb857a2013-01-31 12:13:10 +00003518
Craig Topper3164f332014-03-11 03:39:26 +00003519 bool isCLZForZeroUndef() const override { return false; }
Tim Northover9bb857a2013-01-31 12:13:10 +00003520
Craig Topper3164f332014-03-11 03:39:26 +00003521 bool validateAsmConstraint(const char *&Name,
3522 TargetInfo::ConstraintInfo &Info) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003523 switch (*Name) {
3524 default: return false;
3525 case 'w': // An FP/SIMD vector register
3526 Info.setAllowsRegister();
3527 return true;
3528 case 'I': // Constant that can be used with an ADD instruction
3529 case 'J': // Constant that can be used with a SUB instruction
3530 case 'K': // Constant that can be used with a 32-bit logical instruction
3531 case 'L': // Constant that can be used with a 64-bit logical instruction
3532 case 'M': // Constant that can be used as a 32-bit MOV immediate
3533 case 'N': // Constant that can be used as a 64-bit MOV immediate
3534 case 'Y': // Floating point constant zero
3535 case 'Z': // Integer constant zero
3536 return true;
3537 case 'Q': // A memory reference with base register and no offset
3538 Info.setAllowsMemory();
3539 return true;
3540 case 'S': // A symbolic address
3541 Info.setAllowsRegister();
3542 return true;
3543 case 'U':
3544 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3545 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3546 // Usa: An absolute symbolic address
3547 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3548 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3549 }
3550 }
3551
Craig Topper3164f332014-03-11 03:39:26 +00003552 const char *getClobbers() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003553 // There are no AArch64 clobbers shared by all asm statements.
3554 return "";
3555 }
3556
Craig Topper3164f332014-03-11 03:39:26 +00003557 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003558 return TargetInfo::AArch64ABIBuiltinVaList;
3559 }
3560};
3561
3562const char * const AArch64TargetInfo::GCCRegNames[] = {
3563 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3564 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3565 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3566 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3567
3568 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3569 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3570 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3571 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3572
3573 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3574 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3575 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3576 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3577
3578 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3579 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3580 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3581 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3582
3583 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3584 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3585 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3586 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3587
3588 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3589 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3590 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3591 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3592
3593 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3594 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3595 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3596 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3597};
3598
3599void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3600 unsigned &NumNames) const {
3601 Names = GCCRegNames;
3602 NumNames = llvm::array_lengthof(GCCRegNames);
3603}
3604
3605const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3606 { { "x16" }, "ip0"},
3607 { { "x17" }, "ip1"},
3608 { { "x29" }, "fp" },
3609 { { "x30" }, "lr" }
3610};
3611
3612void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3613 unsigned &NumAliases) const {
3614 Aliases = GCCRegAliases;
3615 NumAliases = llvm::array_lengthof(GCCRegAliases);
3616
3617}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003618
3619const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3620#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3621#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3622 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00003623#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00003624
3625#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3626#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3627 ALL_LANGUAGES },
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003628#include "clang/Basic/BuiltinsAArch64.def"
3629};
3630
Christian Pirker9b019ae2014-02-25 13:51:00 +00003631class AArch64leTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003632 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003633 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
3634 }
3635
3636public:
3637 AArch64leTargetInfo(const llvm::Triple &Triple)
3638 : AArch64TargetInfo(Triple) {
3639 BigEndian = false;
3640 }
Craig Topper3164f332014-03-11 03:39:26 +00003641 void getTargetDefines(const LangOptions &Opts,
3642 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003643 Builder.defineMacro("__AARCH64EL__");
3644 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3645 }
3646};
3647
3648class AArch64beTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003649 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003650 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
3651 }
3652
3653public:
3654 AArch64beTargetInfo(const llvm::Triple &Triple)
3655 : AArch64TargetInfo(Triple) { }
Craig Topper3164f332014-03-11 03:39:26 +00003656 void getTargetDefines(const LangOptions &Opts,
3657 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003658 Builder.defineMacro("__AARCH64EB__");
Christian Pirker227f5ed2014-03-24 13:57:21 +00003659 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3660 Builder.defineMacro("__ARM_BIG_ENDIAN");
Christian Pirker9b019ae2014-02-25 13:51:00 +00003661 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3662 }
3663};
3664
Eli Friedman9fa28852012-08-08 23:57:20 +00003665} // end anonymous namespace
3666
3667namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003668class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003669 // Possible FPU choices.
3670 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003671 VFP2FPU = (1 << 0),
3672 VFP3FPU = (1 << 1),
3673 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003674 NeonFPU = (1 << 3),
3675 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003676 };
3677
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003678 // Possible HWDiv features.
3679 enum HWDivMode {
3680 HWDivThumb = (1 << 0),
3681 HWDivARM = (1 << 1)
3682 };
3683
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003684 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003685 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003686 }
3687
3688 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3689 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003690
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003691 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003692
Rafael Espindolaeb265472013-08-21 21:59:03 +00003693 enum {
3694 FP_Default,
3695 FP_VFP,
3696 FP_Neon
3697 } FPMath;
3698
Bernard Ogdenda13af32013-10-24 18:32:51 +00003699 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003700
Logan Chien57086ce2012-10-10 06:56:20 +00003701 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003702 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003703 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003704
3705 // Initialized via features.
3706 unsigned SoftFloat : 1;
3707 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003708
Bernard Ogden18b57012013-10-29 09:47:51 +00003709 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003710 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003711
Chris Lattner5cc15e02010-03-03 19:03:45 +00003712 static const Builtin::Info BuiltinInfo[];
3713
Rafael Espindola101d5b92013-05-13 20:09:47 +00003714 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003715 if (T.isOSWindows())
3716 return true;
3717
Rafael Espindola101d5b92013-05-13 20:09:47 +00003718 // On linux, binaries targeting old cpus call functions in libgcc to
3719 // perform atomic operations. The implementation in libgcc then calls into
3720 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3721 // is that if we assume the kernel is at least as recent as the hardware,
3722 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003723 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003724 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003725 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003726 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003727 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003728 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003729 if (T.getArch() == llvm::Triple::arm ||
3730 T.getArch() == llvm::Triple::armeb) {
3731 StringRef VersionStr;
3732 if (ArchName.startswith("armv"))
3733 VersionStr = ArchName.substr(4);
3734 else if (ArchName.startswith("armebv"))
3735 VersionStr = ArchName.substr(6);
3736 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003737 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003738 unsigned Version;
3739 if (VersionStr.getAsInteger(10, Version))
3740 return false;
3741 return Version >= 6;
3742 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003743 assert(T.getArch() == llvm::Triple::thumb ||
3744 T.getArch() == llvm::Triple::thumbeb);
3745 StringRef VersionStr;
3746 if (ArchName.startswith("thumbv"))
3747 VersionStr = ArchName.substr(6);
3748 else if (ArchName.startswith("thumbebv"))
3749 VersionStr = ArchName.substr(8);
3750 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003751 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003752 unsigned Version;
3753 if (VersionStr.getAsInteger(10, Version))
3754 return false;
3755 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003756 }
3757
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003758 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003759 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003760
3761 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003762 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003763
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003764 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003765 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003766 SizeType = UnsignedLong;
3767 else
3768 SizeType = UnsignedInt;
3769
Rafael Espindolac418ae92014-01-03 19:22:05 +00003770 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003771 WCharType = SignedInt;
3772 } else {
3773 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3774 WCharType = UnsignedInt;
3775 }
3776
3777 UseBitFieldTypeAlignment = true;
3778
3779 ZeroLengthBitfieldBoundary = 0;
3780
3781 if (IsThumb) {
3782 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3783 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003784 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003785 DescriptionString = BigEndian ?
3786 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3787 "v128:64:128-a:0:32-n32-S64" :
3788 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3789 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003790 } else if (T.isOSWindows()) {
3791 // FIXME: this is invalid for WindowsCE
3792 assert(!BigEndian && "Windows on ARM does not support big endian");
3793 DescriptionString = "e"
3794 "-m:e"
3795 "-p:32:32"
3796 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3797 "-v128:64:128"
3798 "-a:0:32"
3799 "-n32"
3800 "-S64";
3801 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003802 DescriptionString = BigEndian ?
3803 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3804 "v128:64:128-a:0:32-n32-S64" :
3805 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3806 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003807 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003808 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003809 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003810 DescriptionString = BigEndian ?
3811 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3812 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003813 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003814 DescriptionString = BigEndian ?
3815 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3816 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003817 }
3818
3819 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003820 }
3821
3822 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003823 const llvm::Triple &T = getTriple();
3824
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003825 IsAAPCS = false;
3826
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003827 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003828
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003829 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003830 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003831 SizeType = UnsignedInt;
3832 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003833 SizeType = UnsignedLong;
3834
3835 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3836 WCharType = SignedInt;
3837
3838 // Do not respect the alignment of bit-field types when laying out
3839 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3840 UseBitFieldTypeAlignment = false;
3841
3842 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3843 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3844 /// gcc.
3845 ZeroLengthBitfieldBoundary = 32;
3846
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003847 if (IsThumb) {
3848 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3849 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003850 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003851 DescriptionString = BigEndian ?
3852 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3853 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3854 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3855 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003856 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003857 DescriptionString = BigEndian ?
3858 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3859 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3860 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3861 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003862 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003863 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003864 DescriptionString = BigEndian ?
3865 "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 +00003866 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3867 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003868 DescriptionString = BigEndian ?
3869 "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 +00003870 "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 +00003871 }
3872
3873 // FIXME: Override "preferred align" for double and long long.
3874 }
3875
Chris Lattner17df24e2008-04-21 18:56:49 +00003876public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003877 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003878 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3879 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003880 BigEndian = IsBigEndian;
3881
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003882 switch (getTriple().getOS()) {
3883 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003884 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003885 break;
3886 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003887 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003888 break;
3889 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003890
Chris Lattner1a8f3942010-04-23 16:29:58 +00003891 // {} in inline assembly are neon specifiers, not assembly variant
3892 // specifiers.
3893 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003894
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003895 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003896 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003897
3898 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003899
3900 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003901 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003902
3903 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003904 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003905 if (shouldUseInlineAtomic(getTriple()))
3906 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003907
3908 // Do force alignment of members that follow zero length bitfields. If
3909 // the alignment of the zero-length bitfield is greater than the member
3910 // that follows it, `bar', `bar' will be aligned as the type of the
3911 // zero length bitfield.
3912 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003913 }
Craig Topper3164f332014-03-11 03:39:26 +00003914 const char *getABI() const override { return ABI.c_str(); }
3915 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003916 ABI = Name;
3917
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003918 // The defaults (above) are for AAPCS, check if we need to change them.
3919 //
3920 // FIXME: We need support for -meabi... we could just mangle it into the
3921 // name.
3922 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003923 setABIAPCS();
3924 return true;
3925 }
3926 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3927 setABIAAPCS();
3928 return true;
3929 }
3930 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003931 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003932
Craig Topper3164f332014-03-11 03:39:26 +00003933 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003934 if (IsAAPCS)
3935 Features["aapcs"] = true;
3936 else
3937 Features["apcs"] = true;
3938
Silviu Barangae5690462013-10-21 10:59:33 +00003939 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003940 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3941 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003942 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3943 CPU == "cortex-a9-mp") {
3944 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003945 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003946 }
3947 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003948 Features["vfp4"] = true;
3949 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003950 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3951 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3952 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003953 Features["vfp4"] = true;
3954 Features["neon"] = true;
3955 Features["hwdiv"] = true;
3956 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003957 } else if (CPU == "cyclone") {
3958 Features["v8fp"] = true;
3959 Features["neon"] = true;
3960 Features["hwdiv"] = true;
3961 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003962 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3963 Features["fp-armv8"] = true;
3964 Features["neon"] = true;
3965 Features["hwdiv"] = true;
3966 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003967 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003968 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003969 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003970 // Enable the hwdiv extension for all v8a AArch32 cores by
3971 // default.
3972 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003973 ArchName == "armebv8a" || ArchName == "armebv8" ||
3974 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3975 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003976 Features["hwdiv"] = true;
3977 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003978 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3979 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003980 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003981 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003982
Craig Topper3164f332014-03-11 03:39:26 +00003983 bool handleTargetFeatures(std::vector<std::string> &Features,
3984 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003985 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003986 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003987 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003988 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003989 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003990 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3991 if (Features[i] == "+soft-float")
3992 SoftFloat = true;
3993 else if (Features[i] == "+soft-float-abi")
3994 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003995 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003996 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003997 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003998 FPU |= VFP3FPU;
3999 else if (Features[i] == "+vfp4")
4000 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00004001 else if (Features[i] == "+fp-armv8")
4002 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004003 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004004 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004005 else if (Features[i] == "+hwdiv")
4006 HWDiv |= HWDivThumb;
4007 else if (Features[i] == "+hwdiv-arm")
4008 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00004009 else if (Features[i] == "+crc")
4010 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00004011 else if (Features[i] == "+crypto")
4012 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004013 }
4014
Rafael Espindolaeb265472013-08-21 21:59:03 +00004015 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4016 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4017 return false;
4018 }
4019
4020 if (FPMath == FP_Neon)
4021 Features.push_back("+neonfp");
4022 else if (FPMath == FP_VFP)
4023 Features.push_back("-neonfp");
4024
Daniel Dunbar893d4752009-12-19 04:15:38 +00004025 // Remove front-end specific options which the backend handles differently.
4026 std::vector<std::string>::iterator it;
4027 it = std::find(Features.begin(), Features.end(), "+soft-float");
4028 if (it != Features.end())
4029 Features.erase(it);
4030 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
4031 if (it != Features.end())
4032 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00004033 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004034 }
4035
Craig Topper3164f332014-03-11 03:39:26 +00004036 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004037 return llvm::StringSwitch<bool>(Feature)
4038 .Case("arm", true)
4039 .Case("softfloat", SoftFloat)
4040 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004041 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004042 .Case("hwdiv", HWDiv & HWDivThumb)
4043 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004044 .Default(false);
4045 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004046 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004047 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004048 return llvm::StringSwitch<const char*>(Name)
4049 .Cases("arm8", "arm810", "4")
4050 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
4051 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4052 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4053 .Case("ep9312", "4T")
4054 .Cases("arm10tdmi", "arm1020t", "5T")
4055 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4056 .Case("arm926ej-s", "5TEJ")
4057 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4058 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004059 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004060 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004061 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004062 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004063 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004064 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004065 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004066 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00004067 .Case("cyclone", "8A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004068 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004069 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004070 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004071 .Default(0);
4072 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004073 static const char *getCPUProfile(StringRef Name) {
4074 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004075 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004076 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004077 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004078 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004079 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004080 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004081 }
Craig Topper3164f332014-03-11 03:39:26 +00004082 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004083 if (!getCPUDefineSuffix(Name))
4084 return false;
4085
4086 CPU = Name;
4087 return true;
4088 }
Craig Topper3164f332014-03-11 03:39:26 +00004089 bool setFPMath(StringRef Name) override;
4090 void getTargetDefines(const LangOptions &Opts,
4091 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004092 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004093 Builder.defineMacro("__arm");
4094 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004095
Chris Lattnerecd49032009-03-02 22:27:17 +00004096 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004097 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004098
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004099 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004100 unsigned int CPUArchVer;
4101 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4102 llvm_unreachable("Invalid char for architecture version number");
4103 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004104 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004105 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4106 StringRef CPUProfile = getCPUProfile(CPU);
4107 if (!CPUProfile.empty())
4108 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004109
Mike Stump9d54bd72009-04-08 02:07:04 +00004110 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004111
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004112 // FIXME: It's more complicated than this and we don't really support
4113 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004114 // Windows on ARM does not "support" interworking
4115 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004116 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004117
David Tweed8f676532012-10-25 13:33:01 +00004118 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004119 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004120 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4121 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004122 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004123 Builder.defineMacro("__ARM_PCS", "1");
4124
David Tweed8f676532012-10-25 13:33:01 +00004125 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004126 Builder.defineMacro("__ARM_PCS_VFP", "1");
4127 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004128
Daniel Dunbar893d4752009-12-19 04:15:38 +00004129 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004130 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004131
4132 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004133 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004134
4135 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004136 Builder.defineMacro("__THUMBEL__");
4137 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004138 // We check both CPUArchVer and ArchName because when only triple is
4139 // specified, the default CPU is arm1136j-s.
4140 StringRef ArchName = getTriple().getArchName();
4141 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4142 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004143 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004144 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004145 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4146 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004147
4148 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004149 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004150
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004151 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004152 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004153 if (FPU & VFP2FPU)
4154 Builder.defineMacro("__ARM_VFPV2__");
4155 if (FPU & VFP3FPU)
4156 Builder.defineMacro("__ARM_VFPV3__");
4157 if (FPU & VFP4FPU)
4158 Builder.defineMacro("__ARM_VFPV4__");
4159 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004160
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004161 // This only gets set when Neon instructions are actually available, unlike
4162 // the VFP define, hence the soft float and arch check. This is subtly
4163 // different from gcc, we follow the intent which was that it should be set
4164 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004165 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4166 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004167 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004168 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004169
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004170 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4171 Opts.ShortWChar ? "2" : "4");
4172
4173 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4174 Opts.ShortEnums ? "1" : "4");
4175
Bernard Ogden18b57012013-10-29 09:47:51 +00004176 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004177 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004178
Tim Northover02e38602014-02-03 17:28:04 +00004179 if (Crypto)
4180 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4181
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004182 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004183 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4184 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4186 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4187 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004188 }
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getTargetBuiltins(const Builtin::Info *&Records,
4190 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004191 Records = BuiltinInfo;
4192 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004193 }
Craig Topper3164f332014-03-11 03:39:26 +00004194 bool isCLZForZeroUndef() const override { return false; }
4195 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004196 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004197 }
Craig Topper3164f332014-03-11 03:39:26 +00004198 void getGCCRegNames(const char * const *&Names,
4199 unsigned &NumNames) const override;
4200 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4201 unsigned &NumAliases) const override;
4202 bool validateAsmConstraint(const char *&Name,
4203 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004204 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004205 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004206 case 'l': // r0-r7
4207 case 'h': // r8-r15
4208 case 'w': // VFP Floating point register single precision
4209 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004210 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004211 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004212 case 'Q': // A memory address that is a single base register.
4213 Info.setAllowsMemory();
4214 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004215 case 'U': // a memory reference...
4216 switch (Name[1]) {
4217 case 'q': // ...ARMV4 ldrsb
4218 case 'v': // ...VFP load/store (reg+constant offset)
4219 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004220 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004221 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004222 case 'n': // valid address for Neon doubleword vector load/store
4223 case 'm': // valid address for Neon element and structure load/store
4224 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004225 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004226 Info.setAllowsMemory();
4227 Name++;
4228 return true;
4229 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004230 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004231 return false;
4232 }
Craig Topper3164f332014-03-11 03:39:26 +00004233 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004234 std::string R;
4235 switch (*Constraint) {
4236 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004237 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004238 Constraint++;
4239 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004240 case 'p': // 'p' should be translated to 'r' by default.
4241 R = std::string("r");
4242 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004243 default:
4244 return std::string(1, *Constraint);
4245 }
4246 return R;
4247 }
Craig Topper3164f332014-03-11 03:39:26 +00004248 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4249 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004250 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004251 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004252
Bill Wendling9d1ee112012-10-25 23:28:48 +00004253 // Strip off constraint modifiers.
4254 while (Constraint[0] == '=' ||
4255 Constraint[0] == '+' ||
4256 Constraint[0] == '&')
4257 Constraint = Constraint.substr(1);
4258
4259 switch (Constraint[0]) {
4260 default: break;
4261 case 'r': {
4262 switch (Modifier) {
4263 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004264 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004265 case 'q':
4266 // A register of size 32 cannot fit a vector type.
4267 return false;
4268 }
4269 }
4270 }
4271
4272 return true;
4273 }
Craig Topper3164f332014-03-11 03:39:26 +00004274 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004275 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004276 return "";
4277 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004278
Craig Topper3164f332014-03-11 03:39:26 +00004279 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004280 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4281 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004282
Craig Topper3164f332014-03-11 03:39:26 +00004283 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004284 if (RegNo == 0) return 0;
4285 if (RegNo == 1) return 1;
4286 return -1;
4287 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004288};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004289
Rafael Espindolaeb265472013-08-21 21:59:03 +00004290bool ARMTargetInfo::setFPMath(StringRef Name) {
4291 if (Name == "neon") {
4292 FPMath = FP_Neon;
4293 return true;
4294 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4295 Name == "vfp4") {
4296 FPMath = FP_VFP;
4297 return true;
4298 }
4299 return false;
4300}
4301
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004302const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004303 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004304 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004305 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4306
4307 // Float registers
4308 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4309 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4310 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004311 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004312
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004313 // Double registers
4314 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4315 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004316 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4317 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004318
4319 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004320 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4321 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004322};
4323
4324void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004325 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004326 Names = GCCRegNames;
4327 NumNames = llvm::array_lengthof(GCCRegNames);
4328}
4329
4330const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004331 { { "a1" }, "r0" },
4332 { { "a2" }, "r1" },
4333 { { "a3" }, "r2" },
4334 { { "a4" }, "r3" },
4335 { { "v1" }, "r4" },
4336 { { "v2" }, "r5" },
4337 { { "v3" }, "r6" },
4338 { { "v4" }, "r7" },
4339 { { "v5" }, "r8" },
4340 { { "v6", "rfp" }, "r9" },
4341 { { "sl" }, "r10" },
4342 { { "fp" }, "r11" },
4343 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004344 { { "r13" }, "sp" },
4345 { { "r14" }, "lr" },
4346 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004347 // The S, D and Q registers overlap, but aren't really aliases; we
4348 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004349};
4350
4351void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4352 unsigned &NumAliases) const {
4353 Aliases = GCCRegAliases;
4354 NumAliases = llvm::array_lengthof(GCCRegAliases);
4355}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004356
4357const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004358#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004359#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004360 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004361#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004362
4363#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4364#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4365 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004366#include "clang/Basic/BuiltinsARM.def"
4367};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004368
4369class ARMleTargetInfo : public ARMTargetInfo {
4370public:
4371 ARMleTargetInfo(const llvm::Triple &Triple)
4372 : ARMTargetInfo(Triple, false) { }
4373 virtual void getTargetDefines(const LangOptions &Opts,
4374 MacroBuilder &Builder) const {
4375 Builder.defineMacro("__ARMEL__");
4376 ARMTargetInfo::getTargetDefines(Opts, Builder);
4377 }
4378};
4379
4380class ARMbeTargetInfo : public ARMTargetInfo {
4381public:
4382 ARMbeTargetInfo(const llvm::Triple &Triple)
4383 : ARMTargetInfo(Triple, true) { }
4384 virtual void getTargetDefines(const LangOptions &Opts,
4385 MacroBuilder &Builder) const {
4386 Builder.defineMacro("__ARMEB__");
4387 Builder.defineMacro("__ARM_BIG_ENDIAN");
4388 ARMTargetInfo::getTargetDefines(Opts, Builder);
4389 }
4390};
Chris Lattner17df24e2008-04-21 18:56:49 +00004391} // end anonymous namespace.
4392
Eli Friedmanf05b7722008-08-20 07:44:10 +00004393namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004394class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4395 const llvm::Triple Triple;
4396public:
4397 WindowsARMTargetInfo(const llvm::Triple &Triple)
4398 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4399 TLSSupported = false;
4400 WCharType = UnsignedShort;
4401 SizeType = UnsignedInt;
4402 UserLabelPrefix = "";
4403 }
4404 void getVisualStudioDefines(const LangOptions &Opts,
4405 MacroBuilder &Builder) const {
4406 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4407
4408 // FIXME: this is invalid for WindowsCE
4409 Builder.defineMacro("_M_ARM_NT", "1");
4410 Builder.defineMacro("_M_ARMT", "_M_ARM");
4411 Builder.defineMacro("_M_THUMB", "_M_ARM");
4412
4413 assert((Triple.getArch() == llvm::Triple::arm ||
4414 Triple.getArch() == llvm::Triple::thumb) &&
4415 "invalid architecture for Windows ARM target info");
4416 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4417 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4418
4419 // TODO map the complete set of values
4420 // 31: VFPv3 40: VFPv4
4421 Builder.defineMacro("_M_ARM_FP", "31");
4422 }
4423};
4424
4425// Windows ARM + Itanium C++ ABI Target
4426class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4427public:
4428 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4429 : WindowsARMTargetInfo(Triple) {
4430 TheCXXABI.set(TargetCXXABI::GenericARM);
4431 }
4432
4433 void getTargetDefines(const LangOptions &Opts,
4434 MacroBuilder &Builder) const override {
4435 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4436
4437 if (Opts.MSVCCompat)
4438 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4439 }
4440};
4441
4442// Windows ARM, MS (C++) ABI
4443class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4444public:
4445 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4446 : WindowsARMTargetInfo(Triple) {
4447 TheCXXABI.set(TargetCXXABI::Microsoft);
4448 }
4449
4450 void getTargetDefines(const LangOptions &Opts,
4451 MacroBuilder &Builder) const override {
4452 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4453 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4454 }
4455};
4456}
4457
4458
4459namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004460class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004461 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004462protected:
Craig Topper3164f332014-03-11 03:39:26 +00004463 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4464 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004465 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004466 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004467
Torok Edwinb2b37c62009-06-30 17:10:35 +00004468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004469 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004470 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004471 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004472 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004473 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004474 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004475
4476 // Darwin on iOS uses a variant of the ARM C++ ABI.
4477 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004478 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004479};
4480} // end anonymous namespace.
4481
Tony Linthicum76329bf2011-12-12 21:14:55 +00004482
4483namespace {
Tim Northovera2ee4332014-03-29 15:09:45 +00004484class ARM64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004485 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004486 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4487 static const char *const GCCRegNames[];
4488
James Molloy75f5f9e2014-04-16 15:33:48 +00004489 enum FPUModeEnum {
4490 FPUMode,
4491 NeonMode
4492 };
4493
4494 unsigned FPU;
4495 unsigned Crypto;
4496
Tim Northovera2ee4332014-03-29 15:09:45 +00004497 static const Builtin::Info BuiltinInfo[];
4498
4499 std::string ABI;
4500
4501public:
4502 ARM64TargetInfo(const llvm::Triple &Triple)
4503 : TargetInfo(Triple), ABI("aapcs") {
Tim Northovera2ee4332014-03-29 15:09:45 +00004504 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4505 IntMaxType = SignedLong;
4506 UIntMaxType = UnsignedLong;
4507 Int64Type = SignedLong;
4508 WCharType = UnsignedInt;
4509 MaxVectorAlign = 128;
4510 RegParmMax = 8;
4511 MaxAtomicInlineWidth = 128;
4512 MaxAtomicPromoteWidth = 128;
4513
4514 LongDoubleWidth = LongDoubleAlign = 128;
4515 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4516
Tim Northovera2ee4332014-03-29 15:09:45 +00004517 // {} in inline assembly are neon specifiers, not assembly variant
4518 // specifiers.
4519 NoAsmVariants = true;
4520
4521 // ARM64 targets default to using the ARM C++ ABI.
4522 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4523 }
4524
4525 virtual const char *getABI() const { return ABI.c_str(); }
4526 virtual bool setABI(const std::string &Name) {
4527 if (Name != "aapcs" && Name != "darwinpcs")
4528 return false;
4529
4530 ABI = Name;
4531 return true;
4532 }
4533
4534 virtual bool setCPU(const std::string &Name) {
4535 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004536 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004537 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004538 .Case("cyclone", true)
4539 .Default(false);
4540 return CPUKnown;
4541 }
4542
4543 virtual void getTargetDefines(const LangOptions &Opts,
4544 MacroBuilder &Builder) const {
4545 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004546 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004547
4548 // Target properties.
4549 Builder.defineMacro("_LP64");
4550 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004551
4552 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4553 Builder.defineMacro("__ARM_ACLE", "200");
4554 Builder.defineMacro("__ARM_ARCH", "8");
4555 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4556
4557 Builder.defineMacro("__ARM_64BIT_STATE");
4558 Builder.defineMacro("__ARM_PCS_AAPCS64");
4559 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4560
4561 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4562 Builder.defineMacro("__ARM_FEATURE_CLZ");
4563 Builder.defineMacro("__ARM_FEATURE_FMA");
4564 Builder.defineMacro("__ARM_FEATURE_DIV");
4565
4566 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4567
4568 // 0xe implies support for half, single and double precision operations.
4569 Builder.defineMacro("__ARM_FP", "0xe");
4570
4571 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4572 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4573 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4574
4575 if (Opts.FastMath || Opts.FiniteMathOnly)
4576 Builder.defineMacro("__ARM_FP_FAST");
4577
4578 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4579 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4580
4581 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4582
4583 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4584 Opts.ShortEnums ? "1" : "4");
4585
James Molloy75f5f9e2014-04-16 15:33:48 +00004586 if (FPU == NeonMode) {
4587 Builder.defineMacro("__ARM_NEON");
4588 // 64-bit NEON supports half, single and double precision operations.
4589 Builder.defineMacro("__ARM_NEON_FP", "7");
4590 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004591
James Molloy75f5f9e2014-04-16 15:33:48 +00004592 if (Crypto)
4593 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004594 }
4595
4596 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4597 unsigned &NumRecords) const {
4598 Records = BuiltinInfo;
4599 NumRecords = clang::ARM64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4600 }
4601
4602 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004603 return Feature == "aarch64" ||
4604 Feature == "arm64" ||
4605 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004606 }
4607
James Molloy5e73df52014-04-16 15:06:20 +00004608 bool handleTargetFeatures(std::vector<std::string> &Features,
4609 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004610 FPU = FPUMode;
4611 Crypto = 0;
4612 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4613 if (Features[i] == "+neon")
4614 FPU = NeonMode;
4615 if (Features[i] == "+crypto")
4616 Crypto = 1;
4617 }
4618
James Molloy5e73df52014-04-16 15:06:20 +00004619 setDescriptionString();
4620
4621 return true;
4622 }
4623
Tim Northovera2ee4332014-03-29 15:09:45 +00004624 virtual bool isCLZForZeroUndef() const { return false; }
4625
4626 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4627 return TargetInfo::AArch64ABIBuiltinVaList;
4628 }
4629
4630 virtual void getGCCRegNames(const char *const *&Names,
4631 unsigned &NumNames) const;
4632 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4633 unsigned &NumAliases) const;
4634
4635 virtual bool validateAsmConstraint(const char *&Name,
4636 TargetInfo::ConstraintInfo &Info) const {
4637 switch (*Name) {
4638 default:
4639 return false;
4640 case 'w': // Floating point and SIMD registers (V0-V31)
4641 Info.setAllowsRegister();
4642 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004643 case 'I': // Constant that can be used with an ADD instruction
4644 case 'J': // Constant that can be used with a SUB instruction
4645 case 'K': // Constant that can be used with a 32-bit logical instruction
4646 case 'L': // Constant that can be used with a 64-bit logical instruction
4647 case 'M': // Constant that can be used as a 32-bit MOV immediate
4648 case 'N': // Constant that can be used as a 64-bit MOV immediate
4649 case 'Y': // Floating point constant zero
4650 case 'Z': // Integer constant zero
4651 return true;
4652 case 'Q': // A memory reference with base register and no offset
4653 Info.setAllowsMemory();
4654 return true;
4655 case 'S': // A symbolic address
4656 Info.setAllowsRegister();
4657 return true;
4658 case 'U':
4659 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4660 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4661 // Usa: An absolute symbolic address
4662 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4663 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004664 case 'z': // Zero register, wzr or xzr
4665 Info.setAllowsRegister();
4666 return true;
4667 case 'x': // Floating point and SIMD registers (V0-V15)
4668 Info.setAllowsRegister();
4669 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004670 }
4671 return false;
4672 }
4673
Tim Northovera2ee4332014-03-29 15:09:45 +00004674 virtual const char *getClobbers() const { return ""; }
4675
4676 int getEHDataRegisterNumber(unsigned RegNo) const {
4677 if (RegNo == 0)
4678 return 0;
4679 if (RegNo == 1)
4680 return 1;
4681 return -1;
4682 }
4683};
4684
4685const char *const ARM64TargetInfo::GCCRegNames[] = {
4686 // 32-bit Integer registers
4687 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4688 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4689 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4690
4691 // 64-bit Integer registers
4692 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4693 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4694 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4695
4696 // 32-bit floating point regsisters
4697 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4698 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4699 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4700
4701 // 64-bit floating point regsisters
4702 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4703 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4704 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4705
4706 // Vector registers
4707 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4708 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4709 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4710};
4711
4712void ARM64TargetInfo::getGCCRegNames(const char *const *&Names,
4713 unsigned &NumNames) const {
4714 Names = GCCRegNames;
4715 NumNames = llvm::array_lengthof(GCCRegNames);
4716}
4717
4718const TargetInfo::GCCRegAlias ARM64TargetInfo::GCCRegAliases[] = {
4719 { { "w31" }, "wsp" },
4720 { { "x29" }, "fp" },
4721 { { "x30" }, "lr" },
4722 { { "x31" }, "sp" },
4723 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4724 // don't want to substitute one of these for a different-sized one.
4725};
4726
4727void ARM64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4728 unsigned &NumAliases) const {
4729 Aliases = GCCRegAliases;
4730 NumAliases = llvm::array_lengthof(GCCRegAliases);
4731}
4732
4733const Builtin::Info ARM64TargetInfo::BuiltinInfo[] = {
4734#define BUILTIN(ID, TYPE, ATTRS) \
4735 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4736#include "clang/Basic/BuiltinsNEON.def"
4737
4738#define BUILTIN(ID, TYPE, ATTRS) \
4739 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4740#include "clang/Basic/BuiltinsARM64.def"
4741};
James Molloy5e73df52014-04-16 15:06:20 +00004742
4743class ARM64leTargetInfo : public ARM64TargetInfo {
4744 void setDescriptionString() override {
4745 if (getTriple().isOSBinFormatMachO())
4746 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4747 else
4748 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4749 }
4750
4751public:
4752 ARM64leTargetInfo(const llvm::Triple &Triple)
4753 : ARM64TargetInfo(Triple) {
4754 BigEndian = false;
4755 }
4756 void getTargetDefines(const LangOptions &Opts,
4757 MacroBuilder &Builder) const override {
4758 Builder.defineMacro("__AARCH64EL__");
4759 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4760 }
4761};
4762
4763class ARM64beTargetInfo : public ARM64TargetInfo {
4764 void setDescriptionString() override {
4765 assert(!getTriple().isOSBinFormatMachO());
4766 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4767 }
4768
4769public:
4770 ARM64beTargetInfo(const llvm::Triple &Triple)
4771 : ARM64TargetInfo(Triple) { }
4772 void getTargetDefines(const LangOptions &Opts,
4773 MacroBuilder &Builder) const override {
4774 Builder.defineMacro("__AARCH64EB__");
4775 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4776 Builder.defineMacro("__ARM_BIG_ENDIAN");
4777 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4778 }
4779};
Tim Northovera2ee4332014-03-29 15:09:45 +00004780} // end anonymous namespace.
4781
4782namespace {
James Molloy5e73df52014-04-16 15:06:20 +00004783class DarwinARM64TargetInfo : public DarwinTargetInfo<ARM64leTargetInfo> {
4784protected:
4785 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4786 MacroBuilder &Builder) const override {
4787 Builder.defineMacro("__AARCH64_SIMD__");
4788 Builder.defineMacro("__ARM64_ARCH_8__");
4789 Builder.defineMacro("__ARM_NEON__");
4790 Builder.defineMacro("__LITTLE_ENDIAN__");
4791 Builder.defineMacro("__REGISTER_PREFIX__", "");
4792 Builder.defineMacro("__arm64", "1");
4793 Builder.defineMacro("__arm64__", "1");
4794
4795 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4796 }
4797
Tim Northovera2ee4332014-03-29 15:09:45 +00004798public:
4799 DarwinARM64TargetInfo(const llvm::Triple &Triple)
James Molloy5e73df52014-04-16 15:06:20 +00004800 : DarwinTargetInfo<ARM64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004801 Int64Type = SignedLongLong;
4802 WCharType = SignedInt;
4803 UseSignedCharForObjCBool = false;
4804
4805 LongDoubleWidth = LongDoubleAlign = 64;
4806 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4807
4808 TheCXXABI.set(TargetCXXABI::iOS64);
4809 }
4810
4811 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4812 return TargetInfo::CharPtrBuiltinVaList;
4813 }
4814};
4815} // end anonymous namespace
4816
4817namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004818// Hexagon abstract base class
4819class HexagonTargetInfo : public TargetInfo {
4820 static const Builtin::Info BuiltinInfo[];
4821 static const char * const GCCRegNames[];
4822 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4823 std::string CPU;
4824public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004825 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004826 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004827 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004828
4829 // {} in inline assembly are packet specifiers, not assembly variant
4830 // specifiers.
4831 NoAsmVariants = true;
4832 }
4833
Craig Topper3164f332014-03-11 03:39:26 +00004834 void getTargetBuiltins(const Builtin::Info *&Records,
4835 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004836 Records = BuiltinInfo;
4837 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4838 }
4839
Craig Topper3164f332014-03-11 03:39:26 +00004840 bool validateAsmConstraint(const char *&Name,
4841 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004842 return true;
4843 }
4844
Craig Topper3164f332014-03-11 03:39:26 +00004845 void getTargetDefines(const LangOptions &Opts,
4846 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004847
Craig Topper3164f332014-03-11 03:39:26 +00004848 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004849 return Feature == "hexagon";
4850 }
Craig Topper3164f332014-03-11 03:39:26 +00004851
4852 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004853 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004854 }
Craig Topper3164f332014-03-11 03:39:26 +00004855 void getGCCRegNames(const char * const *&Names,
4856 unsigned &NumNames) const override;
4857 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4858 unsigned &NumAliases) const override;
4859 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004860 return "";
4861 }
Sebastian Pop86500282012-01-13 20:37:10 +00004862
4863 static const char *getHexagonCPUSuffix(StringRef Name) {
4864 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004865 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004866 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004867 .Default(0);
4868 }
4869
Craig Topper3164f332014-03-11 03:39:26 +00004870 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004871 if (!getHexagonCPUSuffix(Name))
4872 return false;
4873
Tony Linthicum76329bf2011-12-12 21:14:55 +00004874 CPU = Name;
4875 return true;
4876 }
4877};
4878
4879void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4880 MacroBuilder &Builder) const {
4881 Builder.defineMacro("qdsp6");
4882 Builder.defineMacro("__qdsp6", "1");
4883 Builder.defineMacro("__qdsp6__", "1");
4884
4885 Builder.defineMacro("hexagon");
4886 Builder.defineMacro("__hexagon", "1");
4887 Builder.defineMacro("__hexagon__", "1");
4888
4889 if(CPU == "hexagonv1") {
4890 Builder.defineMacro("__HEXAGON_V1__");
4891 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4892 if(Opts.HexagonQdsp6Compat) {
4893 Builder.defineMacro("__QDSP6_V1__");
4894 Builder.defineMacro("__QDSP6_ARCH__", "1");
4895 }
4896 }
4897 else if(CPU == "hexagonv2") {
4898 Builder.defineMacro("__HEXAGON_V2__");
4899 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4900 if(Opts.HexagonQdsp6Compat) {
4901 Builder.defineMacro("__QDSP6_V2__");
4902 Builder.defineMacro("__QDSP6_ARCH__", "2");
4903 }
4904 }
4905 else if(CPU == "hexagonv3") {
4906 Builder.defineMacro("__HEXAGON_V3__");
4907 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4908 if(Opts.HexagonQdsp6Compat) {
4909 Builder.defineMacro("__QDSP6_V3__");
4910 Builder.defineMacro("__QDSP6_ARCH__", "3");
4911 }
4912 }
4913 else if(CPU == "hexagonv4") {
4914 Builder.defineMacro("__HEXAGON_V4__");
4915 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4916 if(Opts.HexagonQdsp6Compat) {
4917 Builder.defineMacro("__QDSP6_V4__");
4918 Builder.defineMacro("__QDSP6_ARCH__", "4");
4919 }
4920 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004921 else if(CPU == "hexagonv5") {
4922 Builder.defineMacro("__HEXAGON_V5__");
4923 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4924 if(Opts.HexagonQdsp6Compat) {
4925 Builder.defineMacro("__QDSP6_V5__");
4926 Builder.defineMacro("__QDSP6_ARCH__", "5");
4927 }
4928 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004929}
4930
4931const char * const HexagonTargetInfo::GCCRegNames[] = {
4932 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4933 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4934 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4935 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4936 "p0", "p1", "p2", "p3",
4937 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4938};
4939
4940void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4941 unsigned &NumNames) const {
4942 Names = GCCRegNames;
4943 NumNames = llvm::array_lengthof(GCCRegNames);
4944}
4945
4946
4947const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4948 { { "sp" }, "r29" },
4949 { { "fp" }, "r30" },
4950 { { "lr" }, "r31" },
4951 };
4952
4953void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4954 unsigned &NumAliases) const {
4955 Aliases = GCCRegAliases;
4956 NumAliases = llvm::array_lengthof(GCCRegAliases);
4957}
4958
4959
4960const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4961#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4962#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4963 ALL_LANGUAGES },
4964#include "clang/Basic/BuiltinsHexagon.def"
4965};
4966}
4967
4968
Chris Lattner5ba61f02006-10-14 07:39:34 +00004969namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004970// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4971class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004972 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4973 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004974 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004975public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004976 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004977
Craig Topper3164f332014-03-11 03:39:26 +00004978 bool handleTargetFeatures(std::vector<std::string> &Features,
4979 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004980 SoftFloat = false;
4981 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4982 if (Features[i] == "+soft-float")
4983 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004984 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004985 }
Craig Topper3164f332014-03-11 03:39:26 +00004986 void getTargetDefines(const LangOptions &Opts,
4987 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004988 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004989 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004990
4991 if (SoftFloat)
4992 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004993 }
Craig Topper3164f332014-03-11 03:39:26 +00004994
4995 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004996 return llvm::StringSwitch<bool>(Feature)
4997 .Case("softfloat", SoftFloat)
4998 .Case("sparc", true)
4999 .Default(false);
5000 }
Craig Topper3164f332014-03-11 03:39:26 +00005001
5002 void getTargetBuiltins(const Builtin::Info *&Records,
5003 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005004 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005005 }
Craig Topper3164f332014-03-11 03:39:26 +00005006 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005007 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005008 }
Craig Topper3164f332014-03-11 03:39:26 +00005009 void getGCCRegNames(const char * const *&Names,
5010 unsigned &NumNames) const override;
5011 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5012 unsigned &NumAliases) const override;
5013 bool validateAsmConstraint(const char *&Name,
5014 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005015 // FIXME: Implement!
5016 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005017 }
Craig Topper3164f332014-03-11 03:39:26 +00005018 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005019 // FIXME: Implement!
5020 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005021 }
5022};
5023
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005024const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005025 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5026 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5027 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5028 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5029};
5030
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005031void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5032 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005033 Names = GCCRegNames;
5034 NumNames = llvm::array_lengthof(GCCRegNames);
5035}
5036
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005037const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005038 { { "g0" }, "r0" },
5039 { { "g1" }, "r1" },
5040 { { "g2" }, "r2" },
5041 { { "g3" }, "r3" },
5042 { { "g4" }, "r4" },
5043 { { "g5" }, "r5" },
5044 { { "g6" }, "r6" },
5045 { { "g7" }, "r7" },
5046 { { "o0" }, "r8" },
5047 { { "o1" }, "r9" },
5048 { { "o2" }, "r10" },
5049 { { "o3" }, "r11" },
5050 { { "o4" }, "r12" },
5051 { { "o5" }, "r13" },
5052 { { "o6", "sp" }, "r14" },
5053 { { "o7" }, "r15" },
5054 { { "l0" }, "r16" },
5055 { { "l1" }, "r17" },
5056 { { "l2" }, "r18" },
5057 { { "l3" }, "r19" },
5058 { { "l4" }, "r20" },
5059 { { "l5" }, "r21" },
5060 { { "l6" }, "r22" },
5061 { { "l7" }, "r23" },
5062 { { "i0" }, "r24" },
5063 { { "i1" }, "r25" },
5064 { { "i2" }, "r26" },
5065 { { "i3" }, "r27" },
5066 { { "i4" }, "r28" },
5067 { { "i5" }, "r29" },
5068 { { "i6", "fp" }, "r30" },
5069 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005070};
5071
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005072void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5073 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005074 Aliases = GCCRegAliases;
5075 NumAliases = llvm::array_lengthof(GCCRegAliases);
5076}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005077
5078// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5079class SparcV8TargetInfo : public SparcTargetInfo {
5080public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005081 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005082 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005083 }
5084
Craig Topper3164f332014-03-11 03:39:26 +00005085 void getTargetDefines(const LangOptions &Opts,
5086 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005087 SparcTargetInfo::getTargetDefines(Opts, Builder);
5088 Builder.defineMacro("__sparcv8");
5089 }
5090};
5091
5092// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5093class SparcV9TargetInfo : public SparcTargetInfo {
5094public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005095 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005096 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005097 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005098 // This is an LP64 platform.
5099 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005100
5101 // OpenBSD uses long long for int64_t and intmax_t.
5102 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
5103 IntMaxType = SignedLongLong;
5104 UIntMaxType = UnsignedLongLong;
5105 } else {
5106 IntMaxType = SignedLong;
5107 UIntMaxType = UnsignedLong;
5108 }
5109 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005110
5111 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5112 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5113 LongDoubleWidth = 128;
5114 LongDoubleAlign = 128;
5115 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005116 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005117 }
5118
Craig Topper3164f332014-03-11 03:39:26 +00005119 void getTargetDefines(const LangOptions &Opts,
5120 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005121 SparcTargetInfo::getTargetDefines(Opts, Builder);
5122 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005123 Builder.defineMacro("__arch64__");
5124 // Solaris and its derivative AuroraUX don't need these variants, but the
5125 // BSDs do.
5126 if (getTriple().getOS() != llvm::Triple::Solaris &&
5127 getTriple().getOS() != llvm::Triple::AuroraUX) {
5128 Builder.defineMacro("__sparc64__");
5129 Builder.defineMacro("__sparc_v9__");
5130 Builder.defineMacro("__sparcv9__");
5131 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005132 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005133
Craig Topper3164f332014-03-11 03:39:26 +00005134 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005135 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5136 .Case("v9", true)
5137 .Case("ultrasparc", true)
5138 .Case("ultrasparc3", true)
5139 .Case("niagara", true)
5140 .Case("niagara2", true)
5141 .Case("niagara3", true)
5142 .Case("niagara4", true)
5143 .Default(false);
5144
5145 // No need to store the CPU yet. There aren't any CPU-specific
5146 // macros to define.
5147 return CPUKnown;
5148 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005149};
5150
Gabor Greif49991682008-02-21 16:29:08 +00005151} // end anonymous namespace.
5152
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005153namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005154class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5155public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005156 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5157 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005158 SizeType = UnsignedInt;
5159 PtrDiffType = SignedInt;
5160 }
5161};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005162class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005163public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005164 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5165 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005166 SizeType = UnsignedInt;
5167 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005168 }
5169};
5170} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005171
Chris Lattnerb781dc792008-05-08 05:58:21 +00005172namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005173class SystemZTargetInfo : public TargetInfo {
5174 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005175
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005176public:
5177 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5178 TLSSupported = true;
5179 IntWidth = IntAlign = 32;
5180 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5181 PointerWidth = PointerAlign = 64;
5182 LongDoubleWidth = 128;
5183 LongDoubleAlign = 64;
5184 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5185 MinGlobalAlign = 16;
5186 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5187 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5188 }
5189 void getTargetDefines(const LangOptions &Opts,
5190 MacroBuilder &Builder) const override {
5191 Builder.defineMacro("__s390__");
5192 Builder.defineMacro("__s390x__");
5193 Builder.defineMacro("__zarch__");
5194 Builder.defineMacro("__LONG_DOUBLE_128__");
5195 }
5196 void getTargetBuiltins(const Builtin::Info *&Records,
5197 unsigned &NumRecords) const override {
5198 // FIXME: Implement.
5199 Records = 0;
5200 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005201 }
5202
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005203 void getGCCRegNames(const char *const *&Names,
5204 unsigned &NumNames) const override;
5205 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5206 unsigned &NumAliases) const override {
5207 // No aliases.
5208 Aliases = 0;
5209 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005210 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005211 bool validateAsmConstraint(const char *&Name,
5212 TargetInfo::ConstraintInfo &info) const override;
5213 const char *getClobbers() const override {
5214 // FIXME: Is this really right?
5215 return "";
5216 }
5217 BuiltinVaListKind getBuiltinVaListKind() const override {
5218 return TargetInfo::SystemZBuiltinVaList;
5219 }
5220 bool setCPU(const std::string &Name) override {
5221 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5222 .Case("z10", true)
5223 .Case("z196", true)
5224 .Case("zEC12", true)
5225 .Default(false);
5226
5227 // No need to store the CPU yet. There aren't any CPU-specific
5228 // macros to define.
5229 return CPUKnown;
5230 }
5231};
5232
5233const char *const SystemZTargetInfo::GCCRegNames[] = {
5234 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5235 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5236 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5237 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5238};
5239
5240void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5241 unsigned &NumNames) const {
5242 Names = GCCRegNames;
5243 NumNames = llvm::array_lengthof(GCCRegNames);
5244}
5245
5246bool SystemZTargetInfo::
5247validateAsmConstraint(const char *&Name,
5248 TargetInfo::ConstraintInfo &Info) const {
5249 switch (*Name) {
5250 default:
5251 return false;
5252
5253 case 'a': // Address register
5254 case 'd': // Data register (equivalent to 'r')
5255 case 'f': // Floating-point register
5256 Info.setAllowsRegister();
5257 return true;
5258
5259 case 'I': // Unsigned 8-bit constant
5260 case 'J': // Unsigned 12-bit constant
5261 case 'K': // Signed 16-bit constant
5262 case 'L': // Signed 20-bit displacement (on all targets we support)
5263 case 'M': // 0x7fffffff
5264 return true;
5265
5266 case 'Q': // Memory with base and unsigned 12-bit displacement
5267 case 'R': // Likewise, plus an index
5268 case 'S': // Memory with base and signed 20-bit displacement
5269 case 'T': // Likewise, plus an index
5270 Info.setAllowsMemory();
5271 return true;
5272 }
5273}
Ulrich Weigand47445072013-05-06 16:26:41 +00005274}
5275
5276namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005277 class MSP430TargetInfo : public TargetInfo {
5278 static const char * const GCCRegNames[];
5279 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005280 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005281 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005282 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005283 IntWidth = 16; IntAlign = 16;
5284 LongWidth = 32; LongLongWidth = 64;
5285 LongAlign = LongLongAlign = 16;
5286 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005287 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005288 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005289 IntMaxType = SignedLongLong;
5290 UIntMaxType = UnsignedLongLong;
5291 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005292 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005293 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005294 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005295 }
5296 void getTargetDefines(const LangOptions &Opts,
5297 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005298 Builder.defineMacro("MSP430");
5299 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005300 // FIXME: defines for different 'flavours' of MCU
5301 }
Craig Topper3164f332014-03-11 03:39:26 +00005302 void getTargetBuiltins(const Builtin::Info *&Records,
5303 unsigned &NumRecords) const override {
5304 // FIXME: Implement.
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005305 Records = 0;
5306 NumRecords = 0;
5307 }
Craig Topper3164f332014-03-11 03:39:26 +00005308 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005309 return Feature == "msp430";
5310 }
Craig Topper3164f332014-03-11 03:39:26 +00005311 void getGCCRegNames(const char * const *&Names,
5312 unsigned &NumNames) const override;
5313 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5314 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005315 // No aliases.
5316 Aliases = 0;
5317 NumAliases = 0;
5318 }
Craig Topper3164f332014-03-11 03:39:26 +00005319 bool validateAsmConstraint(const char *&Name,
5320 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005321 // No target constraints for now.
5322 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005323 }
Craig Topper3164f332014-03-11 03:39:26 +00005324 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005325 // FIXME: Is this really right?
5326 return "";
5327 }
Craig Topper3164f332014-03-11 03:39:26 +00005328 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005329 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005330 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005331 }
5332 };
5333
5334 const char * const MSP430TargetInfo::GCCRegNames[] = {
5335 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5336 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5337 };
5338
5339 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5340 unsigned &NumNames) const {
5341 Names = GCCRegNames;
5342 NumNames = llvm::array_lengthof(GCCRegNames);
5343 }
5344}
5345
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005346namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005347
Mike Stump11289f42009-09-09 15:08:12 +00005348 // LLVM and Clang cannot be used directly to output native binaries for
5349 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005350 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005351 //
5352 // TCE uses the llvm bitcode as input and uses it for generating customized
5353 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005354 // publicly available in http://tce.cs.tut.fi
5355
Eli Friedman1f191002011-10-07 19:51:42 +00005356 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5357 3, // opencl_global
5358 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005359 5, // opencl_constant
5360 0, // cuda_device
5361 0, // cuda_constant
5362 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005363 };
5364
Eli Friedmana9c3d712009-08-19 20:47:07 +00005365 class TCETargetInfo : public TargetInfo{
5366 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005367 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005368 TLSSupported = false;
5369 IntWidth = 32;
5370 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005371 PointerWidth = 32;
5372 IntAlign = 32;
5373 LongAlign = LongLongAlign = 32;
5374 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005375 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005376 SizeType = UnsignedInt;
5377 IntMaxType = SignedLong;
5378 UIntMaxType = UnsignedLong;
5379 IntPtrType = SignedInt;
5380 PtrDiffType = SignedInt;
5381 FloatWidth = 32;
5382 FloatAlign = 32;
5383 DoubleWidth = 32;
5384 DoubleAlign = 32;
5385 LongDoubleWidth = 32;
5386 LongDoubleAlign = 32;
5387 FloatFormat = &llvm::APFloat::IEEEsingle;
5388 DoubleFormat = &llvm::APFloat::IEEEsingle;
5389 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005390 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5391 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005392 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005393 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005394 }
5395
Craig Topper3164f332014-03-11 03:39:26 +00005396 void getTargetDefines(const LangOptions &Opts,
5397 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005398 DefineStd(Builder, "tce", Opts);
5399 Builder.defineMacro("__TCE__");
5400 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005401 }
Craig Topper3164f332014-03-11 03:39:26 +00005402 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005403 return Feature == "tce";
5404 }
Craig Topper3164f332014-03-11 03:39:26 +00005405
5406 void getTargetBuiltins(const Builtin::Info *&Records,
5407 unsigned &NumRecords) const override {}
5408 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005409 return "";
5410 }
Craig Topper3164f332014-03-11 03:39:26 +00005411 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005412 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005413 }
Craig Topper3164f332014-03-11 03:39:26 +00005414 void getGCCRegNames(const char * const *&Names,
5415 unsigned &NumNames) const override {}
5416 bool validateAsmConstraint(const char *&Name,
5417 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005418 return true;
5419 }
Craig Topper3164f332014-03-11 03:39:26 +00005420 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5421 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005422 };
5423}
5424
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005425namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005426class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005427 virtual void setDescriptionString() = 0;
5428
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005429 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005430 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005431 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005432 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005433 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005434 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005435 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005436 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005437 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005438 enum DspRevEnum {
5439 NoDSP, DSP1, DSP2
5440 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005441 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005442
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005443protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005444 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005445 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005446
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005447public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005448 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5449 const std::string &CPUStr)
5450 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005451 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005452 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005453
Craig Topper3164f332014-03-11 03:39:26 +00005454 const char *getABI() const override { return ABI.c_str(); }
5455 bool setABI(const std::string &Name) override = 0;
5456 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00005457 CPU = Name;
5458 return true;
5459 }
Craig Topper3164f332014-03-11 03:39:26 +00005460 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005461 // The backend enables certain ABI's by default according to the
5462 // architecture.
5463 // Disable both possible defaults so that we don't end up with multiple
5464 // ABI's selected and trigger an assertion.
5465 Features["o32"] = false;
5466 Features["n64"] = false;
5467
Eric Christopher0b26a612010-03-02 02:41:08 +00005468 Features[ABI] = true;
5469 Features[CPU] = true;
5470 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005471
Craig Topper3164f332014-03-11 03:39:26 +00005472 void getTargetDefines(const LangOptions &Opts,
5473 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005474 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005475 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005476 if (Opts.GNUMode)
5477 Builder.defineMacro("mips");
5478
Simon Atanasyan683535b2012-08-29 19:14:58 +00005479 Builder.defineMacro("__REGISTER_PREFIX__", "");
5480
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005481 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005482 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005483 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005484 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005485 case SoftFloat:
5486 Builder.defineMacro("__mips_soft_float", Twine(1));
5487 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005488 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005489
Simon Atanasyan16071912013-04-14 14:07:30 +00005490 if (IsSingleFloat)
5491 Builder.defineMacro("__mips_single_float", Twine(1));
5492
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005493 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5494 Builder.defineMacro("_MIPS_FPSET",
5495 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5496
Simon Atanasyan72244b62012-07-05 16:06:06 +00005497 if (IsMips16)
5498 Builder.defineMacro("__mips16", Twine(1));
5499
Simon Atanasyan60777612013-04-14 14:07:51 +00005500 if (IsMicromips)
5501 Builder.defineMacro("__mips_micromips", Twine(1));
5502
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005503 if (IsNan2008)
5504 Builder.defineMacro("__mips_nan2008", Twine(1));
5505
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005506 switch (DspRev) {
5507 default:
5508 break;
5509 case DSP1:
5510 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5511 Builder.defineMacro("__mips_dsp", Twine(1));
5512 break;
5513 case DSP2:
5514 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5515 Builder.defineMacro("__mips_dspr2", Twine(1));
5516 Builder.defineMacro("__mips_dsp", Twine(1));
5517 break;
5518 }
5519
Jack Carter44ff1e52013-08-12 17:20:29 +00005520 if (HasMSA)
5521 Builder.defineMacro("__mips_msa", Twine(1));
5522
Simon Atanasyan26f19672012-04-05 19:28:31 +00005523 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5524 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5525 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005526
5527 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5528 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005529 }
5530
Craig Topper3164f332014-03-11 03:39:26 +00005531 void getTargetBuiltins(const Builtin::Info *&Records,
5532 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005533 Records = BuiltinInfo;
5534 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005535 }
Craig Topper3164f332014-03-11 03:39:26 +00005536 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005537 return llvm::StringSwitch<bool>(Feature)
5538 .Case("mips", true)
5539 .Case("fp64", HasFP64)
5540 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005541 }
Craig Topper3164f332014-03-11 03:39:26 +00005542 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005543 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005544 }
Craig Topper3164f332014-03-11 03:39:26 +00005545 void getGCCRegNames(const char * const *&Names,
5546 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005547 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005548 // CPU register names
5549 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005550 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5551 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5552 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005553 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5554 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005555 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5556 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5557 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5558 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005559 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005560 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005561 "$fcc5","$fcc6","$fcc7",
5562 // MSA register names
5563 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5564 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5565 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5566 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5567 // MSA control register names
5568 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5569 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005570 };
5571 Names = GCCRegNames;
5572 NumNames = llvm::array_lengthof(GCCRegNames);
5573 }
Craig Topper3164f332014-03-11 03:39:26 +00005574 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5575 unsigned &NumAliases) const override = 0;
5576 bool validateAsmConstraint(const char *&Name,
5577 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005578 switch (*Name) {
5579 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005580 return false;
5581
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005582 case 'r': // CPU registers.
5583 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5584 case 'y': // Equivalent to "r", backwards compatibility only.
5585 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005586 case 'c': // $25 for indirect jumps
5587 case 'l': // lo register
5588 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005589 Info.setAllowsRegister();
5590 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005591 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005592 Info.setAllowsMemory();
5593 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005594 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005595 }
5596
Craig Topper3164f332014-03-11 03:39:26 +00005597 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005598 // FIXME: Implement!
5599 return "";
5600 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005601
Craig Topper3164f332014-03-11 03:39:26 +00005602 bool handleTargetFeatures(std::vector<std::string> &Features,
5603 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005604 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005605 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005606 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005607 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005608 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005609 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005610 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005611
5612 for (std::vector<std::string>::iterator it = Features.begin(),
5613 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005614 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005615 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005616 else if (*it == "+soft-float")
5617 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005618 else if (*it == "+mips16")
5619 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005620 else if (*it == "+micromips")
5621 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005622 else if (*it == "+dsp")
5623 DspRev = std::max(DspRev, DSP1);
5624 else if (*it == "+dspr2")
5625 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005626 else if (*it == "+msa")
5627 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005628 else if (*it == "+fp64")
5629 HasFP64 = true;
5630 else if (*it == "-fp64")
5631 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005632 else if (*it == "+nan2008")
5633 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005634 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005635
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005636 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005637 std::vector<std::string>::iterator it =
5638 std::find(Features.begin(), Features.end(), "+soft-float");
5639 if (it != Features.end())
5640 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005641 it = std::find(Features.begin(), Features.end(), "+nan2008");
5642 if (it != Features.end())
5643 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005644
Akira Hatanaka9064e362013-10-29 18:30:33 +00005645 setDescriptionString();
5646
Rafael Espindolaeb265472013-08-21 21:59:03 +00005647 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005648 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005649
Craig Topper3164f332014-03-11 03:39:26 +00005650 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005651 if (RegNo == 0) return 4;
5652 if (RegNo == 1) return 5;
5653 return -1;
5654 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005655};
5656
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005657const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5658#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5659#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5660 ALL_LANGUAGES },
5661#include "clang/Basic/BuiltinsMips.def"
5662};
5663
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005664class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005665public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005666 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005667 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005668 SizeType = UnsignedInt;
5669 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005670 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005671 }
Craig Topper3164f332014-03-11 03:39:26 +00005672 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005673 if ((Name == "o32") || (Name == "eabi")) {
5674 ABI = Name;
5675 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005676 } else if (Name == "32") {
5677 ABI = "o32";
5678 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005679 } else
5680 return false;
5681 }
Craig Topper3164f332014-03-11 03:39:26 +00005682 void getTargetDefines(const LangOptions &Opts,
5683 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005684 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005685
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005686 Builder.defineMacro("__mips", "32");
5687
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005688 if (ABI == "o32") {
5689 Builder.defineMacro("__mips_o32");
5690 Builder.defineMacro("_ABIO32", "1");
5691 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5692 }
5693 else if (ABI == "eabi")
5694 Builder.defineMacro("__mips_eabi");
5695 else
David Blaikie83d382b2011-09-23 05:06:16 +00005696 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005697 }
Craig Topper3164f332014-03-11 03:39:26 +00005698 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5699 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005700 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5701 { { "at" }, "$1" },
5702 { { "v0" }, "$2" },
5703 { { "v1" }, "$3" },
5704 { { "a0" }, "$4" },
5705 { { "a1" }, "$5" },
5706 { { "a2" }, "$6" },
5707 { { "a3" }, "$7" },
5708 { { "t0" }, "$8" },
5709 { { "t1" }, "$9" },
5710 { { "t2" }, "$10" },
5711 { { "t3" }, "$11" },
5712 { { "t4" }, "$12" },
5713 { { "t5" }, "$13" },
5714 { { "t6" }, "$14" },
5715 { { "t7" }, "$15" },
5716 { { "s0" }, "$16" },
5717 { { "s1" }, "$17" },
5718 { { "s2" }, "$18" },
5719 { { "s3" }, "$19" },
5720 { { "s4" }, "$20" },
5721 { { "s5" }, "$21" },
5722 { { "s6" }, "$22" },
5723 { { "s7" }, "$23" },
5724 { { "t8" }, "$24" },
5725 { { "t9" }, "$25" },
5726 { { "k0" }, "$26" },
5727 { { "k1" }, "$27" },
5728 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005729 { { "sp","$sp" }, "$29" },
5730 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005731 { { "ra" }, "$31" }
5732 };
5733 Aliases = GCCRegAliases;
5734 NumAliases = llvm::array_lengthof(GCCRegAliases);
5735 }
5736};
5737
5738class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005739 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005740 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005741 }
5742
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005743public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005744 Mips32EBTargetInfo(const llvm::Triple &Triple)
5745 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005746 }
Craig Topper3164f332014-03-11 03:39:26 +00005747 void getTargetDefines(const LangOptions &Opts,
5748 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005749 DefineStd(Builder, "MIPSEB", Opts);
5750 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005751 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005752 }
5753};
5754
5755class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005756 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005757 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005758 }
5759
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005760public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005761 Mips32ELTargetInfo(const llvm::Triple &Triple)
5762 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005763 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005764 }
Craig Topper3164f332014-03-11 03:39:26 +00005765 void getTargetDefines(const LangOptions &Opts,
5766 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005767 DefineStd(Builder, "MIPSEL", Opts);
5768 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005769 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005770 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005771};
Akira Hatanakabef17452011-09-20 19:21:49 +00005772
5773class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005774public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005776 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005777 LongDoubleWidth = LongDoubleAlign = 128;
5778 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005779 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5780 LongDoubleWidth = LongDoubleAlign = 64;
5781 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5782 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005783 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005784 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005785 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005786 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005787
5788 void setN64ABITypes() {
5789 LongWidth = LongAlign = 64;
5790 PointerWidth = PointerAlign = 64;
5791 SizeType = UnsignedLong;
5792 PtrDiffType = SignedLong;
5793 }
5794
5795 void setN32ABITypes() {
5796 LongWidth = LongAlign = 32;
5797 PointerWidth = PointerAlign = 32;
5798 SizeType = UnsignedInt;
5799 PtrDiffType = SignedInt;
5800 }
5801
Craig Topper3164f332014-03-11 03:39:26 +00005802 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005803 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005804 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005805 ABI = Name;
5806 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005807 } else if (Name == "n64" || Name == "64") {
5808 setN64ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005809 ABI = "n64";
5810 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005811 }
5812 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005813 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005814
Craig Topper3164f332014-03-11 03:39:26 +00005815 void getTargetDefines(const LangOptions &Opts,
5816 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005817 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005818
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005819 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005820 Builder.defineMacro("__mips64");
5821 Builder.defineMacro("__mips64__");
5822
Akira Hatanakabef17452011-09-20 19:21:49 +00005823 if (ABI == "n32") {
5824 Builder.defineMacro("__mips_n32");
5825 Builder.defineMacro("_ABIN32", "2");
5826 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5827 }
5828 else if (ABI == "n64") {
5829 Builder.defineMacro("__mips_n64");
5830 Builder.defineMacro("_ABI64", "3");
5831 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5832 }
5833 else
David Blaikie83d382b2011-09-23 05:06:16 +00005834 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005835 }
Craig Topper3164f332014-03-11 03:39:26 +00005836 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5837 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005838 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5839 { { "at" }, "$1" },
5840 { { "v0" }, "$2" },
5841 { { "v1" }, "$3" },
5842 { { "a0" }, "$4" },
5843 { { "a1" }, "$5" },
5844 { { "a2" }, "$6" },
5845 { { "a3" }, "$7" },
5846 { { "a4" }, "$8" },
5847 { { "a5" }, "$9" },
5848 { { "a6" }, "$10" },
5849 { { "a7" }, "$11" },
5850 { { "t0" }, "$12" },
5851 { { "t1" }, "$13" },
5852 { { "t2" }, "$14" },
5853 { { "t3" }, "$15" },
5854 { { "s0" }, "$16" },
5855 { { "s1" }, "$17" },
5856 { { "s2" }, "$18" },
5857 { { "s3" }, "$19" },
5858 { { "s4" }, "$20" },
5859 { { "s5" }, "$21" },
5860 { { "s6" }, "$22" },
5861 { { "s7" }, "$23" },
5862 { { "t8" }, "$24" },
5863 { { "t9" }, "$25" },
5864 { { "k0" }, "$26" },
5865 { { "k1" }, "$27" },
5866 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005867 { { "sp","$sp" }, "$29" },
5868 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005869 { { "ra" }, "$31" }
5870 };
5871 Aliases = GCCRegAliases;
5872 NumAliases = llvm::array_lengthof(GCCRegAliases);
5873 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005874
5875 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005876};
5877
5878class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005879 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005880 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005881 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 +00005882 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005883 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005884
Akira Hatanakabef17452011-09-20 19:21:49 +00005885 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005886
Akira Hatanakabef17452011-09-20 19:21:49 +00005887public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005888 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005889 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005890 void getTargetDefines(const LangOptions &Opts,
5891 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005892 DefineStd(Builder, "MIPSEB", Opts);
5893 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005894 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005895 }
5896};
5897
5898class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005899 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005900 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005901 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 +00005902 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005903 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005904 }
5905public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005906 Mips64ELTargetInfo(const llvm::Triple &Triple)
5907 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005908 // Default ABI is n64.
5909 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005910 }
Craig Topper3164f332014-03-11 03:39:26 +00005911 void getTargetDefines(const LangOptions &Opts,
5912 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005913 DefineStd(Builder, "MIPSEL", Opts);
5914 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005915 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005916 }
5917};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005918} // end anonymous namespace.
5919
Ivan Krasindd7403e2011-08-24 20:22:22 +00005920namespace {
5921class PNaClTargetInfo : public TargetInfo {
5922public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005923 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005924 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005925 this->UserLabelPrefix = "";
5926 this->LongAlign = 32;
5927 this->LongWidth = 32;
5928 this->PointerAlign = 32;
5929 this->PointerWidth = 32;
5930 this->IntMaxType = TargetInfo::SignedLongLong;
5931 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5932 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005933 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005934 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005935 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005936 this->SizeType = TargetInfo::UnsignedInt;
5937 this->PtrDiffType = TargetInfo::SignedInt;
5938 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005939 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005940 }
5941
Craig Topper3164f332014-03-11 03:39:26 +00005942 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005943 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005944 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005945 Builder.defineMacro("__le32__");
5946 Builder.defineMacro("__pnacl__");
5947 }
Craig Topper3164f332014-03-11 03:39:26 +00005948 void getTargetDefines(const LangOptions &Opts,
5949 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005950 getArchDefines(Opts, Builder);
5951 }
Craig Topper3164f332014-03-11 03:39:26 +00005952 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005953 return Feature == "pnacl";
5954 }
Craig Topper3164f332014-03-11 03:39:26 +00005955 void getTargetBuiltins(const Builtin::Info *&Records,
5956 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005957 }
Craig Topper3164f332014-03-11 03:39:26 +00005958 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005959 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005960 }
Craig Topper3164f332014-03-11 03:39:26 +00005961 void getGCCRegNames(const char * const *&Names,
5962 unsigned &NumNames) const override;
5963 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5964 unsigned &NumAliases) const override;
5965 bool validateAsmConstraint(const char *&Name,
5966 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005967 return false;
5968 }
5969
Craig Topper3164f332014-03-11 03:39:26 +00005970 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005971 return "";
5972 }
5973};
5974
5975void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5976 unsigned &NumNames) const {
5977 Names = NULL;
5978 NumNames = 0;
5979}
5980
5981void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5982 unsigned &NumAliases) const {
5983 Aliases = NULL;
5984 NumAliases = 0;
5985}
5986} // end anonymous namespace.
5987
Guy Benyeib798fc92012-12-11 21:38:14 +00005988namespace {
5989 static const unsigned SPIRAddrSpaceMap[] = {
5990 1, // opencl_global
5991 3, // opencl_local
5992 2, // opencl_constant
5993 0, // cuda_device
5994 0, // cuda_constant
5995 0 // cuda_shared
5996 };
5997 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005998 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005999 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006000 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6001 "SPIR target must use unknown OS");
6002 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6003 "SPIR target must use unknown environment type");
6004 BigEndian = false;
6005 TLSSupported = false;
6006 LongWidth = LongAlign = 64;
6007 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006008 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006009 // Define available target features
6010 // These must be defined in sorted order!
6011 NoAsmVariants = true;
6012 }
Craig Topper3164f332014-03-11 03:39:26 +00006013 void getTargetDefines(const LangOptions &Opts,
6014 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006015 DefineStd(Builder, "SPIR", Opts);
6016 }
Craig Topper3164f332014-03-11 03:39:26 +00006017 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006018 return Feature == "spir";
6019 }
Craig Topper3164f332014-03-11 03:39:26 +00006020
6021 void getTargetBuiltins(const Builtin::Info *&Records,
6022 unsigned &NumRecords) const override {}
6023 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006024 return "";
6025 }
Craig Topper3164f332014-03-11 03:39:26 +00006026 void getGCCRegNames(const char * const *&Names,
6027 unsigned &NumNames) const override {}
6028 bool validateAsmConstraint(const char *&Name,
6029 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006030 return true;
6031 }
Craig Topper3164f332014-03-11 03:39:26 +00006032 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6033 unsigned &NumAliases) const override {}
6034 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006035 return TargetInfo::VoidPtrBuiltinVaList;
6036 }
6037 };
6038
6039
6040 class SPIR32TargetInfo : public SPIRTargetInfo {
6041 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006042 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006043 PointerWidth = PointerAlign = 32;
6044 SizeType = TargetInfo::UnsignedInt;
6045 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6046 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006047 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6048 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006049 }
Craig Topper3164f332014-03-11 03:39:26 +00006050 void getTargetDefines(const LangOptions &Opts,
6051 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006052 DefineStd(Builder, "SPIR32", Opts);
6053 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006054 };
6055
6056 class SPIR64TargetInfo : public SPIRTargetInfo {
6057 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006058 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006059 PointerWidth = PointerAlign = 64;
6060 SizeType = TargetInfo::UnsignedLong;
6061 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006062 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6063 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006064 }
Craig Topper3164f332014-03-11 03:39:26 +00006065 void getTargetDefines(const LangOptions &Opts,
6066 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006067 DefineStd(Builder, "SPIR64", Opts);
6068 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006069 };
6070}
6071
Robert Lytton0e076492013-08-13 09:43:10 +00006072namespace {
6073class XCoreTargetInfo : public TargetInfo {
6074 static const Builtin::Info BuiltinInfo[];
6075public:
6076 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6077 BigEndian = false;
6078 NoAsmVariants = true;
6079 LongLongAlign = 32;
6080 SuitableAlign = 32;
6081 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006082 SizeType = UnsignedInt;
6083 PtrDiffType = SignedInt;
6084 IntPtrType = SignedInt;
6085 WCharType = UnsignedChar;
6086 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006087 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006088 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 +00006089 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006090 }
Craig Topper3164f332014-03-11 03:39:26 +00006091 void getTargetDefines(const LangOptions &Opts,
6092 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006093 Builder.defineMacro("__XS1B__");
6094 }
Craig Topper3164f332014-03-11 03:39:26 +00006095 void getTargetBuiltins(const Builtin::Info *&Records,
6096 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006097 Records = BuiltinInfo;
6098 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6099 }
Craig Topper3164f332014-03-11 03:39:26 +00006100 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006101 return TargetInfo::VoidPtrBuiltinVaList;
6102 }
Craig Topper3164f332014-03-11 03:39:26 +00006103 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006104 return "";
6105 }
Craig Topper3164f332014-03-11 03:39:26 +00006106 void getGCCRegNames(const char * const *&Names,
6107 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006108 static const char * const GCCRegNames[] = {
6109 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6110 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6111 };
6112 Names = GCCRegNames;
6113 NumNames = llvm::array_lengthof(GCCRegNames);
6114 }
Craig Topper3164f332014-03-11 03:39:26 +00006115 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6116 unsigned &NumAliases) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006117 Aliases = NULL;
6118 NumAliases = 0;
6119 }
Craig Topper3164f332014-03-11 03:39:26 +00006120 bool validateAsmConstraint(const char *&Name,
6121 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006122 return false;
6123 }
Craig Topper3164f332014-03-11 03:39:26 +00006124 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006125 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6126 return (RegNo < 2)? RegNo : -1;
6127 }
Robert Lytton0e076492013-08-13 09:43:10 +00006128};
6129
6130const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6131#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6132#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6133 ALL_LANGUAGES },
6134#include "clang/Basic/BuiltinsXCore.def"
6135};
6136} // end anonymous namespace.
6137
Ivan Krasindd7403e2011-08-24 20:22:22 +00006138
Chris Lattner5ba61f02006-10-14 07:39:34 +00006139//===----------------------------------------------------------------------===//
6140// Driver code
6141//===----------------------------------------------------------------------===//
6142
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006143static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006144 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006145
Daniel Dunbar52322032009-08-18 05:47:58 +00006146 switch (Triple.getArch()) {
6147 default:
6148 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00006149
Tim Northovera2ee4332014-03-29 15:09:45 +00006150 case llvm::Triple::arm64:
6151 if (Triple.isOSDarwin())
6152 return new DarwinARM64TargetInfo(Triple);
6153
6154 switch (os) {
6155 case llvm::Triple::Linux:
James Molloy5e73df52014-04-16 15:06:20 +00006156 return new LinuxTargetInfo<ARM64leTargetInfo>(Triple);
6157 case llvm::Triple::NetBSD:
6158 return new NetBSDTargetInfo<ARM64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006159 default:
James Molloy5e73df52014-04-16 15:06:20 +00006160 return new ARM64leTargetInfo(Triple);
6161 }
6162
6163 case llvm::Triple::arm64_be:
6164 switch (os) {
6165 case llvm::Triple::Linux:
6166 return new LinuxTargetInfo<ARM64beTargetInfo>(Triple);
6167 case llvm::Triple::NetBSD:
6168 return new NetBSDTargetInfo<ARM64beTargetInfo>(Triple);
6169 default:
6170 return new ARM64beTargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006171 }
6172
Robert Lytton0e076492013-08-13 09:43:10 +00006173 case llvm::Triple::xcore:
6174 return new XCoreTargetInfo(Triple);
6175
Tony Linthicum76329bf2011-12-12 21:14:55 +00006176 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006177 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006178
Tim Northover9bb857a2013-01-31 12:13:10 +00006179 case llvm::Triple::aarch64:
6180 switch (os) {
6181 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006182 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00006183 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006184 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006185 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006186 return new AArch64leTargetInfo(Triple);
6187 }
6188
6189 case llvm::Triple::aarch64_be:
6190 switch (os) {
6191 case llvm::Triple::Linux:
6192 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6193 case llvm::Triple::NetBSD:
6194 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6195 default:
6196 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006197 }
6198
Daniel Dunbar52322032009-08-18 05:47:58 +00006199 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006200 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006201 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006202 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006203
Daniel Dunbar52322032009-08-18 05:47:58 +00006204 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006205 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006206 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006207 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006208 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006209 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006210 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006211 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006212 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006213 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006214 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006215 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006216 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006217 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006218 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006219 case llvm::Triple::Win32:
6220 switch (Triple.getEnvironment()) {
6221 default:
6222 return new ARMleTargetInfo(Triple);
6223 case llvm::Triple::Itanium:
6224 return new ItaniumWindowsARMleTargetInfo(Triple);
6225 case llvm::Triple::MSVC:
6226 return new MicrosoftARMleTargetInfo(Triple);
6227 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006228 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006229 return new ARMleTargetInfo(Triple);
6230 }
6231
6232 case llvm::Triple::armeb:
6233 case llvm::Triple::thumbeb:
6234 if (Triple.isOSDarwin())
6235 return new DarwinARMTargetInfo(Triple);
6236
6237 switch (os) {
6238 case llvm::Triple::Linux:
6239 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6240 case llvm::Triple::FreeBSD:
6241 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6242 case llvm::Triple::NetBSD:
6243 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6244 case llvm::Triple::OpenBSD:
6245 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6246 case llvm::Triple::Bitrig:
6247 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6248 case llvm::Triple::RTEMS:
6249 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6250 case llvm::Triple::NaCl:
6251 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6252 default:
6253 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006254 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006255
Daniel Dunbar52322032009-08-18 05:47:58 +00006256 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006257 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006258
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006259 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006260 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006261 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006262 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006263 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006264 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006265 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006266 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006267 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006268 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006269 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006270 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006271 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006272
6273 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006274 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006275 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006276 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006277 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006278 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006279 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006280 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006281 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006282 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006283 case llvm::Triple::NaCl:
6284 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006285 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006286 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006287 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006288
Akira Hatanakabef17452011-09-20 19:21:49 +00006289 case llvm::Triple::mips64:
6290 switch (os) {
6291 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006293 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006295 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006296 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006297 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006298 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006299 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006300 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006301 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006302 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006303 }
6304
6305 case llvm::Triple::mips64el:
6306 switch (os) {
6307 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006308 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006309 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006310 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006311 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006312 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006313 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006314 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006315 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006316 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006317 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006318 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006319 }
6320
Ivan Krasindd7403e2011-08-24 20:22:22 +00006321 case llvm::Triple::le32:
6322 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006323 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006324 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006325 default:
6326 return NULL;
6327 }
6328
Daniel Dunbar52322032009-08-18 05:47:58 +00006329 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006330 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006331 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006332 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006333 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006334 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006335 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006336 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006337 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006339 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006341 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006343 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006345 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006346
6347 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006348 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006349 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006350 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006351 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006352 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006353 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006354 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006355 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006357 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006359 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006360 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006361 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006362
Bill Schmidt778d3872013-07-26 01:36:11 +00006363 case llvm::Triple::ppc64le:
6364 switch (os) {
6365 case llvm::Triple::Linux:
6366 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6367 default:
6368 return new PPC64TargetInfo(Triple);
6369 }
6370
Peter Collingbournec947aae2012-05-20 23:28:41 +00006371 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006373 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006374 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006375
Eli Friedmand13b41e2012-10-12 23:32:00 +00006376 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006377 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006378
Daniel Dunbar52322032009-08-18 05:47:58 +00006379 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006380 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006381 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006383 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006385 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006387 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006389 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006390 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006391 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006392 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006393 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006394 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006395 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006396
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006397 case llvm::Triple::sparcv9:
6398 switch (os) {
6399 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006400 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006401 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006402 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006403 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006404 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006405 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006406 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006407 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006408 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006409 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006410 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006411 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006412 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006413 }
6414
Ulrich Weigand47445072013-05-06 16:26:41 +00006415 case llvm::Triple::systemz:
6416 switch (os) {
6417 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006419 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006420 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006421 }
6422
Eli Friedmana9c3d712009-08-19 20:47:07 +00006423 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006424 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006425
Daniel Dunbar52322032009-08-18 05:47:58 +00006426 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006427 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006428 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006429
Daniel Dunbar52322032009-08-18 05:47:58 +00006430 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006431 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006433 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006434 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006435 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006436 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006437 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006438 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006439 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006441 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006443 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006445 case llvm::Triple::KFreeBSD:
6446 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006447 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006448 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006449 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006450 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006451 case llvm::Triple::Win32: {
6452 switch (Triple.getEnvironment()) {
6453 default:
6454 return new X86_32TargetInfo(Triple);
6455 case llvm::Triple::Cygnus:
6456 return new CygwinX86_32TargetInfo(Triple);
6457 case llvm::Triple::GNU:
6458 return new MinGWX86_32TargetInfo(Triple);
6459 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006460 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006461 }
6462 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006463 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006465 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006467 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006468 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006469 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006470 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006471 }
6472
6473 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006474 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006476
Daniel Dunbar52322032009-08-18 05:47:58 +00006477 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006478 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006479 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006480 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006482 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006484 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006485 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006486 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006487 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006488 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006489 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006490 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006492 case llvm::Triple::KFreeBSD:
6493 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006494 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006495 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006496 case llvm::Triple::Win32: {
6497 switch (Triple.getEnvironment()) {
6498 default:
6499 return new X86_64TargetInfo(Triple);
6500 case llvm::Triple::GNU:
6501 return new MinGWX86_64TargetInfo(Triple);
6502 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006503 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006504 }
6505 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006506 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006508 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006510 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006511
6512 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006513 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006514 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00006515 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006516 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006517 }
6518 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006519 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006520 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00006521 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006522 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006523 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006524 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006525}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006526
6527/// CreateTargetInfo - Return the target info object for the specified target
6528/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00006529TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00006530 TargetOptions *Opts) {
6531 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006532
6533 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006534 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006535 if (!Target) {
6536 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
6537 return 0;
6538 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00006539 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006540
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006541 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006542 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6543 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006544 return 0;
6545 }
6546
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006547 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006548 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6549 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006550 return 0;
6551 }
6552
Rafael Espindolaeb265472013-08-21 21:59:03 +00006553 // Set the fp math unit.
6554 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6555 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
6556 return 0;
6557 }
6558
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006559 // Compute the default target features, we need the target to handle this
6560 // because features may have dependencies on one another.
6561 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006562 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006563
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006564 // Apply the user specified deltas.
6565 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6566 I < N; ++I) {
6567 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006568 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006569 bool Enabled = Name[0] == '+';
6570 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006571 }
6572
6573 // Add the features to the compile options.
6574 //
6575 // FIXME: If we are completely confident that we have the right set, we only
6576 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006577 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006578 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6579 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006580 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006581 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00006582 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006583
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006584 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006585}