blob: 5effe027e24c2802a583caf36330e94864cd8fe0 [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 Kramer56c58222014-05-02 15:47:51 +00001771 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001772 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001773
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001774 /// This specification is deprecated and will be removed in the future.
1775 /// Users should prefer \see CK_K8.
1776 // FIXME: Warn on this when the CPU is set to it.
1777 CK_x86_64,
1778 //@}
1779
1780 /// \name Geode
1781 /// Geode processors.
1782 //@{
1783 CK_Geode
1784 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001785 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001786
Rafael Espindolaeb265472013-08-21 21:59:03 +00001787 enum FPMathKind {
1788 FP_Default,
1789 FP_SSE,
1790 FP_387
1791 } FPMath;
1792
Eli Friedman3fd920a2008-08-20 02:34:37 +00001793public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001794 X86TargetInfo(const llvm::Triple &Triple)
1795 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001796 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1797 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001798 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1799 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001800 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1801 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001802 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001803 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001804 }
Craig Topper3164f332014-03-11 03:39:26 +00001805 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001806 // X87 evaluates with 80 bits "long double" precision.
1807 return SSELevel == NoSSE ? 2 : 0;
1808 }
Craig Topper3164f332014-03-11 03:39:26 +00001809 void getTargetBuiltins(const Builtin::Info *&Records,
1810 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001811 Records = BuiltinInfo;
1812 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001813 }
Craig Topper3164f332014-03-11 03:39:26 +00001814 void getGCCRegNames(const char * const *&Names,
1815 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001816 Names = GCCRegNames;
1817 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001818 }
Craig Topper3164f332014-03-11 03:39:26 +00001819 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1820 unsigned &NumAliases) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001821 Aliases = 0;
1822 NumAliases = 0;
1823 }
Craig Topper3164f332014-03-11 03:39:26 +00001824 void getGCCAddlRegNames(const AddlRegName *&Names,
1825 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001826 Names = AddlRegNames;
1827 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001828 }
Craig Topper3164f332014-03-11 03:39:26 +00001829 bool validateAsmConstraint(const char *&Name,
1830 TargetInfo::ConstraintInfo &info) const override;
1831 std::string convertConstraint(const char *&Constraint) const override;
1832 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001833 return "~{dirflag},~{fpsr},~{flags}";
1834 }
Craig Topper3164f332014-03-11 03:39:26 +00001835 void getTargetDefines(const LangOptions &Opts,
1836 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001837 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1838 bool Enabled);
1839 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1840 bool Enabled);
1841 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1842 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001843 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1844 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001845 setFeatureEnabledImpl(Features, Name, Enabled);
1846 }
1847 // This exists purely to cut down on the number of virtual calls in
1848 // getDefaultFeatures which calls this repeatedly.
1849 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1850 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001851 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1852 bool hasFeature(StringRef Feature) const override;
1853 bool handleTargetFeatures(std::vector<std::string> &Features,
1854 DiagnosticsEngine &Diags) override;
1855 const char* getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001856 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001857 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001858 else if (getTriple().getArch() == llvm::Triple::x86 &&
1859 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001860 return "no-mmx";
1861 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001862 }
Craig Topper3164f332014-03-11 03:39:26 +00001863 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001864 CPU = llvm::StringSwitch<CPUKind>(Name)
1865 .Case("i386", CK_i386)
1866 .Case("i486", CK_i486)
1867 .Case("winchip-c6", CK_WinChipC6)
1868 .Case("winchip2", CK_WinChip2)
1869 .Case("c3", CK_C3)
1870 .Case("i586", CK_i586)
1871 .Case("pentium", CK_Pentium)
1872 .Case("pentium-mmx", CK_PentiumMMX)
1873 .Case("i686", CK_i686)
1874 .Case("pentiumpro", CK_PentiumPro)
1875 .Case("pentium2", CK_Pentium2)
1876 .Case("pentium3", CK_Pentium3)
1877 .Case("pentium3m", CK_Pentium3M)
1878 .Case("pentium-m", CK_PentiumM)
1879 .Case("c3-2", CK_C3_2)
1880 .Case("yonah", CK_Yonah)
1881 .Case("pentium4", CK_Pentium4)
1882 .Case("pentium4m", CK_Pentium4M)
1883 .Case("prescott", CK_Prescott)
1884 .Case("nocona", CK_Nocona)
1885 .Case("core2", CK_Core2)
1886 .Case("penryn", CK_Penryn)
1887 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001888 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001889 .Case("corei7", CK_Corei7)
1890 .Case("corei7-avx", CK_Corei7AVX)
1891 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001892 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001893 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001894 .Case("k6", CK_K6)
1895 .Case("k6-2", CK_K6_2)
1896 .Case("k6-3", CK_K6_3)
1897 .Case("athlon", CK_Athlon)
1898 .Case("athlon-tbird", CK_AthlonThunderbird)
1899 .Case("athlon-4", CK_Athlon4)
1900 .Case("athlon-xp", CK_AthlonXP)
1901 .Case("athlon-mp", CK_AthlonMP)
1902 .Case("athlon64", CK_Athlon64)
1903 .Case("athlon64-sse3", CK_Athlon64SSE3)
1904 .Case("athlon-fx", CK_AthlonFX)
1905 .Case("k8", CK_K8)
1906 .Case("k8-sse3", CK_K8SSE3)
1907 .Case("opteron", CK_Opteron)
1908 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001909 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001910 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001911 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001912 .Case("bdver1", CK_BDVER1)
1913 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001914 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001915 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001916 .Case("x86-64", CK_x86_64)
1917 .Case("geode", CK_Geode)
1918 .Default(CK_Generic);
1919
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001920 // Perform any per-CPU checks necessary to determine if this CPU is
1921 // acceptable.
1922 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1923 // invalid without explaining *why*.
1924 switch (CPU) {
1925 case CK_Generic:
1926 // No processor selected!
1927 return false;
1928
1929 case CK_i386:
1930 case CK_i486:
1931 case CK_WinChipC6:
1932 case CK_WinChip2:
1933 case CK_C3:
1934 case CK_i586:
1935 case CK_Pentium:
1936 case CK_PentiumMMX:
1937 case CK_i686:
1938 case CK_PentiumPro:
1939 case CK_Pentium2:
1940 case CK_Pentium3:
1941 case CK_Pentium3M:
1942 case CK_PentiumM:
1943 case CK_Yonah:
1944 case CK_C3_2:
1945 case CK_Pentium4:
1946 case CK_Pentium4M:
1947 case CK_Prescott:
1948 case CK_K6:
1949 case CK_K6_2:
1950 case CK_K6_3:
1951 case CK_Athlon:
1952 case CK_AthlonThunderbird:
1953 case CK_Athlon4:
1954 case CK_AthlonXP:
1955 case CK_AthlonMP:
1956 case CK_Geode:
1957 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001958 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001959 return false;
1960
1961 // Fallthrough
1962 case CK_Nocona:
1963 case CK_Core2:
1964 case CK_Penryn:
1965 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001966 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001967 case CK_Corei7:
1968 case CK_Corei7AVX:
1969 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001970 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001971 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001972 case CK_Athlon64:
1973 case CK_Athlon64SSE3:
1974 case CK_AthlonFX:
1975 case CK_K8:
1976 case CK_K8SSE3:
1977 case CK_Opteron:
1978 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001979 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001980 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001981 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001982 case CK_BDVER1:
1983 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001984 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00001985 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001986 case CK_x86_64:
1987 return true;
1988 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001989 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001990 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001991
Craig Topper3164f332014-03-11 03:39:26 +00001992 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00001993
Craig Topper3164f332014-03-11 03:39:26 +00001994 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001995 // We accept all non-ARM calling conventions
1996 return (CC == CC_X86ThisCall ||
1997 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001998 CC == CC_X86StdCall ||
1999 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002000 CC == CC_X86Pascal ||
2001 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002002 }
2003
Craig Topper3164f332014-03-11 03:39:26 +00002004 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002005 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002006 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002007};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002008
Rafael Espindolaeb265472013-08-21 21:59:03 +00002009bool X86TargetInfo::setFPMath(StringRef Name) {
2010 if (Name == "387") {
2011 FPMath = FP_387;
2012 return true;
2013 }
2014 if (Name == "sse") {
2015 FPMath = FP_SSE;
2016 return true;
2017 }
2018 return false;
2019}
2020
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002021void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002022 // FIXME: This *really* should not be here.
2023
2024 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002025 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002026 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002027
Chandler Carruth212334f2011-09-28 08:55:37 +00002028 switch (CPU) {
2029 case CK_Generic:
2030 case CK_i386:
2031 case CK_i486:
2032 case CK_i586:
2033 case CK_Pentium:
2034 case CK_i686:
2035 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002036 break;
2037 case CK_PentiumMMX:
2038 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002039 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002040 break;
2041 case CK_Pentium3:
2042 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002043 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002044 break;
2045 case CK_PentiumM:
2046 case CK_Pentium4:
2047 case CK_Pentium4M:
2048 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002049 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002050 break;
2051 case CK_Yonah:
2052 case CK_Prescott:
2053 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002055 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002056 break;
2057 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002059 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 break;
2061 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002062 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002063 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002064 break;
2065 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002066 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002067 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002068 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002069 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002070 setFeatureEnabledImpl(Features, "sse4.2", true);
2071 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002072 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002074 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002076 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002077 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002078 break;
2079 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002080 setFeatureEnabledImpl(Features, "avx", true);
2081 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002082 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002083 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002084 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002085 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002086 setFeatureEnabledImpl(Features, "avx", true);
2087 setFeatureEnabledImpl(Features, "aes", true);
2088 setFeatureEnabledImpl(Features, "pclmul", true);
2089 setFeatureEnabledImpl(Features, "rdrnd", true);
2090 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002091 break;
Craig Topper865fff52011-12-17 19:55:21 +00002092 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002093 setFeatureEnabledImpl(Features, "avx2", true);
2094 setFeatureEnabledImpl(Features, "aes", true);
2095 setFeatureEnabledImpl(Features, "pclmul", true);
2096 setFeatureEnabledImpl(Features, "lzcnt", true);
2097 setFeatureEnabledImpl(Features, "rdrnd", true);
2098 setFeatureEnabledImpl(Features, "f16c", true);
2099 setFeatureEnabledImpl(Features, "bmi", true);
2100 setFeatureEnabledImpl(Features, "bmi2", true);
2101 setFeatureEnabledImpl(Features, "rtm", true);
2102 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002103 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002104 break;
Craig Topper449314e2013-08-20 07:09:39 +00002105 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002106 setFeatureEnabledImpl(Features, "avx512f", true);
2107 setFeatureEnabledImpl(Features, "avx512cd", true);
2108 setFeatureEnabledImpl(Features, "avx512er", true);
2109 setFeatureEnabledImpl(Features, "avx512pf", true);
2110 setFeatureEnabledImpl(Features, "aes", true);
2111 setFeatureEnabledImpl(Features, "pclmul", true);
2112 setFeatureEnabledImpl(Features, "lzcnt", true);
2113 setFeatureEnabledImpl(Features, "rdrnd", true);
2114 setFeatureEnabledImpl(Features, "f16c", true);
2115 setFeatureEnabledImpl(Features, "bmi", true);
2116 setFeatureEnabledImpl(Features, "bmi2", true);
2117 setFeatureEnabledImpl(Features, "rtm", true);
2118 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002119 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 case CK_K6:
2121 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002122 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002123 break;
2124 case CK_K6_2:
2125 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 case CK_WinChip2:
2127 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002128 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002129 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002130 case CK_Athlon:
2131 case CK_AthlonThunderbird:
2132 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002133 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002134 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002135 case CK_Athlon4:
2136 case CK_AthlonXP:
2137 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002138 setFeatureEnabledImpl(Features, "sse", true);
2139 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002140 break;
2141 case CK_K8:
2142 case CK_Opteron:
2143 case CK_Athlon64:
2144 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002145 setFeatureEnabledImpl(Features, "sse2", true);
2146 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002147 break;
2148 case CK_K8SSE3:
2149 case CK_OpteronSSE3:
2150 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002151 setFeatureEnabledImpl(Features, "sse3", true);
2152 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002153 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002154 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002155 setFeatureEnabledImpl(Features, "sse3", true);
2156 setFeatureEnabledImpl(Features, "sse4a", true);
2157 setFeatureEnabledImpl(Features, "3dnowa", true);
2158 setFeatureEnabledImpl(Features, "lzcnt", true);
2159 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002160 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002161 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "ssse3", true);
2163 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002164 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002165 setFeatureEnabledImpl(Features, "lzcnt", true);
2166 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002167 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002168 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002169 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002170 setFeatureEnabledImpl(Features, "avx", true);
2171 setFeatureEnabledImpl(Features, "sse4a", true);
2172 setFeatureEnabledImpl(Features, "lzcnt", true);
2173 setFeatureEnabledImpl(Features, "aes", true);
2174 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002175 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002176 setFeatureEnabledImpl(Features, "bmi", true);
2177 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002179 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002180 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002181 setFeatureEnabledImpl(Features, "xop", true);
2182 setFeatureEnabledImpl(Features, "lzcnt", true);
2183 setFeatureEnabledImpl(Features, "aes", true);
2184 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002185 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002186 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002187 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002188 case CK_BDVER4:
2189 setFeatureEnabledImpl(Features, "avx2", true);
2190 setFeatureEnabledImpl(Features, "bmi2", true);
2191 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002192 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002193 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002194 setFeatureEnabledImpl(Features, "xop", true);
2195 setFeatureEnabledImpl(Features, "lzcnt", true);
2196 setFeatureEnabledImpl(Features, "aes", true);
2197 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002198 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002199 setFeatureEnabledImpl(Features, "bmi", true);
2200 setFeatureEnabledImpl(Features, "fma", true);
2201 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002202 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002203 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002204 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002205 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002206 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002207 break;
Eli Friedman33465822011-07-08 23:31:17 +00002208 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002209}
2210
Rafael Espindolae62e2792013-08-20 13:44:29 +00002211void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002212 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002213 if (Enabled) {
2214 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002215 case AVX512F:
2216 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002217 case AVX2:
2218 Features["avx2"] = true;
2219 case AVX:
2220 Features["avx"] = true;
2221 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002222 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002223 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002224 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002225 case SSSE3:
2226 Features["ssse3"] = true;
2227 case SSE3:
2228 Features["sse3"] = true;
2229 case SSE2:
2230 Features["sse2"] = true;
2231 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002232 Features["sse"] = true;
2233 case NoSSE:
2234 break;
2235 }
2236 return;
2237 }
2238
2239 switch (Level) {
2240 case NoSSE:
2241 case SSE1:
2242 Features["sse"] = false;
2243 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002244 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2245 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246 case SSE3:
2247 Features["sse3"] = false;
2248 setXOPLevel(Features, NoXOP, false);
2249 case SSSE3:
2250 Features["ssse3"] = false;
2251 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002252 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002253 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002254 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002255 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002256 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002257 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002258 case AVX2:
2259 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002260 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002261 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2262 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002263 }
2264}
2265
2266void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002267 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002268 if (Enabled) {
2269 switch (Level) {
2270 case AMD3DNowAthlon:
2271 Features["3dnowa"] = true;
2272 case AMD3DNow:
2273 Features["3dnow"] = true;
2274 case MMX:
2275 Features["mmx"] = true;
2276 case NoMMX3DNow:
2277 break;
2278 }
2279 return;
2280 }
2281
2282 switch (Level) {
2283 case NoMMX3DNow:
2284 case MMX:
2285 Features["mmx"] = false;
2286 case AMD3DNow:
2287 Features["3dnow"] = false;
2288 case AMD3DNowAthlon:
2289 Features["3dnowa"] = false;
2290 }
2291}
2292
2293void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002294 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002295 if (Enabled) {
2296 switch (Level) {
2297 case XOP:
2298 Features["xop"] = true;
2299 case FMA4:
2300 Features["fma4"] = true;
2301 setSSELevel(Features, AVX, true);
2302 case SSE4A:
2303 Features["sse4a"] = true;
2304 setSSELevel(Features, SSE3, true);
2305 case NoXOP:
2306 break;
2307 }
2308 return;
2309 }
2310
2311 switch (Level) {
2312 case NoXOP:
2313 case SSE4A:
2314 Features["sse4a"] = false;
2315 case FMA4:
2316 Features["fma4"] = false;
2317 case XOP:
2318 Features["xop"] = false;
2319 }
2320}
2321
Craig Topper86d79ef2013-09-17 04:51:29 +00002322void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2323 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002324 // FIXME: This *really* should not be here. We need some way of translating
2325 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002326 if (Name == "sse4")
2327 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002328
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002330
Craig Topper29561122013-09-19 01:13:07 +00002331 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002332 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002333 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002334 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002335 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002337 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002338 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002339 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002341 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002342 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002343 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002344 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002345 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002346 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002347 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002348 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002349 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002350 if (Enabled)
2351 setSSELevel(Features, SSE2, Enabled);
2352 } else if (Name == "pclmul") {
2353 if (Enabled)
2354 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002355 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002356 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002357 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002358 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002359 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002360 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002361 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002362 if (Enabled)
2363 setSSELevel(Features, AVX512F, Enabled);
2364 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002365 if (Enabled)
2366 setSSELevel(Features, AVX, Enabled);
2367 } else if (Name == "fma4") {
2368 setXOPLevel(Features, FMA4, Enabled);
2369 } else if (Name == "xop") {
2370 setXOPLevel(Features, XOP, Enabled);
2371 } else if (Name == "sse4a") {
2372 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002373 } else if (Name == "f16c") {
2374 if (Enabled)
2375 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002376 } else if (Name == "sha") {
2377 if (Enabled)
2378 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002379 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002380}
2381
Eric Christopher3ff21b32013-10-16 21:26:26 +00002382/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002383/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002384bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002385 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002386 // Remember the maximum enabled sselevel.
2387 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2388 // Ignore disabled features.
2389 if (Features[i][0] == '-')
2390 continue;
2391
Benjamin Kramer27402c62012-03-05 15:10:44 +00002392 StringRef Feature = StringRef(Features[i]).substr(1);
2393
2394 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002395 HasAES = true;
2396 continue;
2397 }
2398
Craig Topper3f122a72012-05-31 05:18:48 +00002399 if (Feature == "pclmul") {
2400 HasPCLMUL = true;
2401 continue;
2402 }
2403
Benjamin Kramer27402c62012-03-05 15:10:44 +00002404 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002405 HasLZCNT = true;
2406 continue;
2407 }
2408
Rafael Espindola89049822013-08-23 20:21:37 +00002409 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002410 HasRDRND = true;
2411 continue;
2412 }
2413
Benjamin Kramer27402c62012-03-05 15:10:44 +00002414 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002415 HasBMI = true;
2416 continue;
2417 }
2418
Benjamin Kramer27402c62012-03-05 15:10:44 +00002419 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002420 HasBMI2 = true;
2421 continue;
2422 }
2423
Benjamin Kramer27402c62012-03-05 15:10:44 +00002424 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002425 HasPOPCNT = true;
2426 continue;
2427 }
2428
Michael Liao625a8752012-11-10 05:17:46 +00002429 if (Feature == "rtm") {
2430 HasRTM = true;
2431 continue;
2432 }
2433
Michael Liao74f4eaf2013-03-26 17:52:08 +00002434 if (Feature == "prfchw") {
2435 HasPRFCHW = true;
2436 continue;
2437 }
2438
Michael Liaoffaae352013-03-29 05:17:55 +00002439 if (Feature == "rdseed") {
2440 HasRDSEED = true;
2441 continue;
2442 }
2443
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002444 if (Feature == "tbm") {
2445 HasTBM = true;
2446 continue;
2447 }
2448
Craig Topperbba778b2012-06-03 21:46:30 +00002449 if (Feature == "fma") {
2450 HasFMA = true;
2451 continue;
2452 }
2453
Manman Rena45358c2012-10-11 00:59:55 +00002454 if (Feature == "f16c") {
2455 HasF16C = true;
2456 continue;
2457 }
2458
Craig Topper679b53a2013-08-21 05:29:10 +00002459 if (Feature == "avx512cd") {
2460 HasAVX512CD = true;
2461 continue;
2462 }
2463
2464 if (Feature == "avx512er") {
2465 HasAVX512ER = true;
2466 continue;
2467 }
2468
2469 if (Feature == "avx512pf") {
2470 HasAVX512PF = true;
2471 continue;
2472 }
2473
Ben Langmuir58078d02013-09-19 13:22:04 +00002474 if (Feature == "sha") {
2475 HasSHA = true;
2476 continue;
2477 }
2478
Nick Lewycky50e8f482013-10-05 20:14:27 +00002479 if (Feature == "cx16") {
2480 HasCX16 = true;
2481 continue;
2482 }
2483
Daniel Dunbar979586e2009-11-11 09:38:56 +00002484 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002485 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002486 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002487 .Case("avx2", AVX2)
2488 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002489 .Case("sse4.2", SSE42)
2490 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002491 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002492 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002493 .Case("sse2", SSE2)
2494 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002495 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002496 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002497
Eli Friedman33465822011-07-08 23:31:17 +00002498 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002499 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002500 .Case("3dnowa", AMD3DNowAthlon)
2501 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002502 .Case("mmx", MMX)
2503 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002504 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002505
2506 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2507 .Case("xop", XOP)
2508 .Case("fma4", FMA4)
2509 .Case("sse4a", SSE4A)
2510 .Default(NoXOP);
2511 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002512 }
Eli Friedman33465822011-07-08 23:31:17 +00002513
Craig Topper7481d8a2013-09-10 06:55:47 +00002514 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2515 // Can't do this earlier because we need to be able to explicitly enable
2516 // popcnt and still disable sse4.2.
2517 if (!HasPOPCNT && SSELevel >= SSE42 &&
2518 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2519 HasPOPCNT = true;
2520 Features.push_back("+popcnt");
2521 }
2522
Yunzhong Gao61089362013-10-16 19:07:02 +00002523 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2524 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2525 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2526 HasPRFCHW = true;
2527 Features.push_back("+prfchw");
2528 }
2529
Rafael Espindolaeb265472013-08-21 21:59:03 +00002530 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2531 // matches the selected sse level.
2532 if (FPMath == FP_SSE && SSELevel < SSE1) {
2533 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2534 return false;
2535 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2536 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2537 return false;
2538 }
2539
Eli Friedman33465822011-07-08 23:31:17 +00002540 // Don't tell the backend if we're turning off mmx; it will end up disabling
2541 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002542 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2543 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002544 std::vector<std::string>::iterator it;
2545 it = std::find(Features.begin(), Features.end(), "-mmx");
2546 if (it != Features.end())
2547 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002548 else if (SSELevel > NoSSE)
2549 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002550 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002551}
Chris Lattnerecd49032009-03-02 22:27:17 +00002552
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002553/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2554/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002555void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002556 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002557 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002558 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002559 Builder.defineMacro("__amd64__");
2560 Builder.defineMacro("__amd64");
2561 Builder.defineMacro("__x86_64");
2562 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002563 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002564 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002565 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002566
Chris Lattnerecd49032009-03-02 22:27:17 +00002567 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002568 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2569 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002570 switch (CPU) {
2571 case CK_Generic:
2572 break;
2573 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002574 // The rest are coming from the i386 define above.
2575 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002576 break;
2577 case CK_i486:
2578 case CK_WinChipC6:
2579 case CK_WinChip2:
2580 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002581 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002582 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002583 case CK_PentiumMMX:
2584 Builder.defineMacro("__pentium_mmx__");
2585 Builder.defineMacro("__tune_pentium_mmx__");
2586 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002587 case CK_i586:
2588 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002589 defineCPUMacros(Builder, "i586");
2590 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002592 case CK_Pentium3:
2593 case CK_Pentium3M:
2594 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002595 Builder.defineMacro("__tune_pentium3__");
2596 // Fallthrough
2597 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002598 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002599 Builder.defineMacro("__tune_pentium2__");
2600 // Fallthrough
2601 case CK_PentiumPro:
2602 Builder.defineMacro("__tune_i686__");
2603 Builder.defineMacro("__tune_pentiumpro__");
2604 // Fallthrough
2605 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002606 Builder.defineMacro("__i686");
2607 Builder.defineMacro("__i686__");
2608 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2609 Builder.defineMacro("__pentiumpro");
2610 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 break;
2612 case CK_Pentium4:
2613 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002614 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
2616 case CK_Yonah:
2617 case CK_Prescott:
2618 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002619 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 break;
2621 case CK_Core2:
2622 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002623 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
2625 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002626 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002627 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002628 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002629 defineCPUMacros(Builder, "slm");
2630 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002631 case CK_Corei7:
2632 case CK_Corei7AVX:
2633 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002634 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002635 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 break;
Craig Topper449314e2013-08-20 07:09:39 +00002637 case CK_KNL:
2638 defineCPUMacros(Builder, "knl");
2639 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002640 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002641 Builder.defineMacro("__k6_2__");
2642 Builder.defineMacro("__tune_k6_2__");
2643 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002645 if (CPU != CK_K6_2) { // In case of fallthrough
2646 // FIXME: GCC may be enabling these in cases where some other k6
2647 // architecture is specified but -m3dnow is explicitly provided. The
2648 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002649 Builder.defineMacro("__k6_3__");
2650 Builder.defineMacro("__tune_k6_3__");
2651 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002652 // Fallthrough
2653 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002654 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002655 break;
2656 case CK_Athlon:
2657 case CK_AthlonThunderbird:
2658 case CK_Athlon4:
2659 case CK_AthlonXP:
2660 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002661 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002662 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002663 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002664 Builder.defineMacro("__tune_athlon_sse__");
2665 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 break;
2667 case CK_K8:
2668 case CK_K8SSE3:
2669 case CK_x86_64:
2670 case CK_Opteron:
2671 case CK_OpteronSSE3:
2672 case CK_Athlon64:
2673 case CK_Athlon64SSE3:
2674 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002675 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002676 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002677 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002678 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002679 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002680 case CK_BTVER1:
2681 defineCPUMacros(Builder, "btver1");
2682 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002683 case CK_BTVER2:
2684 defineCPUMacros(Builder, "btver2");
2685 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002686 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002687 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002688 break;
2689 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002690 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002691 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002692 case CK_BDVER3:
2693 defineCPUMacros(Builder, "bdver3");
2694 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002695 case CK_BDVER4:
2696 defineCPUMacros(Builder, "bdver4");
2697 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002698 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002699 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002700 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002701 }
Chris Lattner96e43572009-03-02 22:40:39 +00002702
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002703 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002704 Builder.defineMacro("__REGISTER_PREFIX__", "");
2705
Chris Lattner6df41af2009-04-19 17:32:33 +00002706 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2707 // functions in glibc header files that use FP Stack inline asm which the
2708 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002709 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002710
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002711 if (HasAES)
2712 Builder.defineMacro("__AES__");
2713
Craig Topper3f122a72012-05-31 05:18:48 +00002714 if (HasPCLMUL)
2715 Builder.defineMacro("__PCLMUL__");
2716
Craig Topper22967d42011-12-25 05:06:45 +00002717 if (HasLZCNT)
2718 Builder.defineMacro("__LZCNT__");
2719
Benjamin Kramer1e250392012-07-07 09:39:18 +00002720 if (HasRDRND)
2721 Builder.defineMacro("__RDRND__");
2722
Craig Topper22967d42011-12-25 05:06:45 +00002723 if (HasBMI)
2724 Builder.defineMacro("__BMI__");
2725
2726 if (HasBMI2)
2727 Builder.defineMacro("__BMI2__");
2728
Craig Topper1de83482011-12-29 16:10:46 +00002729 if (HasPOPCNT)
2730 Builder.defineMacro("__POPCNT__");
2731
Michael Liao625a8752012-11-10 05:17:46 +00002732 if (HasRTM)
2733 Builder.defineMacro("__RTM__");
2734
Michael Liao74f4eaf2013-03-26 17:52:08 +00002735 if (HasPRFCHW)
2736 Builder.defineMacro("__PRFCHW__");
2737
Michael Liaoffaae352013-03-29 05:17:55 +00002738 if (HasRDSEED)
2739 Builder.defineMacro("__RDSEED__");
2740
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002741 if (HasTBM)
2742 Builder.defineMacro("__TBM__");
2743
Rafael Espindolae62e2792013-08-20 13:44:29 +00002744 switch (XOPLevel) {
2745 case XOP:
2746 Builder.defineMacro("__XOP__");
2747 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002748 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002749 case SSE4A:
2750 Builder.defineMacro("__SSE4A__");
2751 case NoXOP:
2752 break;
2753 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002754
Craig Topperbba778b2012-06-03 21:46:30 +00002755 if (HasFMA)
2756 Builder.defineMacro("__FMA__");
2757
Manman Rena45358c2012-10-11 00:59:55 +00002758 if (HasF16C)
2759 Builder.defineMacro("__F16C__");
2760
Craig Topper679b53a2013-08-21 05:29:10 +00002761 if (HasAVX512CD)
2762 Builder.defineMacro("__AVX512CD__");
2763 if (HasAVX512ER)
2764 Builder.defineMacro("__AVX512ER__");
2765 if (HasAVX512PF)
2766 Builder.defineMacro("__AVX512PF__");
2767
Ben Langmuir58078d02013-09-19 13:22:04 +00002768 if (HasSHA)
2769 Builder.defineMacro("__SHA__");
2770
Nick Lewycky50e8f482013-10-05 20:14:27 +00002771 if (HasCX16)
2772 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2773
Chris Lattner96e43572009-03-02 22:40:39 +00002774 // Each case falls through to the previous one here.
2775 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002776 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002777 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002778 case AVX2:
2779 Builder.defineMacro("__AVX2__");
2780 case AVX:
2781 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002782 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002783 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002784 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002785 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002786 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002787 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002788 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002789 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002790 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002791 Builder.defineMacro("__SSE2__");
2792 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002793 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002794 Builder.defineMacro("__SSE__");
2795 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002796 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002797 break;
2798 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002799
Derek Schuffc7dd7222012-10-11 15:52:22 +00002800 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002801 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002802 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002803 case AVX2:
2804 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002805 case SSE42:
2806 case SSE41:
2807 case SSSE3:
2808 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002809 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002810 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002811 break;
2812 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002813 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002814 break;
2815 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002816 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002817 }
2818 }
2819
Anders Carlssone437c682010-01-27 03:47:49 +00002820 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002821 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002822 case AMD3DNowAthlon:
2823 Builder.defineMacro("__3dNOW_A__");
2824 case AMD3DNow:
2825 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002826 case MMX:
2827 Builder.defineMacro("__MMX__");
2828 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002829 break;
2830 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002831
2832 if (CPU >= CK_i486) {
2833 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2834 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2835 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2836 }
2837 if (CPU >= CK_i586)
2838 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002839}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002840
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002841bool X86TargetInfo::hasFeature(StringRef Feature) const {
2842 return llvm::StringSwitch<bool>(Feature)
2843 .Case("aes", HasAES)
2844 .Case("avx", SSELevel >= AVX)
2845 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002846 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002847 .Case("avx512cd", HasAVX512CD)
2848 .Case("avx512er", HasAVX512ER)
2849 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002850 .Case("bmi", HasBMI)
2851 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002852 .Case("cx16", HasCX16)
2853 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002854 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002855 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002856 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002857 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002858 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002859 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2860 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2861 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002862 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002863 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002864 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002865 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002866 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002867 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002868 .Case("sse", SSELevel >= SSE1)
2869 .Case("sse2", SSELevel >= SSE2)
2870 .Case("sse3", SSELevel >= SSE3)
2871 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002872 .Case("sse4.1", SSELevel >= SSE41)
2873 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002875 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002876 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2877 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002878 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002879 .Default(false);
2880}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002881
Eli Friedman3fd920a2008-08-20 02:34:37 +00002882bool
Anders Carlsson58436352009-02-28 17:11:49 +00002883X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002884 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002885 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002886 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002887 case 'Y': // first letter of a pair:
2888 switch (*(Name+1)) {
2889 default: return false;
2890 case '0': // First SSE register.
2891 case 't': // Any SSE register, when SSE2 is enabled.
2892 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2893 case 'm': // any MMX register, when inter-unit moves enabled.
2894 break; // falls through to setAllowsRegister.
2895 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002896 case 'a': // eax.
2897 case 'b': // ebx.
2898 case 'c': // ecx.
2899 case 'd': // edx.
2900 case 'S': // esi.
2901 case 'D': // edi.
2902 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002903 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002904 case 't': // top of floating point stack.
2905 case 'u': // second from top of floating point stack.
2906 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002907 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002908 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002909 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002910 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2911 case 'l': // "Index" registers: any general register that can be used as an
2912 // index in a base+index memory access.
2913 Info.setAllowsRegister();
2914 return true;
2915 case 'C': // SSE floating point constant.
2916 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002917 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002918 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002919 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002920 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002921 return true;
2922 }
2923}
2924
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002925
Eli Friedman3fd920a2008-08-20 02:34:37 +00002926std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002927X86TargetInfo::convertConstraint(const char *&Constraint) const {
2928 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002929 case 'a': return std::string("{ax}");
2930 case 'b': return std::string("{bx}");
2931 case 'c': return std::string("{cx}");
2932 case 'd': return std::string("{dx}");
2933 case 'S': return std::string("{si}");
2934 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002935 case 'p': // address
2936 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002937 case 't': // top of floating point stack.
2938 return std::string("{st}");
2939 case 'u': // second from top of floating point stack.
2940 return std::string("{st(1)}"); // second from top of floating point stack.
2941 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002942 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002943 }
2944}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002945} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002946
2947namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002948// X86-32 generic target
2949class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002951 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002952 DoubleAlign = LongLongAlign = 32;
2953 LongDoubleWidth = 96;
2954 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002955 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002956 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002957 SizeType = UnsignedInt;
2958 PtrDiffType = SignedInt;
2959 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002960 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002961
2962 // Use fpret for all types.
2963 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2964 (1 << TargetInfo::Double) |
2965 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002966
2967 // x86-32 has atomics up to 8 bytes
2968 // FIXME: Check that we actually have cmpxchg8b before setting
2969 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2970 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002971 }
Craig Topper3164f332014-03-11 03:39:26 +00002972 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00002973 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002974 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002975
Craig Topper3164f332014-03-11 03:39:26 +00002976 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00002977 if (RegNo == 0) return 0;
2978 if (RegNo == 1) return 2;
2979 return -1;
2980 }
Craig Topper3164f332014-03-11 03:39:26 +00002981 bool validateInputSize(StringRef Constraint,
2982 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00002983 switch (Constraint[0]) {
2984 default: break;
2985 case 'a':
2986 case 'b':
2987 case 'c':
2988 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002989 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002990 }
2991
2992 return true;
2993 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002994};
2995} // end anonymous namespace
2996
2997namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002998class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2999public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003000 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3001 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003002
Craig Topper3164f332014-03-11 03:39:26 +00003003 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003004 unsigned Major, Minor, Micro;
3005 getTriple().getOSVersion(Major, Minor, Micro);
3006 // New NetBSD uses the default rounding mode.
3007 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3008 return X86_32TargetInfo::getFloatEvalMethod();
3009 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003010 return 1;
3011 }
3012};
3013} // end anonymous namespace
3014
3015namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003016class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3017public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003018 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3019 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003020 SizeType = UnsignedLong;
3021 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003022 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003023 }
3024};
3025} // end anonymous namespace
3026
3027namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003028class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003030 BitrigI386TargetInfo(const llvm::Triple &Triple)
3031 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003032 SizeType = UnsignedLong;
3033 IntPtrType = SignedLong;
3034 PtrDiffType = SignedLong;
3035 }
3036};
3037} // end anonymous namespace
3038
3039namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003040class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003041public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003042 DarwinI386TargetInfo(const llvm::Triple &Triple)
3043 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044 LongDoubleWidth = 128;
3045 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003046 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003047 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003048 SizeType = UnsignedLong;
3049 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003050 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003051 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003052 }
3053
Eli Friedman3fd920a2008-08-20 02:34:37 +00003054};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003055} // end anonymous namespace
3056
3057namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003058// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003059class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003060public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003061 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3062 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003063 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003064 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003065 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003066 }
Craig Topper3164f332014-03-11 03:39:26 +00003067 void getTargetDefines(const LangOptions &Opts,
3068 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003069 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3070 }
3071};
3072} // end anonymous namespace
3073
3074namespace {
3075
3076// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003077class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003078public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003079 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003080 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003081 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003082 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3083 }
Craig Topper3164f332014-03-11 03:39:26 +00003084 void getTargetDefines(const LangOptions &Opts,
3085 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003086 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3087 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3088 // The value of the following reflects processor type.
3089 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3090 // We lost the original triple, so we use the default.
3091 Builder.defineMacro("_M_IX86", "600");
3092 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003093};
3094} // end anonymous namespace
3095
Reid Kleckner47606832014-04-21 20:58:00 +00003096static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3097 Builder.defineMacro("__MSVCRT__");
3098 Builder.defineMacro("__MINGW32__");
3099
3100 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3101 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3102 // macro anyway for pre-processor compatibility.
3103 if (Opts.MicrosoftExt)
3104 Builder.defineMacro("__declspec", "__declspec");
3105 else
3106 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3107
3108 if (!Opts.MicrosoftExt) {
3109 // Provide macros for all the calling convention keywords. Provide both
3110 // single and double underscore prefixed variants. These are available on
3111 // x64 as well as x86, even though they have no effect.
3112 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3113 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003114 std::string GCCSpelling = "__attribute__((__";
3115 GCCSpelling += CC;
3116 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003117 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3118 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3119 }
3120 }
3121}
3122
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003123namespace {
3124// x86-32 MinGW target
3125class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3126public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003127 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3128 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003129 void getTargetDefines(const LangOptions &Opts,
3130 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003131 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003132 DefineStd(Builder, "WIN32", Opts);
3133 DefineStd(Builder, "WINNT", Opts);
3134 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003135 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003136 }
3137};
3138} // end anonymous namespace
3139
3140namespace {
3141// x86-32 Cygwin target
3142class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3143public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003144 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3145 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003146 TLSSupported = false;
3147 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003148 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003149 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003150 }
Craig Topper3164f332014-03-11 03:39:26 +00003151 void getTargetDefines(const LangOptions &Opts,
3152 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003153 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003154 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003155 Builder.defineMacro("__CYGWIN__");
3156 Builder.defineMacro("__CYGWIN32__");
3157 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003158 if (Opts.CPlusPlus)
3159 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003160 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003161};
3162} // end anonymous namespace
3163
3164namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003165// x86-32 Haiku target
3166class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3167public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003168 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003169 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003170 IntPtrType = SignedLong;
3171 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003172 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003173 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003174 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003175 }
Craig Topper3164f332014-03-11 03:39:26 +00003176 void getTargetDefines(const LangOptions &Opts,
3177 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003178 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3179 Builder.defineMacro("__INTEL__");
3180 Builder.defineMacro("__HAIKU__");
3181 }
3182};
3183} // end anonymous namespace
3184
Douglas Gregor9fabd852011-07-01 22:41:14 +00003185// RTEMS Target
3186template<typename Target>
3187class RTEMSTargetInfo : public OSTargetInfo<Target> {
3188protected:
Craig Topper3164f332014-03-11 03:39:26 +00003189 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3190 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003191 // RTEMS defines; list based off of gcc output
3192
Douglas Gregor9fabd852011-07-01 22:41:14 +00003193 Builder.defineMacro("__rtems__");
3194 Builder.defineMacro("__ELF__");
3195 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003196
Douglas Gregor9fabd852011-07-01 22:41:14 +00003197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003198 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3199 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003200
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003201 switch (Triple.getArch()) {
3202 default:
3203 case llvm::Triple::x86:
3204 // this->MCountName = ".mcount";
3205 break;
3206 case llvm::Triple::mips:
3207 case llvm::Triple::mipsel:
3208 case llvm::Triple::ppc:
3209 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003210 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003211 // this->MCountName = "_mcount";
3212 break;
3213 case llvm::Triple::arm:
3214 // this->MCountName = "__mcount";
3215 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003216 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003217 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003218};
3219
3220namespace {
3221// x86-32 RTEMS target
3222class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3223public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003224 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003225 SizeType = UnsignedLong;
3226 IntPtrType = SignedLong;
3227 PtrDiffType = SignedLong;
3228 this->UserLabelPrefix = "";
3229 }
Craig Topper3164f332014-03-11 03:39:26 +00003230 void getTargetDefines(const LangOptions &Opts,
3231 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003232 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3233 Builder.defineMacro("__INTEL__");
3234 Builder.defineMacro("__rtems__");
3235 }
3236};
3237} // end anonymous namespace
3238
Chris Lattnerb986aba2010-04-11 19:29:39 +00003239namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003240// x86-64 generic target
3241class X86_64TargetInfo : public X86TargetInfo {
3242public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003243 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003244 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003245 LongDoubleWidth = 128;
3246 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003247 LargeArrayMinWidth = 128;
3248 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003249 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003250 IntMaxType = SignedLong;
3251 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003252 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003253 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003254
Rafael Espindolac418ae92014-01-03 19:22:05 +00003255 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003256
3257 // Use fpret only for long double.
3258 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003259
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003260 // Use fp2ret for _Complex long double.
3261 ComplexLongDoubleUsesFP2Ret = true;
3262
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003263 // x86-64 has atomics up to 16 bytes.
3264 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3265 // on CPUs with cmpxchg16b
3266 MaxAtomicPromoteWidth = 128;
3267 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003268 }
Craig Topper3164f332014-03-11 03:39:26 +00003269 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003270 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003271 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003272
Craig Topper3164f332014-03-11 03:39:26 +00003273 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003274 if (RegNo == 0) return 0;
3275 if (RegNo == 1) return 1;
3276 return -1;
3277 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003278
Craig Topper3164f332014-03-11 03:39:26 +00003279 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003280 return (CC == CC_C ||
3281 CC == CC_IntelOclBicc ||
3282 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003283 }
3284
Craig Topper3164f332014-03-11 03:39:26 +00003285 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003286 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003287 }
3288
Eli Friedman3fd920a2008-08-20 02:34:37 +00003289};
3290} // end anonymous namespace
3291
3292namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003293// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003294class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003295public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003296 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3297 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003298 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003299 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003300 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003301 IntMaxType = SignedLongLong;
3302 UIntMaxType = UnsignedLongLong;
3303 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003304 SizeType = UnsignedLongLong;
3305 PtrDiffType = SignedLongLong;
3306 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003307 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003308 }
Craig Topper3164f332014-03-11 03:39:26 +00003309 void getTargetDefines(const LangOptions &Opts,
3310 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003311 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003312 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003313 }
Craig Topper3164f332014-03-11 03:39:26 +00003314 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003315 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003316 }
Craig Topper3164f332014-03-11 03:39:26 +00003317 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003318 return (CC == CC_C ||
3319 CC == CC_IntelOclBicc ||
3320 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3321 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003322};
3323} // end anonymous namespace
3324
3325namespace {
3326// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003327class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003328public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003329 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003330 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003331 LongDoubleWidth = LongDoubleAlign = 64;
3332 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003333 }
Craig Topper3164f332014-03-11 03:39:26 +00003334 void getTargetDefines(const LangOptions &Opts,
3335 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003336 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3337 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003338 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003339 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003340 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003341};
3342} // end anonymous namespace
3343
3344namespace {
3345// x86-64 MinGW target
3346class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003348 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3349 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003350 void getTargetDefines(const LangOptions &Opts,
3351 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003352 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003353 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003354 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003355 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003356 }
3357};
3358} // end anonymous namespace
3359
3360namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003361class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3364 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003365 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003366 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003367 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3368 llvm::Triple T = llvm::Triple(Triple);
3369 if (T.getOS() == llvm::Triple::IOS)
3370 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003371 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003372 }
3373};
3374} // end anonymous namespace
3375
3376namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003377class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003379 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3380 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003381 IntMaxType = SignedLongLong;
3382 UIntMaxType = UnsignedLongLong;
3383 Int64Type = SignedLongLong;
3384 }
3385};
3386} // end anonymous namespace
3387
3388namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003389class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003391 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3392 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3393 IntMaxType = SignedLongLong;
3394 UIntMaxType = UnsignedLongLong;
3395 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003396 }
3397};
Tim Northover9bb857a2013-01-31 12:13:10 +00003398}
3399
3400namespace {
3401class AArch64TargetInfo : public TargetInfo {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003402 virtual void setDescriptionString() = 0;
Tim Northover9bb857a2013-01-31 12:13:10 +00003403 static const char * const GCCRegNames[];
3404 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003405
Tim Northover2fe823a2013-08-01 09:23:19 +00003406 enum FPUModeEnum {
3407 FPUMode,
3408 NeonMode
3409 };
3410
3411 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00003412 unsigned CRC;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003413 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003414 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003415
Tim Northover9bb857a2013-01-31 12:13:10 +00003416public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003417 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003418 LongWidth = LongAlign = 64;
3419 LongDoubleWidth = LongDoubleAlign = 128;
3420 PointerWidth = PointerAlign = 64;
3421 SuitableAlign = 128;
Tim Northover9bb857a2013-01-31 12:13:10 +00003422
3423 WCharType = UnsignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003424 if (getTriple().getOS() == llvm::Triple::NetBSD) {
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003425 WCharType = SignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003426 Int64Type = SignedLongLong;
3427 IntMaxType = SignedLongLong;
3428 UIntMaxType = UnsignedLongLong;
3429 } else {
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003430 WCharType = UnsignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003431 Int64Type = SignedLong;
3432 IntMaxType = SignedLong;
3433 UIntMaxType = UnsignedLong;
3434 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003435 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3436
Tim Northover847d2d42013-02-18 12:11:32 +00003437 // AArch64 backend supports 64-bit operations at the moment. In principle
3438 // 128-bit is possible if register-pairs are used.
3439 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3440
Tim Northover9bb857a2013-01-31 12:13:10 +00003441 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3442 }
Craig Topper3164f332014-03-11 03:39:26 +00003443 void getTargetDefines(const LangOptions &Opts,
3444 MacroBuilder &Builder) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003445 // GCC defines theses currently
3446 Builder.defineMacro("__aarch64__");
Tim Northover9bb857a2013-01-31 12:13:10 +00003447
3448 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003449 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003450 Builder.defineMacro("__ARM_ARCH", "8");
3451 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003452
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003453 Builder.defineMacro("__ARM_64BIT_STATE");
3454 Builder.defineMacro("__ARM_PCS_AAPCS64");
3455 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3456
Tim Northoverb85654d2013-04-05 14:08:55 +00003457 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3458 Builder.defineMacro("__ARM_FEATURE_CLZ");
3459 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003460 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003461
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003462 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003463
3464 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003465 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003466
3467 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003468 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3469 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003470
3471 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003472 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003473
3474 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003475 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003476
Tim Northoverb85654d2013-04-05 14:08:55 +00003477 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003478 Opts.ShortWChar ? "2" : "4");
3479
Tim Northoverb85654d2013-04-05 14:08:55 +00003480 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003481 Opts.ShortEnums ? "1" : "4");
3482
Tim Northover2fe823a2013-08-01 09:23:19 +00003483 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003484 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003485 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00003486 Builder.defineMacro("__ARM_NEON_FP", "0xe");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003487 }
3488
Bradley Smith418c5932014-05-02 15:17:51 +00003489 if (CRC)
3490 Builder.defineMacro("__ARM_FEATURE_CRC32");
3491
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003492 if (Crypto) {
3493 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003494 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003495 }
Craig Topper3164f332014-03-11 03:39:26 +00003496 void getTargetBuiltins(const Builtin::Info *&Records,
3497 unsigned &NumRecords) const override {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003498 Records = BuiltinInfo;
3499 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003500 }
Craig Topper3164f332014-03-11 03:39:26 +00003501 bool hasFeature(StringRef Feature) const override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003502 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003503 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003504
Craig Topper3164f332014-03-11 03:39:26 +00003505 bool setCPU(const std::string &Name) override {
Amara Emerson703da2e2013-10-31 09:32:33 +00003506 return llvm::StringSwitch<bool>(Name)
3507 .Case("generic", true)
3508 .Cases("cortex-a53", "cortex-a57", true)
3509 .Default(false);
3510 }
3511
Craig Topper3164f332014-03-11 03:39:26 +00003512 bool handleTargetFeatures(std::vector<std::string> &Features,
3513 DiagnosticsEngine &Diags) override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003514 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00003515 CRC = 0;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003516 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003517 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3518 if (Features[i] == "+neon")
3519 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00003520 if (Features[i] == "+crc")
3521 CRC = 1;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003522 if (Features[i] == "+crypto")
3523 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003524 }
Christian Pirker9b019ae2014-02-25 13:51:00 +00003525
3526 setDescriptionString();
3527
Rafael Espindolaeb265472013-08-21 21:59:03 +00003528 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003529 }
3530
Craig Topper3164f332014-03-11 03:39:26 +00003531 void getGCCRegNames(const char *const *&Names,
3532 unsigned &NumNames) const override;
3533 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3534 unsigned &NumAliases) const override;
Tim Northover9bb857a2013-01-31 12:13:10 +00003535
Craig Topper3164f332014-03-11 03:39:26 +00003536 bool isCLZForZeroUndef() const override { return false; }
Tim Northover9bb857a2013-01-31 12:13:10 +00003537
Craig Topper3164f332014-03-11 03:39:26 +00003538 bool validateAsmConstraint(const char *&Name,
3539 TargetInfo::ConstraintInfo &Info) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003540 switch (*Name) {
3541 default: return false;
3542 case 'w': // An FP/SIMD vector register
3543 Info.setAllowsRegister();
3544 return true;
3545 case 'I': // Constant that can be used with an ADD instruction
3546 case 'J': // Constant that can be used with a SUB instruction
3547 case 'K': // Constant that can be used with a 32-bit logical instruction
3548 case 'L': // Constant that can be used with a 64-bit logical instruction
3549 case 'M': // Constant that can be used as a 32-bit MOV immediate
3550 case 'N': // Constant that can be used as a 64-bit MOV immediate
3551 case 'Y': // Floating point constant zero
3552 case 'Z': // Integer constant zero
3553 return true;
3554 case 'Q': // A memory reference with base register and no offset
3555 Info.setAllowsMemory();
3556 return true;
3557 case 'S': // A symbolic address
3558 Info.setAllowsRegister();
3559 return true;
3560 case 'U':
3561 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3562 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3563 // Usa: An absolute symbolic address
3564 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3565 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3566 }
3567 }
3568
Craig Topper3164f332014-03-11 03:39:26 +00003569 const char *getClobbers() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003570 // There are no AArch64 clobbers shared by all asm statements.
3571 return "";
3572 }
3573
Craig Topper3164f332014-03-11 03:39:26 +00003574 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003575 return TargetInfo::AArch64ABIBuiltinVaList;
3576 }
3577};
3578
3579const char * const AArch64TargetInfo::GCCRegNames[] = {
3580 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3581 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3582 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3583 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3584
3585 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3586 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3587 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3588 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3589
3590 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3591 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3592 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3593 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3594
3595 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3596 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3597 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3598 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3599
3600 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3601 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3602 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3603 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3604
3605 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3606 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3607 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3608 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3609
3610 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3611 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3612 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3613 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3614};
3615
3616void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3617 unsigned &NumNames) const {
3618 Names = GCCRegNames;
3619 NumNames = llvm::array_lengthof(GCCRegNames);
3620}
3621
3622const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3623 { { "x16" }, "ip0"},
3624 { { "x17" }, "ip1"},
3625 { { "x29" }, "fp" },
3626 { { "x30" }, "lr" }
3627};
3628
3629void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3630 unsigned &NumAliases) const {
3631 Aliases = GCCRegAliases;
3632 NumAliases = llvm::array_lengthof(GCCRegAliases);
3633
3634}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003635
3636const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3637#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3638#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3639 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00003640#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00003641
3642#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3643#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3644 ALL_LANGUAGES },
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003645#include "clang/Basic/BuiltinsAArch64.def"
3646};
3647
Christian Pirker9b019ae2014-02-25 13:51:00 +00003648class AArch64leTargetInfo : 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 AArch64leTargetInfo(const llvm::Triple &Triple)
3655 : AArch64TargetInfo(Triple) {
3656 BigEndian = false;
3657 }
Craig Topper3164f332014-03-11 03:39:26 +00003658 void getTargetDefines(const LangOptions &Opts,
3659 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003660 Builder.defineMacro("__AARCH64EL__");
3661 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3662 }
3663};
3664
3665class AArch64beTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003666 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003667 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
3668 }
3669
3670public:
3671 AArch64beTargetInfo(const llvm::Triple &Triple)
3672 : AArch64TargetInfo(Triple) { }
Craig Topper3164f332014-03-11 03:39:26 +00003673 void getTargetDefines(const LangOptions &Opts,
3674 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003675 Builder.defineMacro("__AARCH64EB__");
Christian Pirker227f5ed2014-03-24 13:57:21 +00003676 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3677 Builder.defineMacro("__ARM_BIG_ENDIAN");
Christian Pirker9b019ae2014-02-25 13:51:00 +00003678 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3679 }
3680};
3681
Eli Friedman9fa28852012-08-08 23:57:20 +00003682} // end anonymous namespace
3683
3684namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003685class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003686 // Possible FPU choices.
3687 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003688 VFP2FPU = (1 << 0),
3689 VFP3FPU = (1 << 1),
3690 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003691 NeonFPU = (1 << 3),
3692 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003693 };
3694
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003695 // Possible HWDiv features.
3696 enum HWDivMode {
3697 HWDivThumb = (1 << 0),
3698 HWDivARM = (1 << 1)
3699 };
3700
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003701 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003702 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003703 }
3704
3705 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3706 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003707
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003708 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003709
Rafael Espindolaeb265472013-08-21 21:59:03 +00003710 enum {
3711 FP_Default,
3712 FP_VFP,
3713 FP_Neon
3714 } FPMath;
3715
Bernard Ogdenda13af32013-10-24 18:32:51 +00003716 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003717
Logan Chien57086ce2012-10-10 06:56:20 +00003718 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003719 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003720 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003721
3722 // Initialized via features.
3723 unsigned SoftFloat : 1;
3724 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003725
Bernard Ogden18b57012013-10-29 09:47:51 +00003726 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003727 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003728
Chris Lattner5cc15e02010-03-03 19:03:45 +00003729 static const Builtin::Info BuiltinInfo[];
3730
Rafael Espindola101d5b92013-05-13 20:09:47 +00003731 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003732 if (T.isOSWindows())
3733 return true;
3734
Rafael Espindola101d5b92013-05-13 20:09:47 +00003735 // On linux, binaries targeting old cpus call functions in libgcc to
3736 // perform atomic operations. The implementation in libgcc then calls into
3737 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3738 // is that if we assume the kernel is at least as recent as the hardware,
3739 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003740 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003741 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003742 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003743 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003744 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003745 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003746 if (T.getArch() == llvm::Triple::arm ||
3747 T.getArch() == llvm::Triple::armeb) {
3748 StringRef VersionStr;
3749 if (ArchName.startswith("armv"))
3750 VersionStr = ArchName.substr(4);
3751 else if (ArchName.startswith("armebv"))
3752 VersionStr = ArchName.substr(6);
3753 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003754 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003755 unsigned Version;
3756 if (VersionStr.getAsInteger(10, Version))
3757 return false;
3758 return Version >= 6;
3759 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003760 assert(T.getArch() == llvm::Triple::thumb ||
3761 T.getArch() == llvm::Triple::thumbeb);
3762 StringRef VersionStr;
3763 if (ArchName.startswith("thumbv"))
3764 VersionStr = ArchName.substr(6);
3765 else if (ArchName.startswith("thumbebv"))
3766 VersionStr = ArchName.substr(8);
3767 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003768 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003769 unsigned Version;
3770 if (VersionStr.getAsInteger(10, Version))
3771 return false;
3772 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003773 }
3774
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003775 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003776 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003777
3778 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003779 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003780
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003781 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003782 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003783 SizeType = UnsignedLong;
3784 else
3785 SizeType = UnsignedInt;
3786
Rafael Espindolac418ae92014-01-03 19:22:05 +00003787 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003788 WCharType = SignedInt;
3789 } else {
3790 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3791 WCharType = UnsignedInt;
3792 }
3793
3794 UseBitFieldTypeAlignment = true;
3795
3796 ZeroLengthBitfieldBoundary = 0;
3797
3798 if (IsThumb) {
3799 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3800 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003801 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003802 DescriptionString = BigEndian ?
3803 "E-m:o-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:o-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 } else if (T.isOSWindows()) {
3808 // FIXME: this is invalid for WindowsCE
3809 assert(!BigEndian && "Windows on ARM does not support big endian");
3810 DescriptionString = "e"
3811 "-m:e"
3812 "-p:32:32"
3813 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3814 "-v128:64:128"
3815 "-a:0:32"
3816 "-n32"
3817 "-S64";
3818 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003819 DescriptionString = BigEndian ?
3820 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3821 "v128:64:128-a:0:32-n32-S64" :
3822 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3823 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003824 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003825 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003826 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003827 DescriptionString = BigEndian ?
3828 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3829 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003830 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003831 DescriptionString = BigEndian ?
3832 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3833 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003834 }
3835
3836 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003837 }
3838
3839 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003840 const llvm::Triple &T = getTriple();
3841
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003842 IsAAPCS = false;
3843
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003844 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003845
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003846 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003847 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003848 SizeType = UnsignedInt;
3849 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003850 SizeType = UnsignedLong;
3851
3852 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3853 WCharType = SignedInt;
3854
3855 // Do not respect the alignment of bit-field types when laying out
3856 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3857 UseBitFieldTypeAlignment = false;
3858
3859 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3860 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3861 /// gcc.
3862 ZeroLengthBitfieldBoundary = 32;
3863
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003864 if (IsThumb) {
3865 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3866 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003867 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003868 DescriptionString = BigEndian ?
3869 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3870 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3871 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3872 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003873 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003874 DescriptionString = BigEndian ?
3875 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3876 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3877 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3878 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003879 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003880 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003881 DescriptionString = BigEndian ?
3882 "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 +00003883 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3884 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003885 DescriptionString = BigEndian ?
3886 "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 +00003887 "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 +00003888 }
3889
3890 // FIXME: Override "preferred align" for double and long long.
3891 }
3892
Chris Lattner17df24e2008-04-21 18:56:49 +00003893public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003894 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003895 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3896 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003897 BigEndian = IsBigEndian;
3898
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003899 switch (getTriple().getOS()) {
3900 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003901 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003902 break;
3903 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003904 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003905 break;
3906 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003907
Chris Lattner1a8f3942010-04-23 16:29:58 +00003908 // {} in inline assembly are neon specifiers, not assembly variant
3909 // specifiers.
3910 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003911
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003912 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003913 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003914
3915 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003916
3917 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003918 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003919
3920 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003921 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003922 if (shouldUseInlineAtomic(getTriple()))
3923 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003924
3925 // Do force alignment of members that follow zero length bitfields. If
3926 // the alignment of the zero-length bitfield is greater than the member
3927 // that follows it, `bar', `bar' will be aligned as the type of the
3928 // zero length bitfield.
3929 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003930 }
Craig Topper3164f332014-03-11 03:39:26 +00003931 const char *getABI() const override { return ABI.c_str(); }
3932 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003933 ABI = Name;
3934
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003935 // The defaults (above) are for AAPCS, check if we need to change them.
3936 //
3937 // FIXME: We need support for -meabi... we could just mangle it into the
3938 // name.
3939 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003940 setABIAPCS();
3941 return true;
3942 }
3943 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3944 setABIAAPCS();
3945 return true;
3946 }
3947 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003948 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003949
Craig Topper3164f332014-03-11 03:39:26 +00003950 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003951 if (IsAAPCS)
3952 Features["aapcs"] = true;
3953 else
3954 Features["apcs"] = true;
3955
Silviu Barangae5690462013-10-21 10:59:33 +00003956 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003957 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3958 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003959 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3960 CPU == "cortex-a9-mp") {
3961 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003962 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003963 }
3964 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003965 Features["vfp4"] = true;
3966 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003967 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3968 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3969 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003970 Features["vfp4"] = true;
3971 Features["neon"] = true;
3972 Features["hwdiv"] = true;
3973 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003974 } else if (CPU == "cyclone") {
3975 Features["v8fp"] = true;
3976 Features["neon"] = true;
3977 Features["hwdiv"] = true;
3978 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003979 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3980 Features["fp-armv8"] = true;
3981 Features["neon"] = true;
3982 Features["hwdiv"] = true;
3983 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003984 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003985 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003986 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003987 // Enable the hwdiv extension for all v8a AArch32 cores by
3988 // default.
3989 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003990 ArchName == "armebv8a" || ArchName == "armebv8" ||
3991 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3992 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003993 Features["hwdiv"] = true;
3994 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003995 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3996 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003997 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003998 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003999
Craig Topper3164f332014-03-11 03:39:26 +00004000 bool handleTargetFeatures(std::vector<std::string> &Features,
4001 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004002 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004003 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004004 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004005 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004006 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004007 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4008 if (Features[i] == "+soft-float")
4009 SoftFloat = true;
4010 else if (Features[i] == "+soft-float-abi")
4011 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004012 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004013 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004014 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004015 FPU |= VFP3FPU;
4016 else if (Features[i] == "+vfp4")
4017 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00004018 else if (Features[i] == "+fp-armv8")
4019 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004020 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004021 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004022 else if (Features[i] == "+hwdiv")
4023 HWDiv |= HWDivThumb;
4024 else if (Features[i] == "+hwdiv-arm")
4025 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00004026 else if (Features[i] == "+crc")
4027 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00004028 else if (Features[i] == "+crypto")
4029 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004030 }
4031
Rafael Espindolaeb265472013-08-21 21:59:03 +00004032 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4033 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4034 return false;
4035 }
4036
4037 if (FPMath == FP_Neon)
4038 Features.push_back("+neonfp");
4039 else if (FPMath == FP_VFP)
4040 Features.push_back("-neonfp");
4041
Daniel Dunbar893d4752009-12-19 04:15:38 +00004042 // Remove front-end specific options which the backend handles differently.
4043 std::vector<std::string>::iterator it;
4044 it = std::find(Features.begin(), Features.end(), "+soft-float");
4045 if (it != Features.end())
4046 Features.erase(it);
4047 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
4048 if (it != Features.end())
4049 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00004050 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004051 }
4052
Craig Topper3164f332014-03-11 03:39:26 +00004053 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004054 return llvm::StringSwitch<bool>(Feature)
4055 .Case("arm", true)
4056 .Case("softfloat", SoftFloat)
4057 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004058 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004059 .Case("hwdiv", HWDiv & HWDivThumb)
4060 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004061 .Default(false);
4062 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004063 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004064 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004065 return llvm::StringSwitch<const char*>(Name)
4066 .Cases("arm8", "arm810", "4")
4067 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
4068 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4069 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4070 .Case("ep9312", "4T")
4071 .Cases("arm10tdmi", "arm1020t", "5T")
4072 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4073 .Case("arm926ej-s", "5TEJ")
4074 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4075 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004076 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004077 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004078 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004079 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004080 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004081 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004082 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004083 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00004084 .Case("cyclone", "8A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004085 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004086 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004087 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004088 .Default(0);
4089 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004090 static const char *getCPUProfile(StringRef Name) {
4091 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004092 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004093 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004094 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004095 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004096 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004097 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004098 }
Craig Topper3164f332014-03-11 03:39:26 +00004099 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004100 if (!getCPUDefineSuffix(Name))
4101 return false;
4102
4103 CPU = Name;
4104 return true;
4105 }
Craig Topper3164f332014-03-11 03:39:26 +00004106 bool setFPMath(StringRef Name) override;
4107 void getTargetDefines(const LangOptions &Opts,
4108 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004109 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004110 Builder.defineMacro("__arm");
4111 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004112
Chris Lattnerecd49032009-03-02 22:27:17 +00004113 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004115
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004116 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004117 unsigned int CPUArchVer;
4118 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4119 llvm_unreachable("Invalid char for architecture version number");
4120 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004121 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004122 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4123 StringRef CPUProfile = getCPUProfile(CPU);
4124 if (!CPUProfile.empty())
4125 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004126
Mike Stump9d54bd72009-04-08 02:07:04 +00004127 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004128
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004129 // FIXME: It's more complicated than this and we don't really support
4130 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004131 // Windows on ARM does not "support" interworking
4132 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004133 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004134
David Tweed8f676532012-10-25 13:33:01 +00004135 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004136 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004137 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4138 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004139 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004140 Builder.defineMacro("__ARM_PCS", "1");
4141
David Tweed8f676532012-10-25 13:33:01 +00004142 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004143 Builder.defineMacro("__ARM_PCS_VFP", "1");
4144 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004145
Daniel Dunbar893d4752009-12-19 04:15:38 +00004146 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004147 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004148
4149 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004150 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004151
4152 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004153 Builder.defineMacro("__THUMBEL__");
4154 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004155 // We check both CPUArchVer and ArchName because when only triple is
4156 // specified, the default CPU is arm1136j-s.
4157 StringRef ArchName = getTriple().getArchName();
4158 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4159 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004160 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004161 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004162 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4163 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004164
4165 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004166 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004167
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004168 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004169 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004170 if (FPU & VFP2FPU)
4171 Builder.defineMacro("__ARM_VFPV2__");
4172 if (FPU & VFP3FPU)
4173 Builder.defineMacro("__ARM_VFPV3__");
4174 if (FPU & VFP4FPU)
4175 Builder.defineMacro("__ARM_VFPV4__");
4176 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004177
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004178 // This only gets set when Neon instructions are actually available, unlike
4179 // the VFP define, hence the soft float and arch check. This is subtly
4180 // different from gcc, we follow the intent which was that it should be set
4181 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004182 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4183 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004184 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004185 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004186
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004187 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4188 Opts.ShortWChar ? "2" : "4");
4189
4190 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4191 Opts.ShortEnums ? "1" : "4");
4192
Bernard Ogden18b57012013-10-29 09:47:51 +00004193 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004194 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004195
Tim Northover02e38602014-02-03 17:28:04 +00004196 if (Crypto)
4197 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4198
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004199 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004200 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4201 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4202 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4203 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4204 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004205 }
Craig Topper3164f332014-03-11 03:39:26 +00004206 void getTargetBuiltins(const Builtin::Info *&Records,
4207 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004208 Records = BuiltinInfo;
4209 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004210 }
Craig Topper3164f332014-03-11 03:39:26 +00004211 bool isCLZForZeroUndef() const override { return false; }
4212 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004213 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004214 }
Craig Topper3164f332014-03-11 03:39:26 +00004215 void getGCCRegNames(const char * const *&Names,
4216 unsigned &NumNames) const override;
4217 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4218 unsigned &NumAliases) const override;
4219 bool validateAsmConstraint(const char *&Name,
4220 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004221 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004222 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004223 case 'l': // r0-r7
4224 case 'h': // r8-r15
4225 case 'w': // VFP Floating point register single precision
4226 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004227 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004228 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004229 case 'Q': // A memory address that is a single base register.
4230 Info.setAllowsMemory();
4231 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004232 case 'U': // a memory reference...
4233 switch (Name[1]) {
4234 case 'q': // ...ARMV4 ldrsb
4235 case 'v': // ...VFP load/store (reg+constant offset)
4236 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004237 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004238 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004239 case 'n': // valid address for Neon doubleword vector load/store
4240 case 'm': // valid address for Neon element and structure load/store
4241 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004242 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004243 Info.setAllowsMemory();
4244 Name++;
4245 return true;
4246 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004247 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004248 return false;
4249 }
Craig Topper3164f332014-03-11 03:39:26 +00004250 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004251 std::string R;
4252 switch (*Constraint) {
4253 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004254 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004255 Constraint++;
4256 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004257 case 'p': // 'p' should be translated to 'r' by default.
4258 R = std::string("r");
4259 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004260 default:
4261 return std::string(1, *Constraint);
4262 }
4263 return R;
4264 }
Craig Topper3164f332014-03-11 03:39:26 +00004265 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4266 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004267 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004268 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004269
Bill Wendling9d1ee112012-10-25 23:28:48 +00004270 // Strip off constraint modifiers.
4271 while (Constraint[0] == '=' ||
4272 Constraint[0] == '+' ||
4273 Constraint[0] == '&')
4274 Constraint = Constraint.substr(1);
4275
4276 switch (Constraint[0]) {
4277 default: break;
4278 case 'r': {
4279 switch (Modifier) {
4280 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004281 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004282 case 'q':
4283 // A register of size 32 cannot fit a vector type.
4284 return false;
4285 }
4286 }
4287 }
4288
4289 return true;
4290 }
Craig Topper3164f332014-03-11 03:39:26 +00004291 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004292 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004293 return "";
4294 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004295
Craig Topper3164f332014-03-11 03:39:26 +00004296 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004297 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4298 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004299
Craig Topper3164f332014-03-11 03:39:26 +00004300 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004301 if (RegNo == 0) return 0;
4302 if (RegNo == 1) return 1;
4303 return -1;
4304 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004305};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004306
Rafael Espindolaeb265472013-08-21 21:59:03 +00004307bool ARMTargetInfo::setFPMath(StringRef Name) {
4308 if (Name == "neon") {
4309 FPMath = FP_Neon;
4310 return true;
4311 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4312 Name == "vfp4") {
4313 FPMath = FP_VFP;
4314 return true;
4315 }
4316 return false;
4317}
4318
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004319const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004320 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004321 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004322 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4323
4324 // Float registers
4325 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4326 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4327 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004328 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004329
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004330 // Double registers
4331 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4332 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004333 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4334 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004335
4336 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004337 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4338 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004339};
4340
4341void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004342 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004343 Names = GCCRegNames;
4344 NumNames = llvm::array_lengthof(GCCRegNames);
4345}
4346
4347const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004348 { { "a1" }, "r0" },
4349 { { "a2" }, "r1" },
4350 { { "a3" }, "r2" },
4351 { { "a4" }, "r3" },
4352 { { "v1" }, "r4" },
4353 { { "v2" }, "r5" },
4354 { { "v3" }, "r6" },
4355 { { "v4" }, "r7" },
4356 { { "v5" }, "r8" },
4357 { { "v6", "rfp" }, "r9" },
4358 { { "sl" }, "r10" },
4359 { { "fp" }, "r11" },
4360 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004361 { { "r13" }, "sp" },
4362 { { "r14" }, "lr" },
4363 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004364 // The S, D and Q registers overlap, but aren't really aliases; we
4365 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004366};
4367
4368void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4369 unsigned &NumAliases) const {
4370 Aliases = GCCRegAliases;
4371 NumAliases = llvm::array_lengthof(GCCRegAliases);
4372}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004373
4374const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004375#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004376#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004377 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004378#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004379
4380#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4381#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4382 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004383#include "clang/Basic/BuiltinsARM.def"
4384};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004385
4386class ARMleTargetInfo : public ARMTargetInfo {
4387public:
4388 ARMleTargetInfo(const llvm::Triple &Triple)
4389 : ARMTargetInfo(Triple, false) { }
4390 virtual void getTargetDefines(const LangOptions &Opts,
4391 MacroBuilder &Builder) const {
4392 Builder.defineMacro("__ARMEL__");
4393 ARMTargetInfo::getTargetDefines(Opts, Builder);
4394 }
4395};
4396
4397class ARMbeTargetInfo : public ARMTargetInfo {
4398public:
4399 ARMbeTargetInfo(const llvm::Triple &Triple)
4400 : ARMTargetInfo(Triple, true) { }
4401 virtual void getTargetDefines(const LangOptions &Opts,
4402 MacroBuilder &Builder) const {
4403 Builder.defineMacro("__ARMEB__");
4404 Builder.defineMacro("__ARM_BIG_ENDIAN");
4405 ARMTargetInfo::getTargetDefines(Opts, Builder);
4406 }
4407};
Chris Lattner17df24e2008-04-21 18:56:49 +00004408} // end anonymous namespace.
4409
Eli Friedmanf05b7722008-08-20 07:44:10 +00004410namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004411class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4412 const llvm::Triple Triple;
4413public:
4414 WindowsARMTargetInfo(const llvm::Triple &Triple)
4415 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4416 TLSSupported = false;
4417 WCharType = UnsignedShort;
4418 SizeType = UnsignedInt;
4419 UserLabelPrefix = "";
4420 }
4421 void getVisualStudioDefines(const LangOptions &Opts,
4422 MacroBuilder &Builder) const {
4423 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4424
4425 // FIXME: this is invalid for WindowsCE
4426 Builder.defineMacro("_M_ARM_NT", "1");
4427 Builder.defineMacro("_M_ARMT", "_M_ARM");
4428 Builder.defineMacro("_M_THUMB", "_M_ARM");
4429
4430 assert((Triple.getArch() == llvm::Triple::arm ||
4431 Triple.getArch() == llvm::Triple::thumb) &&
4432 "invalid architecture for Windows ARM target info");
4433 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4434 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4435
4436 // TODO map the complete set of values
4437 // 31: VFPv3 40: VFPv4
4438 Builder.defineMacro("_M_ARM_FP", "31");
4439 }
4440};
4441
4442// Windows ARM + Itanium C++ ABI Target
4443class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4444public:
4445 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4446 : WindowsARMTargetInfo(Triple) {
4447 TheCXXABI.set(TargetCXXABI::GenericARM);
4448 }
4449
4450 void getTargetDefines(const LangOptions &Opts,
4451 MacroBuilder &Builder) const override {
4452 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4453
4454 if (Opts.MSVCCompat)
4455 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4456 }
4457};
4458
4459// Windows ARM, MS (C++) ABI
4460class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4461public:
4462 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4463 : WindowsARMTargetInfo(Triple) {
4464 TheCXXABI.set(TargetCXXABI::Microsoft);
4465 }
4466
4467 void getTargetDefines(const LangOptions &Opts,
4468 MacroBuilder &Builder) const override {
4469 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4470 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4471 }
4472};
4473}
4474
4475
4476namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004477class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004478 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004479protected:
Craig Topper3164f332014-03-11 03:39:26 +00004480 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4481 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004482 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004483 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004484
Torok Edwinb2b37c62009-06-30 17:10:35 +00004485public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004486 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004487 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004488 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004489 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004490 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004491 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004492
4493 // Darwin on iOS uses a variant of the ARM C++ ABI.
4494 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004495 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004496};
4497} // end anonymous namespace.
4498
Tony Linthicum76329bf2011-12-12 21:14:55 +00004499
4500namespace {
Tim Northovera2ee4332014-03-29 15:09:45 +00004501class ARM64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004502 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004503 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4504 static const char *const GCCRegNames[];
4505
James Molloy75f5f9e2014-04-16 15:33:48 +00004506 enum FPUModeEnum {
4507 FPUMode,
4508 NeonMode
4509 };
4510
4511 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004512 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004513 unsigned Crypto;
4514
Tim Northovera2ee4332014-03-29 15:09:45 +00004515 static const Builtin::Info BuiltinInfo[];
4516
4517 std::string ABI;
4518
4519public:
4520 ARM64TargetInfo(const llvm::Triple &Triple)
4521 : TargetInfo(Triple), ABI("aapcs") {
Tim Northovera2ee4332014-03-29 15:09:45 +00004522 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4523 IntMaxType = SignedLong;
4524 UIntMaxType = UnsignedLong;
4525 Int64Type = SignedLong;
4526 WCharType = UnsignedInt;
4527 MaxVectorAlign = 128;
4528 RegParmMax = 8;
4529 MaxAtomicInlineWidth = 128;
4530 MaxAtomicPromoteWidth = 128;
4531
4532 LongDoubleWidth = LongDoubleAlign = 128;
4533 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4534
Tim Northovera2ee4332014-03-29 15:09:45 +00004535 // {} in inline assembly are neon specifiers, not assembly variant
4536 // specifiers.
4537 NoAsmVariants = true;
4538
4539 // ARM64 targets default to using the ARM C++ ABI.
4540 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4541 }
4542
4543 virtual const char *getABI() const { return ABI.c_str(); }
4544 virtual bool setABI(const std::string &Name) {
4545 if (Name != "aapcs" && Name != "darwinpcs")
4546 return false;
4547
4548 ABI = Name;
4549 return true;
4550 }
4551
4552 virtual bool setCPU(const std::string &Name) {
4553 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004554 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004555 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004556 .Case("cyclone", true)
4557 .Default(false);
4558 return CPUKnown;
4559 }
4560
4561 virtual void getTargetDefines(const LangOptions &Opts,
4562 MacroBuilder &Builder) const {
4563 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004564 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004565
4566 // Target properties.
4567 Builder.defineMacro("_LP64");
4568 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004569
4570 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4571 Builder.defineMacro("__ARM_ACLE", "200");
4572 Builder.defineMacro("__ARM_ARCH", "8");
4573 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4574
4575 Builder.defineMacro("__ARM_64BIT_STATE");
4576 Builder.defineMacro("__ARM_PCS_AAPCS64");
4577 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4578
4579 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4580 Builder.defineMacro("__ARM_FEATURE_CLZ");
4581 Builder.defineMacro("__ARM_FEATURE_FMA");
4582 Builder.defineMacro("__ARM_FEATURE_DIV");
4583
4584 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4585
4586 // 0xe implies support for half, single and double precision operations.
4587 Builder.defineMacro("__ARM_FP", "0xe");
4588
4589 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4590 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4591 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4592
4593 if (Opts.FastMath || Opts.FiniteMathOnly)
4594 Builder.defineMacro("__ARM_FP_FAST");
4595
4596 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4597 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4598
4599 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4600
4601 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4602 Opts.ShortEnums ? "1" : "4");
4603
James Molloy75f5f9e2014-04-16 15:33:48 +00004604 if (FPU == NeonMode) {
4605 Builder.defineMacro("__ARM_NEON");
4606 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004607 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004608 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004609
Bradley Smith418c5932014-05-02 15:17:51 +00004610 if (CRC)
4611 Builder.defineMacro("__ARM_FEATURE_CRC32");
4612
James Molloy75f5f9e2014-04-16 15:33:48 +00004613 if (Crypto)
4614 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004615 }
4616
4617 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4618 unsigned &NumRecords) const {
4619 Records = BuiltinInfo;
4620 NumRecords = clang::ARM64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4621 }
4622
4623 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004624 return Feature == "aarch64" ||
4625 Feature == "arm64" ||
4626 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004627 }
4628
James Molloy5e73df52014-04-16 15:06:20 +00004629 bool handleTargetFeatures(std::vector<std::string> &Features,
4630 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004631 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004632 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004633 Crypto = 0;
4634 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4635 if (Features[i] == "+neon")
4636 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004637 if (Features[i] == "+crc")
4638 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004639 if (Features[i] == "+crypto")
4640 Crypto = 1;
4641 }
4642
James Molloy5e73df52014-04-16 15:06:20 +00004643 setDescriptionString();
4644
4645 return true;
4646 }
4647
Tim Northovera2ee4332014-03-29 15:09:45 +00004648 virtual bool isCLZForZeroUndef() const { return false; }
4649
4650 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4651 return TargetInfo::AArch64ABIBuiltinVaList;
4652 }
4653
4654 virtual void getGCCRegNames(const char *const *&Names,
4655 unsigned &NumNames) const;
4656 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4657 unsigned &NumAliases) const;
4658
4659 virtual bool validateAsmConstraint(const char *&Name,
4660 TargetInfo::ConstraintInfo &Info) const {
4661 switch (*Name) {
4662 default:
4663 return false;
4664 case 'w': // Floating point and SIMD registers (V0-V31)
4665 Info.setAllowsRegister();
4666 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004667 case 'I': // Constant that can be used with an ADD instruction
4668 case 'J': // Constant that can be used with a SUB instruction
4669 case 'K': // Constant that can be used with a 32-bit logical instruction
4670 case 'L': // Constant that can be used with a 64-bit logical instruction
4671 case 'M': // Constant that can be used as a 32-bit MOV immediate
4672 case 'N': // Constant that can be used as a 64-bit MOV immediate
4673 case 'Y': // Floating point constant zero
4674 case 'Z': // Integer constant zero
4675 return true;
4676 case 'Q': // A memory reference with base register and no offset
4677 Info.setAllowsMemory();
4678 return true;
4679 case 'S': // A symbolic address
4680 Info.setAllowsRegister();
4681 return true;
4682 case 'U':
4683 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4684 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4685 // Usa: An absolute symbolic address
4686 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4687 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004688 case 'z': // Zero register, wzr or xzr
4689 Info.setAllowsRegister();
4690 return true;
4691 case 'x': // Floating point and SIMD registers (V0-V15)
4692 Info.setAllowsRegister();
4693 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004694 }
4695 return false;
4696 }
4697
Tim Northovera2ee4332014-03-29 15:09:45 +00004698 virtual const char *getClobbers() const { return ""; }
4699
4700 int getEHDataRegisterNumber(unsigned RegNo) const {
4701 if (RegNo == 0)
4702 return 0;
4703 if (RegNo == 1)
4704 return 1;
4705 return -1;
4706 }
4707};
4708
4709const char *const ARM64TargetInfo::GCCRegNames[] = {
4710 // 32-bit Integer registers
4711 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4712 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4713 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4714
4715 // 64-bit Integer registers
4716 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4717 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4718 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4719
4720 // 32-bit floating point regsisters
4721 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4722 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4723 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4724
4725 // 64-bit floating point regsisters
4726 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4727 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4728 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4729
4730 // Vector registers
4731 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4732 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4733 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4734};
4735
4736void ARM64TargetInfo::getGCCRegNames(const char *const *&Names,
4737 unsigned &NumNames) const {
4738 Names = GCCRegNames;
4739 NumNames = llvm::array_lengthof(GCCRegNames);
4740}
4741
4742const TargetInfo::GCCRegAlias ARM64TargetInfo::GCCRegAliases[] = {
4743 { { "w31" }, "wsp" },
4744 { { "x29" }, "fp" },
4745 { { "x30" }, "lr" },
4746 { { "x31" }, "sp" },
4747 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4748 // don't want to substitute one of these for a different-sized one.
4749};
4750
4751void ARM64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4752 unsigned &NumAliases) const {
4753 Aliases = GCCRegAliases;
4754 NumAliases = llvm::array_lengthof(GCCRegAliases);
4755}
4756
4757const Builtin::Info ARM64TargetInfo::BuiltinInfo[] = {
4758#define BUILTIN(ID, TYPE, ATTRS) \
4759 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4760#include "clang/Basic/BuiltinsNEON.def"
4761
4762#define BUILTIN(ID, TYPE, ATTRS) \
4763 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4764#include "clang/Basic/BuiltinsARM64.def"
4765};
James Molloy5e73df52014-04-16 15:06:20 +00004766
4767class ARM64leTargetInfo : public ARM64TargetInfo {
4768 void setDescriptionString() override {
4769 if (getTriple().isOSBinFormatMachO())
4770 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4771 else
4772 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4773 }
4774
4775public:
4776 ARM64leTargetInfo(const llvm::Triple &Triple)
4777 : ARM64TargetInfo(Triple) {
4778 BigEndian = false;
4779 }
4780 void getTargetDefines(const LangOptions &Opts,
4781 MacroBuilder &Builder) const override {
4782 Builder.defineMacro("__AARCH64EL__");
4783 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4784 }
4785};
4786
4787class ARM64beTargetInfo : public ARM64TargetInfo {
4788 void setDescriptionString() override {
4789 assert(!getTriple().isOSBinFormatMachO());
4790 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4791 }
4792
4793public:
4794 ARM64beTargetInfo(const llvm::Triple &Triple)
4795 : ARM64TargetInfo(Triple) { }
4796 void getTargetDefines(const LangOptions &Opts,
4797 MacroBuilder &Builder) const override {
4798 Builder.defineMacro("__AARCH64EB__");
4799 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4800 Builder.defineMacro("__ARM_BIG_ENDIAN");
4801 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4802 }
4803};
Tim Northovera2ee4332014-03-29 15:09:45 +00004804} // end anonymous namespace.
4805
4806namespace {
James Molloy5e73df52014-04-16 15:06:20 +00004807class DarwinARM64TargetInfo : public DarwinTargetInfo<ARM64leTargetInfo> {
4808protected:
4809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4810 MacroBuilder &Builder) const override {
4811 Builder.defineMacro("__AARCH64_SIMD__");
4812 Builder.defineMacro("__ARM64_ARCH_8__");
4813 Builder.defineMacro("__ARM_NEON__");
4814 Builder.defineMacro("__LITTLE_ENDIAN__");
4815 Builder.defineMacro("__REGISTER_PREFIX__", "");
4816 Builder.defineMacro("__arm64", "1");
4817 Builder.defineMacro("__arm64__", "1");
4818
4819 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4820 }
4821
Tim Northovera2ee4332014-03-29 15:09:45 +00004822public:
4823 DarwinARM64TargetInfo(const llvm::Triple &Triple)
James Molloy5e73df52014-04-16 15:06:20 +00004824 : DarwinTargetInfo<ARM64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004825 Int64Type = SignedLongLong;
4826 WCharType = SignedInt;
4827 UseSignedCharForObjCBool = false;
4828
4829 LongDoubleWidth = LongDoubleAlign = 64;
4830 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4831
4832 TheCXXABI.set(TargetCXXABI::iOS64);
4833 }
4834
4835 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4836 return TargetInfo::CharPtrBuiltinVaList;
4837 }
4838};
4839} // end anonymous namespace
4840
4841namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004842// Hexagon abstract base class
4843class HexagonTargetInfo : public TargetInfo {
4844 static const Builtin::Info BuiltinInfo[];
4845 static const char * const GCCRegNames[];
4846 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4847 std::string CPU;
4848public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004849 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004850 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004851 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004852
4853 // {} in inline assembly are packet specifiers, not assembly variant
4854 // specifiers.
4855 NoAsmVariants = true;
4856 }
4857
Craig Topper3164f332014-03-11 03:39:26 +00004858 void getTargetBuiltins(const Builtin::Info *&Records,
4859 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004860 Records = BuiltinInfo;
4861 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4862 }
4863
Craig Topper3164f332014-03-11 03:39:26 +00004864 bool validateAsmConstraint(const char *&Name,
4865 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004866 return true;
4867 }
4868
Craig Topper3164f332014-03-11 03:39:26 +00004869 void getTargetDefines(const LangOptions &Opts,
4870 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004871
Craig Topper3164f332014-03-11 03:39:26 +00004872 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004873 return Feature == "hexagon";
4874 }
Craig Topper3164f332014-03-11 03:39:26 +00004875
4876 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004877 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004878 }
Craig Topper3164f332014-03-11 03:39:26 +00004879 void getGCCRegNames(const char * const *&Names,
4880 unsigned &NumNames) const override;
4881 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4882 unsigned &NumAliases) const override;
4883 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004884 return "";
4885 }
Sebastian Pop86500282012-01-13 20:37:10 +00004886
4887 static const char *getHexagonCPUSuffix(StringRef Name) {
4888 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004889 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004890 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004891 .Default(0);
4892 }
4893
Craig Topper3164f332014-03-11 03:39:26 +00004894 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004895 if (!getHexagonCPUSuffix(Name))
4896 return false;
4897
Tony Linthicum76329bf2011-12-12 21:14:55 +00004898 CPU = Name;
4899 return true;
4900 }
4901};
4902
4903void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4904 MacroBuilder &Builder) const {
4905 Builder.defineMacro("qdsp6");
4906 Builder.defineMacro("__qdsp6", "1");
4907 Builder.defineMacro("__qdsp6__", "1");
4908
4909 Builder.defineMacro("hexagon");
4910 Builder.defineMacro("__hexagon", "1");
4911 Builder.defineMacro("__hexagon__", "1");
4912
4913 if(CPU == "hexagonv1") {
4914 Builder.defineMacro("__HEXAGON_V1__");
4915 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4916 if(Opts.HexagonQdsp6Compat) {
4917 Builder.defineMacro("__QDSP6_V1__");
4918 Builder.defineMacro("__QDSP6_ARCH__", "1");
4919 }
4920 }
4921 else if(CPU == "hexagonv2") {
4922 Builder.defineMacro("__HEXAGON_V2__");
4923 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4924 if(Opts.HexagonQdsp6Compat) {
4925 Builder.defineMacro("__QDSP6_V2__");
4926 Builder.defineMacro("__QDSP6_ARCH__", "2");
4927 }
4928 }
4929 else if(CPU == "hexagonv3") {
4930 Builder.defineMacro("__HEXAGON_V3__");
4931 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4932 if(Opts.HexagonQdsp6Compat) {
4933 Builder.defineMacro("__QDSP6_V3__");
4934 Builder.defineMacro("__QDSP6_ARCH__", "3");
4935 }
4936 }
4937 else if(CPU == "hexagonv4") {
4938 Builder.defineMacro("__HEXAGON_V4__");
4939 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4940 if(Opts.HexagonQdsp6Compat) {
4941 Builder.defineMacro("__QDSP6_V4__");
4942 Builder.defineMacro("__QDSP6_ARCH__", "4");
4943 }
4944 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004945 else if(CPU == "hexagonv5") {
4946 Builder.defineMacro("__HEXAGON_V5__");
4947 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4948 if(Opts.HexagonQdsp6Compat) {
4949 Builder.defineMacro("__QDSP6_V5__");
4950 Builder.defineMacro("__QDSP6_ARCH__", "5");
4951 }
4952 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004953}
4954
4955const char * const HexagonTargetInfo::GCCRegNames[] = {
4956 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4957 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4958 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4959 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4960 "p0", "p1", "p2", "p3",
4961 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4962};
4963
4964void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4965 unsigned &NumNames) const {
4966 Names = GCCRegNames;
4967 NumNames = llvm::array_lengthof(GCCRegNames);
4968}
4969
4970
4971const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4972 { { "sp" }, "r29" },
4973 { { "fp" }, "r30" },
4974 { { "lr" }, "r31" },
4975 };
4976
4977void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4978 unsigned &NumAliases) const {
4979 Aliases = GCCRegAliases;
4980 NumAliases = llvm::array_lengthof(GCCRegAliases);
4981}
4982
4983
4984const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4985#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4986#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4987 ALL_LANGUAGES },
4988#include "clang/Basic/BuiltinsHexagon.def"
4989};
4990}
4991
4992
Chris Lattner5ba61f02006-10-14 07:39:34 +00004993namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004994// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4995class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004996 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4997 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004998 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004999public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005000 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005001
Craig Topper3164f332014-03-11 03:39:26 +00005002 bool handleTargetFeatures(std::vector<std::string> &Features,
5003 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005004 SoftFloat = false;
5005 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5006 if (Features[i] == "+soft-float")
5007 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005008 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005009 }
Craig Topper3164f332014-03-11 03:39:26 +00005010 void getTargetDefines(const LangOptions &Opts,
5011 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005012 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005013 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005014
5015 if (SoftFloat)
5016 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005017 }
Craig Topper3164f332014-03-11 03:39:26 +00005018
5019 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005020 return llvm::StringSwitch<bool>(Feature)
5021 .Case("softfloat", SoftFloat)
5022 .Case("sparc", true)
5023 .Default(false);
5024 }
Craig Topper3164f332014-03-11 03:39:26 +00005025
5026 void getTargetBuiltins(const Builtin::Info *&Records,
5027 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005028 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005029 }
Craig Topper3164f332014-03-11 03:39:26 +00005030 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005031 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005032 }
Craig Topper3164f332014-03-11 03:39:26 +00005033 void getGCCRegNames(const char * const *&Names,
5034 unsigned &NumNames) const override;
5035 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5036 unsigned &NumAliases) const override;
5037 bool validateAsmConstraint(const char *&Name,
5038 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005039 // FIXME: Implement!
5040 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005041 }
Craig Topper3164f332014-03-11 03:39:26 +00005042 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005043 // FIXME: Implement!
5044 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005045 }
5046};
5047
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005048const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005049 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5050 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5051 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5052 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5053};
5054
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005055void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5056 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005057 Names = GCCRegNames;
5058 NumNames = llvm::array_lengthof(GCCRegNames);
5059}
5060
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005061const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005062 { { "g0" }, "r0" },
5063 { { "g1" }, "r1" },
5064 { { "g2" }, "r2" },
5065 { { "g3" }, "r3" },
5066 { { "g4" }, "r4" },
5067 { { "g5" }, "r5" },
5068 { { "g6" }, "r6" },
5069 { { "g7" }, "r7" },
5070 { { "o0" }, "r8" },
5071 { { "o1" }, "r9" },
5072 { { "o2" }, "r10" },
5073 { { "o3" }, "r11" },
5074 { { "o4" }, "r12" },
5075 { { "o5" }, "r13" },
5076 { { "o6", "sp" }, "r14" },
5077 { { "o7" }, "r15" },
5078 { { "l0" }, "r16" },
5079 { { "l1" }, "r17" },
5080 { { "l2" }, "r18" },
5081 { { "l3" }, "r19" },
5082 { { "l4" }, "r20" },
5083 { { "l5" }, "r21" },
5084 { { "l6" }, "r22" },
5085 { { "l7" }, "r23" },
5086 { { "i0" }, "r24" },
5087 { { "i1" }, "r25" },
5088 { { "i2" }, "r26" },
5089 { { "i3" }, "r27" },
5090 { { "i4" }, "r28" },
5091 { { "i5" }, "r29" },
5092 { { "i6", "fp" }, "r30" },
5093 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005094};
5095
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005096void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5097 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005098 Aliases = GCCRegAliases;
5099 NumAliases = llvm::array_lengthof(GCCRegAliases);
5100}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005101
5102// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5103class SparcV8TargetInfo : public SparcTargetInfo {
5104public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005105 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005106 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005107 }
5108
Craig Topper3164f332014-03-11 03:39:26 +00005109 void getTargetDefines(const LangOptions &Opts,
5110 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005111 SparcTargetInfo::getTargetDefines(Opts, Builder);
5112 Builder.defineMacro("__sparcv8");
5113 }
5114};
5115
5116// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5117class SparcV9TargetInfo : public SparcTargetInfo {
5118public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005119 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005120 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005121 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005122 // This is an LP64 platform.
5123 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005124
5125 // OpenBSD uses long long for int64_t and intmax_t.
5126 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
5127 IntMaxType = SignedLongLong;
5128 UIntMaxType = UnsignedLongLong;
5129 } else {
5130 IntMaxType = SignedLong;
5131 UIntMaxType = UnsignedLong;
5132 }
5133 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005134
5135 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5136 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5137 LongDoubleWidth = 128;
5138 LongDoubleAlign = 128;
5139 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005140 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005141 }
5142
Craig Topper3164f332014-03-11 03:39:26 +00005143 void getTargetDefines(const LangOptions &Opts,
5144 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005145 SparcTargetInfo::getTargetDefines(Opts, Builder);
5146 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005147 Builder.defineMacro("__arch64__");
5148 // Solaris and its derivative AuroraUX don't need these variants, but the
5149 // BSDs do.
5150 if (getTriple().getOS() != llvm::Triple::Solaris &&
5151 getTriple().getOS() != llvm::Triple::AuroraUX) {
5152 Builder.defineMacro("__sparc64__");
5153 Builder.defineMacro("__sparc_v9__");
5154 Builder.defineMacro("__sparcv9__");
5155 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005156 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005157
Craig Topper3164f332014-03-11 03:39:26 +00005158 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005159 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5160 .Case("v9", true)
5161 .Case("ultrasparc", true)
5162 .Case("ultrasparc3", true)
5163 .Case("niagara", true)
5164 .Case("niagara2", true)
5165 .Case("niagara3", true)
5166 .Case("niagara4", true)
5167 .Default(false);
5168
5169 // No need to store the CPU yet. There aren't any CPU-specific
5170 // macros to define.
5171 return CPUKnown;
5172 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005173};
5174
Gabor Greif49991682008-02-21 16:29:08 +00005175} // end anonymous namespace.
5176
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005177namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005178class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5179public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005180 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5181 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005182 SizeType = UnsignedInt;
5183 PtrDiffType = SignedInt;
5184 }
5185};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005186class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005188 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5189 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005190 SizeType = UnsignedInt;
5191 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005192 }
5193};
5194} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005195
Chris Lattnerb781dc792008-05-08 05:58:21 +00005196namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005197class SystemZTargetInfo : public TargetInfo {
5198 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005199
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005200public:
5201 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5202 TLSSupported = true;
5203 IntWidth = IntAlign = 32;
5204 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5205 PointerWidth = PointerAlign = 64;
5206 LongDoubleWidth = 128;
5207 LongDoubleAlign = 64;
5208 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5209 MinGlobalAlign = 16;
5210 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5211 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5212 }
5213 void getTargetDefines(const LangOptions &Opts,
5214 MacroBuilder &Builder) const override {
5215 Builder.defineMacro("__s390__");
5216 Builder.defineMacro("__s390x__");
5217 Builder.defineMacro("__zarch__");
5218 Builder.defineMacro("__LONG_DOUBLE_128__");
5219 }
5220 void getTargetBuiltins(const Builtin::Info *&Records,
5221 unsigned &NumRecords) const override {
5222 // FIXME: Implement.
5223 Records = 0;
5224 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005225 }
5226
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005227 void getGCCRegNames(const char *const *&Names,
5228 unsigned &NumNames) const override;
5229 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5230 unsigned &NumAliases) const override {
5231 // No aliases.
5232 Aliases = 0;
5233 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005234 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005235 bool validateAsmConstraint(const char *&Name,
5236 TargetInfo::ConstraintInfo &info) const override;
5237 const char *getClobbers() const override {
5238 // FIXME: Is this really right?
5239 return "";
5240 }
5241 BuiltinVaListKind getBuiltinVaListKind() const override {
5242 return TargetInfo::SystemZBuiltinVaList;
5243 }
5244 bool setCPU(const std::string &Name) override {
5245 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5246 .Case("z10", true)
5247 .Case("z196", true)
5248 .Case("zEC12", true)
5249 .Default(false);
5250
5251 // No need to store the CPU yet. There aren't any CPU-specific
5252 // macros to define.
5253 return CPUKnown;
5254 }
5255};
5256
5257const char *const SystemZTargetInfo::GCCRegNames[] = {
5258 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5259 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5260 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5261 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5262};
5263
5264void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5265 unsigned &NumNames) const {
5266 Names = GCCRegNames;
5267 NumNames = llvm::array_lengthof(GCCRegNames);
5268}
5269
5270bool SystemZTargetInfo::
5271validateAsmConstraint(const char *&Name,
5272 TargetInfo::ConstraintInfo &Info) const {
5273 switch (*Name) {
5274 default:
5275 return false;
5276
5277 case 'a': // Address register
5278 case 'd': // Data register (equivalent to 'r')
5279 case 'f': // Floating-point register
5280 Info.setAllowsRegister();
5281 return true;
5282
5283 case 'I': // Unsigned 8-bit constant
5284 case 'J': // Unsigned 12-bit constant
5285 case 'K': // Signed 16-bit constant
5286 case 'L': // Signed 20-bit displacement (on all targets we support)
5287 case 'M': // 0x7fffffff
5288 return true;
5289
5290 case 'Q': // Memory with base and unsigned 12-bit displacement
5291 case 'R': // Likewise, plus an index
5292 case 'S': // Memory with base and signed 20-bit displacement
5293 case 'T': // Likewise, plus an index
5294 Info.setAllowsMemory();
5295 return true;
5296 }
5297}
Ulrich Weigand47445072013-05-06 16:26:41 +00005298}
5299
5300namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005301 class MSP430TargetInfo : public TargetInfo {
5302 static const char * const GCCRegNames[];
5303 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005304 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005305 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005306 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005307 IntWidth = 16; IntAlign = 16;
5308 LongWidth = 32; LongLongWidth = 64;
5309 LongAlign = LongLongAlign = 16;
5310 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005311 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005312 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005313 IntMaxType = SignedLongLong;
5314 UIntMaxType = UnsignedLongLong;
5315 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005316 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005317 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005318 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005319 }
5320 void getTargetDefines(const LangOptions &Opts,
5321 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005322 Builder.defineMacro("MSP430");
5323 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005324 // FIXME: defines for different 'flavours' of MCU
5325 }
Craig Topper3164f332014-03-11 03:39:26 +00005326 void getTargetBuiltins(const Builtin::Info *&Records,
5327 unsigned &NumRecords) const override {
5328 // FIXME: Implement.
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005329 Records = 0;
5330 NumRecords = 0;
5331 }
Craig Topper3164f332014-03-11 03:39:26 +00005332 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005333 return Feature == "msp430";
5334 }
Craig Topper3164f332014-03-11 03:39:26 +00005335 void getGCCRegNames(const char * const *&Names,
5336 unsigned &NumNames) const override;
5337 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5338 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005339 // No aliases.
5340 Aliases = 0;
5341 NumAliases = 0;
5342 }
Craig Topper3164f332014-03-11 03:39:26 +00005343 bool validateAsmConstraint(const char *&Name,
5344 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005345 // No target constraints for now.
5346 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005347 }
Craig Topper3164f332014-03-11 03:39:26 +00005348 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005349 // FIXME: Is this really right?
5350 return "";
5351 }
Craig Topper3164f332014-03-11 03:39:26 +00005352 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005353 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005354 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005355 }
5356 };
5357
5358 const char * const MSP430TargetInfo::GCCRegNames[] = {
5359 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5360 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5361 };
5362
5363 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5364 unsigned &NumNames) const {
5365 Names = GCCRegNames;
5366 NumNames = llvm::array_lengthof(GCCRegNames);
5367 }
5368}
5369
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005370namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005371
Mike Stump11289f42009-09-09 15:08:12 +00005372 // LLVM and Clang cannot be used directly to output native binaries for
5373 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005374 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005375 //
5376 // TCE uses the llvm bitcode as input and uses it for generating customized
5377 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005378 // publicly available in http://tce.cs.tut.fi
5379
Eli Friedman1f191002011-10-07 19:51:42 +00005380 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5381 3, // opencl_global
5382 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005383 5, // opencl_constant
5384 0, // cuda_device
5385 0, // cuda_constant
5386 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005387 };
5388
Eli Friedmana9c3d712009-08-19 20:47:07 +00005389 class TCETargetInfo : public TargetInfo{
5390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005391 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005392 TLSSupported = false;
5393 IntWidth = 32;
5394 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005395 PointerWidth = 32;
5396 IntAlign = 32;
5397 LongAlign = LongLongAlign = 32;
5398 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005399 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005400 SizeType = UnsignedInt;
5401 IntMaxType = SignedLong;
5402 UIntMaxType = UnsignedLong;
5403 IntPtrType = SignedInt;
5404 PtrDiffType = SignedInt;
5405 FloatWidth = 32;
5406 FloatAlign = 32;
5407 DoubleWidth = 32;
5408 DoubleAlign = 32;
5409 LongDoubleWidth = 32;
5410 LongDoubleAlign = 32;
5411 FloatFormat = &llvm::APFloat::IEEEsingle;
5412 DoubleFormat = &llvm::APFloat::IEEEsingle;
5413 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005414 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5415 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005416 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005417 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005418 }
5419
Craig Topper3164f332014-03-11 03:39:26 +00005420 void getTargetDefines(const LangOptions &Opts,
5421 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005422 DefineStd(Builder, "tce", Opts);
5423 Builder.defineMacro("__TCE__");
5424 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005425 }
Craig Topper3164f332014-03-11 03:39:26 +00005426 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005427 return Feature == "tce";
5428 }
Craig Topper3164f332014-03-11 03:39:26 +00005429
5430 void getTargetBuiltins(const Builtin::Info *&Records,
5431 unsigned &NumRecords) const override {}
5432 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005433 return "";
5434 }
Craig Topper3164f332014-03-11 03:39:26 +00005435 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005436 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005437 }
Craig Topper3164f332014-03-11 03:39:26 +00005438 void getGCCRegNames(const char * const *&Names,
5439 unsigned &NumNames) const override {}
5440 bool validateAsmConstraint(const char *&Name,
5441 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005442 return true;
5443 }
Craig Topper3164f332014-03-11 03:39:26 +00005444 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5445 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005446 };
5447}
5448
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005449namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005450class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005451 virtual void setDescriptionString() = 0;
5452
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005453 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005454 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005455 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005456 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005457 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005458 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005459 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005460 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005461 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005462 enum DspRevEnum {
5463 NoDSP, DSP1, DSP2
5464 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005465 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005466
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005467protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005468 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005469 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005470
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005471public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005472 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5473 const std::string &CPUStr)
5474 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005475 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005476 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005477
Craig Topper3164f332014-03-11 03:39:26 +00005478 const char *getABI() const override { return ABI.c_str(); }
5479 bool setABI(const std::string &Name) override = 0;
5480 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00005481 CPU = Name;
5482 return true;
5483 }
Craig Topper3164f332014-03-11 03:39:26 +00005484 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005485 // The backend enables certain ABI's by default according to the
5486 // architecture.
5487 // Disable both possible defaults so that we don't end up with multiple
5488 // ABI's selected and trigger an assertion.
5489 Features["o32"] = false;
5490 Features["n64"] = false;
5491
Eric Christopher0b26a612010-03-02 02:41:08 +00005492 Features[ABI] = true;
5493 Features[CPU] = true;
5494 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005495
Craig Topper3164f332014-03-11 03:39:26 +00005496 void getTargetDefines(const LangOptions &Opts,
5497 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005498 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005499 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005500 if (Opts.GNUMode)
5501 Builder.defineMacro("mips");
5502
Simon Atanasyan683535b2012-08-29 19:14:58 +00005503 Builder.defineMacro("__REGISTER_PREFIX__", "");
5504
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005505 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005506 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005507 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005508 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005509 case SoftFloat:
5510 Builder.defineMacro("__mips_soft_float", Twine(1));
5511 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005512 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005513
Simon Atanasyan16071912013-04-14 14:07:30 +00005514 if (IsSingleFloat)
5515 Builder.defineMacro("__mips_single_float", Twine(1));
5516
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005517 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5518 Builder.defineMacro("_MIPS_FPSET",
5519 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5520
Simon Atanasyan72244b62012-07-05 16:06:06 +00005521 if (IsMips16)
5522 Builder.defineMacro("__mips16", Twine(1));
5523
Simon Atanasyan60777612013-04-14 14:07:51 +00005524 if (IsMicromips)
5525 Builder.defineMacro("__mips_micromips", Twine(1));
5526
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005527 if (IsNan2008)
5528 Builder.defineMacro("__mips_nan2008", Twine(1));
5529
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005530 switch (DspRev) {
5531 default:
5532 break;
5533 case DSP1:
5534 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5535 Builder.defineMacro("__mips_dsp", Twine(1));
5536 break;
5537 case DSP2:
5538 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5539 Builder.defineMacro("__mips_dspr2", Twine(1));
5540 Builder.defineMacro("__mips_dsp", Twine(1));
5541 break;
5542 }
5543
Jack Carter44ff1e52013-08-12 17:20:29 +00005544 if (HasMSA)
5545 Builder.defineMacro("__mips_msa", Twine(1));
5546
Simon Atanasyan26f19672012-04-05 19:28:31 +00005547 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5548 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5549 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005550
5551 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5552 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005553 }
5554
Craig Topper3164f332014-03-11 03:39:26 +00005555 void getTargetBuiltins(const Builtin::Info *&Records,
5556 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005557 Records = BuiltinInfo;
5558 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005559 }
Craig Topper3164f332014-03-11 03:39:26 +00005560 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005561 return llvm::StringSwitch<bool>(Feature)
5562 .Case("mips", true)
5563 .Case("fp64", HasFP64)
5564 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005565 }
Craig Topper3164f332014-03-11 03:39:26 +00005566 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005567 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005568 }
Craig Topper3164f332014-03-11 03:39:26 +00005569 void getGCCRegNames(const char * const *&Names,
5570 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005571 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005572 // CPU register names
5573 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005574 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5575 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5576 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005577 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5578 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005579 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5580 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5581 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5582 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005583 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005584 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005585 "$fcc5","$fcc6","$fcc7",
5586 // MSA register names
5587 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5588 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5589 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5590 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5591 // MSA control register names
5592 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5593 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005594 };
5595 Names = GCCRegNames;
5596 NumNames = llvm::array_lengthof(GCCRegNames);
5597 }
Craig Topper3164f332014-03-11 03:39:26 +00005598 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5599 unsigned &NumAliases) const override = 0;
5600 bool validateAsmConstraint(const char *&Name,
5601 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005602 switch (*Name) {
5603 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005604 return false;
5605
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005606 case 'r': // CPU registers.
5607 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5608 case 'y': // Equivalent to "r", backwards compatibility only.
5609 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005610 case 'c': // $25 for indirect jumps
5611 case 'l': // lo register
5612 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005613 Info.setAllowsRegister();
5614 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005615 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005616 Info.setAllowsMemory();
5617 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005618 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005619 }
5620
Craig Topper3164f332014-03-11 03:39:26 +00005621 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005622 // FIXME: Implement!
5623 return "";
5624 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005625
Craig Topper3164f332014-03-11 03:39:26 +00005626 bool handleTargetFeatures(std::vector<std::string> &Features,
5627 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005628 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005629 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005630 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005631 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005632 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005633 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005634 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005635
5636 for (std::vector<std::string>::iterator it = Features.begin(),
5637 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005638 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005639 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005640 else if (*it == "+soft-float")
5641 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005642 else if (*it == "+mips16")
5643 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005644 else if (*it == "+micromips")
5645 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005646 else if (*it == "+dsp")
5647 DspRev = std::max(DspRev, DSP1);
5648 else if (*it == "+dspr2")
5649 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005650 else if (*it == "+msa")
5651 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005652 else if (*it == "+fp64")
5653 HasFP64 = true;
5654 else if (*it == "-fp64")
5655 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005656 else if (*it == "+nan2008")
5657 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005658 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005659
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005660 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005661 std::vector<std::string>::iterator it =
5662 std::find(Features.begin(), Features.end(), "+soft-float");
5663 if (it != Features.end())
5664 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005665 it = std::find(Features.begin(), Features.end(), "+nan2008");
5666 if (it != Features.end())
5667 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005668
Akira Hatanaka9064e362013-10-29 18:30:33 +00005669 setDescriptionString();
5670
Rafael Espindolaeb265472013-08-21 21:59:03 +00005671 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005672 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005673
Craig Topper3164f332014-03-11 03:39:26 +00005674 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005675 if (RegNo == 0) return 4;
5676 if (RegNo == 1) return 5;
5677 return -1;
5678 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005679};
5680
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005681const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5682#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5683#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5684 ALL_LANGUAGES },
5685#include "clang/Basic/BuiltinsMips.def"
5686};
5687
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005688class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005689public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005690 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005691 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005692 SizeType = UnsignedInt;
5693 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005694 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005695 }
Craig Topper3164f332014-03-11 03:39:26 +00005696 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005697 if ((Name == "o32") || (Name == "eabi")) {
5698 ABI = Name;
5699 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005700 } else if (Name == "32") {
5701 ABI = "o32";
5702 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005703 } else
5704 return false;
5705 }
Craig Topper3164f332014-03-11 03:39:26 +00005706 void getTargetDefines(const LangOptions &Opts,
5707 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005708 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005709
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005710 Builder.defineMacro("__mips", "32");
5711
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005712 if (ABI == "o32") {
5713 Builder.defineMacro("__mips_o32");
5714 Builder.defineMacro("_ABIO32", "1");
5715 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5716 }
5717 else if (ABI == "eabi")
5718 Builder.defineMacro("__mips_eabi");
5719 else
David Blaikie83d382b2011-09-23 05:06:16 +00005720 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005721 }
Craig Topper3164f332014-03-11 03:39:26 +00005722 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5723 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005724 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5725 { { "at" }, "$1" },
5726 { { "v0" }, "$2" },
5727 { { "v1" }, "$3" },
5728 { { "a0" }, "$4" },
5729 { { "a1" }, "$5" },
5730 { { "a2" }, "$6" },
5731 { { "a3" }, "$7" },
5732 { { "t0" }, "$8" },
5733 { { "t1" }, "$9" },
5734 { { "t2" }, "$10" },
5735 { { "t3" }, "$11" },
5736 { { "t4" }, "$12" },
5737 { { "t5" }, "$13" },
5738 { { "t6" }, "$14" },
5739 { { "t7" }, "$15" },
5740 { { "s0" }, "$16" },
5741 { { "s1" }, "$17" },
5742 { { "s2" }, "$18" },
5743 { { "s3" }, "$19" },
5744 { { "s4" }, "$20" },
5745 { { "s5" }, "$21" },
5746 { { "s6" }, "$22" },
5747 { { "s7" }, "$23" },
5748 { { "t8" }, "$24" },
5749 { { "t9" }, "$25" },
5750 { { "k0" }, "$26" },
5751 { { "k1" }, "$27" },
5752 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005753 { { "sp","$sp" }, "$29" },
5754 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005755 { { "ra" }, "$31" }
5756 };
5757 Aliases = GCCRegAliases;
5758 NumAliases = llvm::array_lengthof(GCCRegAliases);
5759 }
5760};
5761
5762class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005763 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005764 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005765 }
5766
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005767public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005768 Mips32EBTargetInfo(const llvm::Triple &Triple)
5769 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005770 }
Craig Topper3164f332014-03-11 03:39:26 +00005771 void getTargetDefines(const LangOptions &Opts,
5772 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005773 DefineStd(Builder, "MIPSEB", Opts);
5774 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005775 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005776 }
5777};
5778
5779class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005780 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005781 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005782 }
5783
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005784public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 Mips32ELTargetInfo(const llvm::Triple &Triple)
5786 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005787 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005788 }
Craig Topper3164f332014-03-11 03:39:26 +00005789 void getTargetDefines(const LangOptions &Opts,
5790 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005791 DefineStd(Builder, "MIPSEL", Opts);
5792 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005793 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005794 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005795};
Akira Hatanakabef17452011-09-20 19:21:49 +00005796
5797class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005798public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005799 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005800 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005801 LongDoubleWidth = LongDoubleAlign = 128;
5802 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005803 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5804 LongDoubleWidth = LongDoubleAlign = 64;
5805 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5806 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005807 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005808 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005809 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005810 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005811
5812 void setN64ABITypes() {
5813 LongWidth = LongAlign = 64;
5814 PointerWidth = PointerAlign = 64;
5815 SizeType = UnsignedLong;
5816 PtrDiffType = SignedLong;
5817 }
5818
5819 void setN32ABITypes() {
5820 LongWidth = LongAlign = 32;
5821 PointerWidth = PointerAlign = 32;
5822 SizeType = UnsignedInt;
5823 PtrDiffType = SignedInt;
5824 }
5825
Craig Topper3164f332014-03-11 03:39:26 +00005826 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005827 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005828 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005829 ABI = Name;
5830 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005831 } else if (Name == "n64" || Name == "64") {
5832 setN64ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005833 ABI = "n64";
5834 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005835 }
5836 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005837 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005838
Craig Topper3164f332014-03-11 03:39:26 +00005839 void getTargetDefines(const LangOptions &Opts,
5840 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005841 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005842
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005843 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005844 Builder.defineMacro("__mips64");
5845 Builder.defineMacro("__mips64__");
5846
Akira Hatanakabef17452011-09-20 19:21:49 +00005847 if (ABI == "n32") {
5848 Builder.defineMacro("__mips_n32");
5849 Builder.defineMacro("_ABIN32", "2");
5850 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5851 }
5852 else if (ABI == "n64") {
5853 Builder.defineMacro("__mips_n64");
5854 Builder.defineMacro("_ABI64", "3");
5855 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5856 }
5857 else
David Blaikie83d382b2011-09-23 05:06:16 +00005858 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005859 }
Craig Topper3164f332014-03-11 03:39:26 +00005860 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5861 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005862 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5863 { { "at" }, "$1" },
5864 { { "v0" }, "$2" },
5865 { { "v1" }, "$3" },
5866 { { "a0" }, "$4" },
5867 { { "a1" }, "$5" },
5868 { { "a2" }, "$6" },
5869 { { "a3" }, "$7" },
5870 { { "a4" }, "$8" },
5871 { { "a5" }, "$9" },
5872 { { "a6" }, "$10" },
5873 { { "a7" }, "$11" },
5874 { { "t0" }, "$12" },
5875 { { "t1" }, "$13" },
5876 { { "t2" }, "$14" },
5877 { { "t3" }, "$15" },
5878 { { "s0" }, "$16" },
5879 { { "s1" }, "$17" },
5880 { { "s2" }, "$18" },
5881 { { "s3" }, "$19" },
5882 { { "s4" }, "$20" },
5883 { { "s5" }, "$21" },
5884 { { "s6" }, "$22" },
5885 { { "s7" }, "$23" },
5886 { { "t8" }, "$24" },
5887 { { "t9" }, "$25" },
5888 { { "k0" }, "$26" },
5889 { { "k1" }, "$27" },
5890 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005891 { { "sp","$sp" }, "$29" },
5892 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005893 { { "ra" }, "$31" }
5894 };
5895 Aliases = GCCRegAliases;
5896 NumAliases = llvm::array_lengthof(GCCRegAliases);
5897 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005898
5899 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005900};
5901
5902class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005903 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005904 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005905 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 +00005906 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005907 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005908
Akira Hatanakabef17452011-09-20 19:21:49 +00005909 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005910
Akira Hatanakabef17452011-09-20 19:21:49 +00005911public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005912 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005913 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005914 void getTargetDefines(const LangOptions &Opts,
5915 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005916 DefineStd(Builder, "MIPSEB", Opts);
5917 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005918 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005919 }
5920};
5921
5922class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005923 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005924 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005925 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 +00005926 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005927 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005928 }
5929public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005930 Mips64ELTargetInfo(const llvm::Triple &Triple)
5931 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005932 // Default ABI is n64.
5933 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005934 }
Craig Topper3164f332014-03-11 03:39:26 +00005935 void getTargetDefines(const LangOptions &Opts,
5936 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005937 DefineStd(Builder, "MIPSEL", Opts);
5938 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005939 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005940 }
5941};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005942} // end anonymous namespace.
5943
Ivan Krasindd7403e2011-08-24 20:22:22 +00005944namespace {
5945class PNaClTargetInfo : public TargetInfo {
5946public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005947 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005948 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005949 this->UserLabelPrefix = "";
5950 this->LongAlign = 32;
5951 this->LongWidth = 32;
5952 this->PointerAlign = 32;
5953 this->PointerWidth = 32;
5954 this->IntMaxType = TargetInfo::SignedLongLong;
5955 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5956 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005957 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005958 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005959 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005960 this->SizeType = TargetInfo::UnsignedInt;
5961 this->PtrDiffType = TargetInfo::SignedInt;
5962 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005963 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005964 }
5965
Craig Topper3164f332014-03-11 03:39:26 +00005966 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005967 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005968 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005969 Builder.defineMacro("__le32__");
5970 Builder.defineMacro("__pnacl__");
5971 }
Craig Topper3164f332014-03-11 03:39:26 +00005972 void getTargetDefines(const LangOptions &Opts,
5973 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005974 getArchDefines(Opts, Builder);
5975 }
Craig Topper3164f332014-03-11 03:39:26 +00005976 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005977 return Feature == "pnacl";
5978 }
Craig Topper3164f332014-03-11 03:39:26 +00005979 void getTargetBuiltins(const Builtin::Info *&Records,
5980 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005981 }
Craig Topper3164f332014-03-11 03:39:26 +00005982 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005983 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005984 }
Craig Topper3164f332014-03-11 03:39:26 +00005985 void getGCCRegNames(const char * const *&Names,
5986 unsigned &NumNames) const override;
5987 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5988 unsigned &NumAliases) const override;
5989 bool validateAsmConstraint(const char *&Name,
5990 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005991 return false;
5992 }
5993
Craig Topper3164f332014-03-11 03:39:26 +00005994 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005995 return "";
5996 }
5997};
5998
5999void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6000 unsigned &NumNames) const {
6001 Names = NULL;
6002 NumNames = 0;
6003}
6004
6005void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6006 unsigned &NumAliases) const {
6007 Aliases = NULL;
6008 NumAliases = 0;
6009}
6010} // end anonymous namespace.
6011
Guy Benyeib798fc92012-12-11 21:38:14 +00006012namespace {
6013 static const unsigned SPIRAddrSpaceMap[] = {
6014 1, // opencl_global
6015 3, // opencl_local
6016 2, // opencl_constant
6017 0, // cuda_device
6018 0, // cuda_constant
6019 0 // cuda_shared
6020 };
6021 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006022 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006023 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006024 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6025 "SPIR target must use unknown OS");
6026 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6027 "SPIR target must use unknown environment type");
6028 BigEndian = false;
6029 TLSSupported = false;
6030 LongWidth = LongAlign = 64;
6031 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006032 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006033 // Define available target features
6034 // These must be defined in sorted order!
6035 NoAsmVariants = true;
6036 }
Craig Topper3164f332014-03-11 03:39:26 +00006037 void getTargetDefines(const LangOptions &Opts,
6038 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006039 DefineStd(Builder, "SPIR", Opts);
6040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006042 return Feature == "spir";
6043 }
Craig Topper3164f332014-03-11 03:39:26 +00006044
6045 void getTargetBuiltins(const Builtin::Info *&Records,
6046 unsigned &NumRecords) const override {}
6047 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006048 return "";
6049 }
Craig Topper3164f332014-03-11 03:39:26 +00006050 void getGCCRegNames(const char * const *&Names,
6051 unsigned &NumNames) const override {}
6052 bool validateAsmConstraint(const char *&Name,
6053 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006054 return true;
6055 }
Craig Topper3164f332014-03-11 03:39:26 +00006056 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6057 unsigned &NumAliases) const override {}
6058 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006059 return TargetInfo::VoidPtrBuiltinVaList;
6060 }
6061 };
6062
6063
6064 class SPIR32TargetInfo : public SPIRTargetInfo {
6065 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006066 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006067 PointerWidth = PointerAlign = 32;
6068 SizeType = TargetInfo::UnsignedInt;
6069 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6070 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006071 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6072 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006073 }
Craig Topper3164f332014-03-11 03:39:26 +00006074 void getTargetDefines(const LangOptions &Opts,
6075 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006076 DefineStd(Builder, "SPIR32", Opts);
6077 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006078 };
6079
6080 class SPIR64TargetInfo : public SPIRTargetInfo {
6081 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006082 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006083 PointerWidth = PointerAlign = 64;
6084 SizeType = TargetInfo::UnsignedLong;
6085 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006086 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6087 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006088 }
Craig Topper3164f332014-03-11 03:39:26 +00006089 void getTargetDefines(const LangOptions &Opts,
6090 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006091 DefineStd(Builder, "SPIR64", Opts);
6092 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006093 };
6094}
6095
Robert Lytton0e076492013-08-13 09:43:10 +00006096namespace {
6097class XCoreTargetInfo : public TargetInfo {
6098 static const Builtin::Info BuiltinInfo[];
6099public:
6100 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6101 BigEndian = false;
6102 NoAsmVariants = true;
6103 LongLongAlign = 32;
6104 SuitableAlign = 32;
6105 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006106 SizeType = UnsignedInt;
6107 PtrDiffType = SignedInt;
6108 IntPtrType = SignedInt;
6109 WCharType = UnsignedChar;
6110 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006111 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006112 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 +00006113 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006114 }
Craig Topper3164f332014-03-11 03:39:26 +00006115 void getTargetDefines(const LangOptions &Opts,
6116 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006117 Builder.defineMacro("__XS1B__");
6118 }
Craig Topper3164f332014-03-11 03:39:26 +00006119 void getTargetBuiltins(const Builtin::Info *&Records,
6120 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006121 Records = BuiltinInfo;
6122 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6123 }
Craig Topper3164f332014-03-11 03:39:26 +00006124 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006125 return TargetInfo::VoidPtrBuiltinVaList;
6126 }
Craig Topper3164f332014-03-11 03:39:26 +00006127 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006128 return "";
6129 }
Craig Topper3164f332014-03-11 03:39:26 +00006130 void getGCCRegNames(const char * const *&Names,
6131 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006132 static const char * const GCCRegNames[] = {
6133 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6134 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6135 };
6136 Names = GCCRegNames;
6137 NumNames = llvm::array_lengthof(GCCRegNames);
6138 }
Craig Topper3164f332014-03-11 03:39:26 +00006139 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6140 unsigned &NumAliases) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006141 Aliases = NULL;
6142 NumAliases = 0;
6143 }
Craig Topper3164f332014-03-11 03:39:26 +00006144 bool validateAsmConstraint(const char *&Name,
6145 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006146 return false;
6147 }
Craig Topper3164f332014-03-11 03:39:26 +00006148 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006149 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6150 return (RegNo < 2)? RegNo : -1;
6151 }
Robert Lytton0e076492013-08-13 09:43:10 +00006152};
6153
6154const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6155#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6156#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6157 ALL_LANGUAGES },
6158#include "clang/Basic/BuiltinsXCore.def"
6159};
6160} // end anonymous namespace.
6161
Ivan Krasindd7403e2011-08-24 20:22:22 +00006162
Chris Lattner5ba61f02006-10-14 07:39:34 +00006163//===----------------------------------------------------------------------===//
6164// Driver code
6165//===----------------------------------------------------------------------===//
6166
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006167static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006168 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006169
Daniel Dunbar52322032009-08-18 05:47:58 +00006170 switch (Triple.getArch()) {
6171 default:
6172 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00006173
Tim Northovera2ee4332014-03-29 15:09:45 +00006174 case llvm::Triple::arm64:
6175 if (Triple.isOSDarwin())
6176 return new DarwinARM64TargetInfo(Triple);
6177
6178 switch (os) {
6179 case llvm::Triple::Linux:
James Molloy5e73df52014-04-16 15:06:20 +00006180 return new LinuxTargetInfo<ARM64leTargetInfo>(Triple);
6181 case llvm::Triple::NetBSD:
6182 return new NetBSDTargetInfo<ARM64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006183 default:
James Molloy5e73df52014-04-16 15:06:20 +00006184 return new ARM64leTargetInfo(Triple);
6185 }
6186
6187 case llvm::Triple::arm64_be:
6188 switch (os) {
6189 case llvm::Triple::Linux:
6190 return new LinuxTargetInfo<ARM64beTargetInfo>(Triple);
6191 case llvm::Triple::NetBSD:
6192 return new NetBSDTargetInfo<ARM64beTargetInfo>(Triple);
6193 default:
6194 return new ARM64beTargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006195 }
6196
Robert Lytton0e076492013-08-13 09:43:10 +00006197 case llvm::Triple::xcore:
6198 return new XCoreTargetInfo(Triple);
6199
Tony Linthicum76329bf2011-12-12 21:14:55 +00006200 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006201 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006202
Tim Northover9bb857a2013-01-31 12:13:10 +00006203 case llvm::Triple::aarch64:
6204 switch (os) {
6205 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006206 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00006207 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006208 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006209 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006210 return new AArch64leTargetInfo(Triple);
6211 }
6212
6213 case llvm::Triple::aarch64_be:
6214 switch (os) {
6215 case llvm::Triple::Linux:
6216 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6217 case llvm::Triple::NetBSD:
6218 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6219 default:
6220 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006221 }
6222
Daniel Dunbar52322032009-08-18 05:47:58 +00006223 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006224 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006225 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006226 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006227
Daniel Dunbar52322032009-08-18 05:47:58 +00006228 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006229 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006230 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006231 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006232 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006233 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006234 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006235 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006236 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006237 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006238 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006239 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006240 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006241 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006242 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006243 case llvm::Triple::Win32:
6244 switch (Triple.getEnvironment()) {
6245 default:
6246 return new ARMleTargetInfo(Triple);
6247 case llvm::Triple::Itanium:
6248 return new ItaniumWindowsARMleTargetInfo(Triple);
6249 case llvm::Triple::MSVC:
6250 return new MicrosoftARMleTargetInfo(Triple);
6251 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006252 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006253 return new ARMleTargetInfo(Triple);
6254 }
6255
6256 case llvm::Triple::armeb:
6257 case llvm::Triple::thumbeb:
6258 if (Triple.isOSDarwin())
6259 return new DarwinARMTargetInfo(Triple);
6260
6261 switch (os) {
6262 case llvm::Triple::Linux:
6263 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6264 case llvm::Triple::FreeBSD:
6265 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6266 case llvm::Triple::NetBSD:
6267 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6268 case llvm::Triple::OpenBSD:
6269 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6270 case llvm::Triple::Bitrig:
6271 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6272 case llvm::Triple::RTEMS:
6273 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6274 case llvm::Triple::NaCl:
6275 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6276 default:
6277 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006278 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006279
Daniel Dunbar52322032009-08-18 05:47:58 +00006280 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006281 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006282
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006283 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006284 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006285 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006286 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006287 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006288 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006289 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006291 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006293 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006295 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006296
6297 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006298 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006299 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006300 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006301 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006302 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006303 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006304 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006305 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006306 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006307 case llvm::Triple::NaCl:
6308 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006309 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006310 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006311 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006312
Akira Hatanakabef17452011-09-20 19:21:49 +00006313 case llvm::Triple::mips64:
6314 switch (os) {
6315 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006316 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006317 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006318 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006319 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006320 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006321 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006322 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006323 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006324 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006325 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006327 }
6328
6329 case llvm::Triple::mips64el:
6330 switch (os) {
6331 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006333 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006334 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006335 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006336 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006337 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006339 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006341 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006343 }
6344
Ivan Krasindd7403e2011-08-24 20:22:22 +00006345 case llvm::Triple::le32:
6346 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006347 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006348 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006349 default:
6350 return NULL;
6351 }
6352
Daniel Dunbar52322032009-08-18 05:47:58 +00006353 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006354 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006355 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006356 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006357 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006359 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006360 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006361 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006363 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006364 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006365 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006367 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006369 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006370
6371 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006372 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006373 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006374 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006375 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006377 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006378 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006379 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006380 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006381 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006383 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006385 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006386
Bill Schmidt778d3872013-07-26 01:36:11 +00006387 case llvm::Triple::ppc64le:
6388 switch (os) {
6389 case llvm::Triple::Linux:
6390 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6391 default:
6392 return new PPC64TargetInfo(Triple);
6393 }
6394
Peter Collingbournec947aae2012-05-20 23:28:41 +00006395 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006397 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006399
Eli Friedmand13b41e2012-10-12 23:32:00 +00006400 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006401 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006402
Daniel Dunbar52322032009-08-18 05:47:58 +00006403 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006404 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006405 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006406 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006407 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006408 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006409 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006410 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006411 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006412 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006413 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006415 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006417 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006419 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006420
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006421 case llvm::Triple::sparcv9:
6422 switch (os) {
6423 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006424 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006425 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006426 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006427 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006428 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006429 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006430 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006431 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006433 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006434 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006435 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006436 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006437 }
6438
Ulrich Weigand47445072013-05-06 16:26:41 +00006439 case llvm::Triple::systemz:
6440 switch (os) {
6441 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006443 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006445 }
6446
Eli Friedmana9c3d712009-08-19 20:47:07 +00006447 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006448 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006449
Daniel Dunbar52322032009-08-18 05:47:58 +00006450 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006451 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006452 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006453
Daniel Dunbar52322032009-08-18 05:47:58 +00006454 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006455 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006456 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006457 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006459 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006461 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006462 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006463 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006465 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006467 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006468 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006469 case llvm::Triple::KFreeBSD:
6470 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006471 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006472 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006473 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006474 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006475 case llvm::Triple::Win32: {
6476 switch (Triple.getEnvironment()) {
6477 default:
6478 return new X86_32TargetInfo(Triple);
6479 case llvm::Triple::Cygnus:
6480 return new CygwinX86_32TargetInfo(Triple);
6481 case llvm::Triple::GNU:
6482 return new MinGWX86_32TargetInfo(Triple);
6483 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006484 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006485 }
6486 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006487 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006488 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006489 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006490 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006491 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006492 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006493 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006494 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006495 }
6496
6497 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006498 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006499 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006500
Daniel Dunbar52322032009-08-18 05:47:58 +00006501 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006502 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006503 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006504 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006505 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006506 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006508 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006510 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006511 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006512 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006513 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006514 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006515 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006516 case llvm::Triple::KFreeBSD:
6517 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006518 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006519 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006520 case llvm::Triple::Win32: {
6521 switch (Triple.getEnvironment()) {
6522 default:
6523 return new X86_64TargetInfo(Triple);
6524 case llvm::Triple::GNU:
6525 return new MinGWX86_64TargetInfo(Triple);
6526 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006527 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006528 }
6529 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006530 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006531 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006532 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006533 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006534 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006535
6536 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006537 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00006539 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006540 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006541 }
6542 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006543 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00006545 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006546 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006547 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006548 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006549}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006550
6551/// CreateTargetInfo - Return the target info object for the specified target
6552/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00006553TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00006554 TargetOptions *Opts) {
6555 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006556
6557 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006558 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006559 if (!Target) {
6560 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
6561 return 0;
6562 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00006563 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006564
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006565 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006566 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6567 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006568 return 0;
6569 }
6570
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006571 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006572 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6573 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006574 return 0;
6575 }
6576
Rafael Espindolaeb265472013-08-21 21:59:03 +00006577 // Set the fp math unit.
6578 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6579 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
6580 return 0;
6581 }
6582
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006583 // Compute the default target features, we need the target to handle this
6584 // because features may have dependencies on one another.
6585 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006586 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006587
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006588 // Apply the user specified deltas.
6589 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6590 I < N; ++I) {
6591 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006592 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006593 bool Enabled = Name[0] == '+';
6594 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006595 }
6596
6597 // Add the features to the compile options.
6598 //
6599 // FIXME: If we are completely confident that we have the right set, we only
6600 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006601 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006602 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6603 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006604 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006605 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00006606 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006607
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006608 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006609}