blob: 84ecd71691b7cdc606a399cacfe17b3f844fd8fb [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.
Craig Topperf1186c52014-05-08 06:41:40 +00001348 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001349 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 {
Craig Topperf1186c52014-05-08 06:41:40 +00001475 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001476 numNames = 0;
1477 }
1478
Craig Topper3164f332014-03-11 03:39:26 +00001479 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1480 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001481 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001482 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 {
Craig Topperf1186c52014-05-08 06:41:40 +00001492 Records = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001493 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 {
Craig Topperf1186c52014-05-08 06:41:40 +00001821 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001822 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
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003787 switch (T.getOS()) {
3788 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003789 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003790 break;
3791 case llvm::Triple::Win32:
3792 WCharType = UnsignedShort;
3793 break;
3794 case llvm::Triple::Linux:
3795 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003796 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3797 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003798 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003799 }
3800
3801 UseBitFieldTypeAlignment = true;
3802
3803 ZeroLengthBitfieldBoundary = 0;
3804
3805 if (IsThumb) {
3806 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3807 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003808 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003809 DescriptionString = BigEndian ?
3810 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3811 "v128:64:128-a:0:32-n32-S64" :
3812 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3813 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003814 } else if (T.isOSWindows()) {
3815 // FIXME: this is invalid for WindowsCE
3816 assert(!BigEndian && "Windows on ARM does not support big endian");
3817 DescriptionString = "e"
3818 "-m:e"
3819 "-p:32:32"
3820 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3821 "-v128:64:128"
3822 "-a:0:32"
3823 "-n32"
3824 "-S64";
3825 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003826 DescriptionString = BigEndian ?
3827 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3828 "v128:64:128-a:0:32-n32-S64" :
3829 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3830 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003831 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003832 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003833 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003834 DescriptionString = BigEndian ?
3835 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3836 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003837 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003838 DescriptionString = BigEndian ?
3839 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3840 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003841 }
3842
3843 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003844 }
3845
3846 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003847 const llvm::Triple &T = getTriple();
3848
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003849 IsAAPCS = false;
3850
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003851 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003852
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003853 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003854 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003855 SizeType = UnsignedInt;
3856 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003857 SizeType = UnsignedLong;
3858
3859 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3860 WCharType = SignedInt;
3861
3862 // Do not respect the alignment of bit-field types when laying out
3863 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3864 UseBitFieldTypeAlignment = false;
3865
3866 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3867 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3868 /// gcc.
3869 ZeroLengthBitfieldBoundary = 32;
3870
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003871 if (IsThumb) {
3872 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3873 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003874 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003875 DescriptionString = BigEndian ?
3876 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3877 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3878 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3879 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003880 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003881 DescriptionString = BigEndian ?
3882 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3883 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3884 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3885 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003886 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003887 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003888 DescriptionString = BigEndian ?
3889 "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 +00003890 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3891 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003892 DescriptionString = BigEndian ?
3893 "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 +00003894 "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 +00003895 }
3896
3897 // FIXME: Override "preferred align" for double and long long.
3898 }
3899
Chris Lattner17df24e2008-04-21 18:56:49 +00003900public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003901 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003902 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3903 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003904 BigEndian = IsBigEndian;
3905
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003906 switch (getTriple().getOS()) {
3907 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003908 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003909 break;
3910 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003911 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003912 break;
3913 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003914
Chris Lattner1a8f3942010-04-23 16:29:58 +00003915 // {} in inline assembly are neon specifiers, not assembly variant
3916 // specifiers.
3917 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003918
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003919 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003920 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003921
3922 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003923
3924 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003925 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003926
3927 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003928 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003929 if (shouldUseInlineAtomic(getTriple()))
3930 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003931
3932 // Do force alignment of members that follow zero length bitfields. If
3933 // the alignment of the zero-length bitfield is greater than the member
3934 // that follows it, `bar', `bar' will be aligned as the type of the
3935 // zero length bitfield.
3936 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003937 }
Craig Topper3164f332014-03-11 03:39:26 +00003938 const char *getABI() const override { return ABI.c_str(); }
3939 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003940 ABI = Name;
3941
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003942 // The defaults (above) are for AAPCS, check if we need to change them.
3943 //
3944 // FIXME: We need support for -meabi... we could just mangle it into the
3945 // name.
3946 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003947 setABIAPCS();
3948 return true;
3949 }
3950 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3951 setABIAAPCS();
3952 return true;
3953 }
3954 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003955 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003956
Craig Topper3164f332014-03-11 03:39:26 +00003957 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003958 if (IsAAPCS)
3959 Features["aapcs"] = true;
3960 else
3961 Features["apcs"] = true;
3962
Silviu Barangae5690462013-10-21 10:59:33 +00003963 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003964 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3965 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003966 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3967 CPU == "cortex-a9-mp") {
3968 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003969 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003970 }
3971 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003972 Features["vfp4"] = true;
3973 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003974 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3975 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3976 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003977 Features["vfp4"] = true;
3978 Features["neon"] = true;
3979 Features["hwdiv"] = true;
3980 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003981 } else if (CPU == "cyclone") {
3982 Features["v8fp"] = true;
3983 Features["neon"] = true;
3984 Features["hwdiv"] = true;
3985 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003986 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3987 Features["fp-armv8"] = true;
3988 Features["neon"] = true;
3989 Features["hwdiv"] = true;
3990 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003991 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003992 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003993 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003994 // Enable the hwdiv extension for all v8a AArch32 cores by
3995 // default.
3996 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003997 ArchName == "armebv8a" || ArchName == "armebv8" ||
3998 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3999 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004000 Features["hwdiv"] = true;
4001 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004002 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
4003 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004004 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004005 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004006
Craig Topper3164f332014-03-11 03:39:26 +00004007 bool handleTargetFeatures(std::vector<std::string> &Features,
4008 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004009 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004010 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004011 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004012 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004013 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004014 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4015 if (Features[i] == "+soft-float")
4016 SoftFloat = true;
4017 else if (Features[i] == "+soft-float-abi")
4018 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004019 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004020 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004021 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004022 FPU |= VFP3FPU;
4023 else if (Features[i] == "+vfp4")
4024 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00004025 else if (Features[i] == "+fp-armv8")
4026 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004027 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004028 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004029 else if (Features[i] == "+hwdiv")
4030 HWDiv |= HWDivThumb;
4031 else if (Features[i] == "+hwdiv-arm")
4032 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00004033 else if (Features[i] == "+crc")
4034 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00004035 else if (Features[i] == "+crypto")
4036 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004037 }
4038
Rafael Espindolaeb265472013-08-21 21:59:03 +00004039 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4040 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4041 return false;
4042 }
4043
4044 if (FPMath == FP_Neon)
4045 Features.push_back("+neonfp");
4046 else if (FPMath == FP_VFP)
4047 Features.push_back("-neonfp");
4048
Daniel Dunbar893d4752009-12-19 04:15:38 +00004049 // Remove front-end specific options which the backend handles differently.
4050 std::vector<std::string>::iterator it;
4051 it = std::find(Features.begin(), Features.end(), "+soft-float");
4052 if (it != Features.end())
4053 Features.erase(it);
4054 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
4055 if (it != Features.end())
4056 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00004057 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004058 }
4059
Craig Topper3164f332014-03-11 03:39:26 +00004060 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004061 return llvm::StringSwitch<bool>(Feature)
4062 .Case("arm", true)
4063 .Case("softfloat", SoftFloat)
4064 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004065 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004066 .Case("hwdiv", HWDiv & HWDivThumb)
4067 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004068 .Default(false);
4069 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004070 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004071 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004072 return llvm::StringSwitch<const char*>(Name)
4073 .Cases("arm8", "arm810", "4")
4074 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
4075 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4076 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4077 .Case("ep9312", "4T")
4078 .Cases("arm10tdmi", "arm1020t", "5T")
4079 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4080 .Case("arm926ej-s", "5TEJ")
4081 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4082 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004083 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004084 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004085 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004086 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004087 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004088 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004089 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004090 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00004091 .Case("cyclone", "8A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004092 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004093 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004094 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00004095 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004096 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004097 static const char *getCPUProfile(StringRef Name) {
4098 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004099 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004100 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004101 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004102 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004103 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004104 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004105 }
Craig Topper3164f332014-03-11 03:39:26 +00004106 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004107 if (!getCPUDefineSuffix(Name))
4108 return false;
4109
4110 CPU = Name;
4111 return true;
4112 }
Craig Topper3164f332014-03-11 03:39:26 +00004113 bool setFPMath(StringRef Name) override;
4114 void getTargetDefines(const LangOptions &Opts,
4115 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004116 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004117 Builder.defineMacro("__arm");
4118 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004119
Chris Lattnerecd49032009-03-02 22:27:17 +00004120 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004121 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004122
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004123 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004124 unsigned int CPUArchVer;
4125 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4126 llvm_unreachable("Invalid char for architecture version number");
4127 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004128 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004129 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4130 StringRef CPUProfile = getCPUProfile(CPU);
4131 if (!CPUProfile.empty())
4132 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004133
Mike Stump9d54bd72009-04-08 02:07:04 +00004134 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004135
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004136 // FIXME: It's more complicated than this and we don't really support
4137 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004138 // Windows on ARM does not "support" interworking
4139 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004140 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004141
David Tweed8f676532012-10-25 13:33:01 +00004142 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004143 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004144 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4145 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004146 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004147 Builder.defineMacro("__ARM_PCS", "1");
4148
David Tweed8f676532012-10-25 13:33:01 +00004149 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004150 Builder.defineMacro("__ARM_PCS_VFP", "1");
4151 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004152
Daniel Dunbar893d4752009-12-19 04:15:38 +00004153 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004154 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004155
4156 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004157 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004158
4159 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004160 Builder.defineMacro("__THUMBEL__");
4161 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004162 // We check both CPUArchVer and ArchName because when only triple is
4163 // specified, the default CPU is arm1136j-s.
4164 StringRef ArchName = getTriple().getArchName();
4165 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4166 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004167 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004168 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004169 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4170 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004171
4172 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004173 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004174
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004175 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004176 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004177 if (FPU & VFP2FPU)
4178 Builder.defineMacro("__ARM_VFPV2__");
4179 if (FPU & VFP3FPU)
4180 Builder.defineMacro("__ARM_VFPV3__");
4181 if (FPU & VFP4FPU)
4182 Builder.defineMacro("__ARM_VFPV4__");
4183 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004184
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004185 // This only gets set when Neon instructions are actually available, unlike
4186 // the VFP define, hence the soft float and arch check. This is subtly
4187 // different from gcc, we follow the intent which was that it should be set
4188 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004189 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4190 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004191 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004192 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004193
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004194 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4195 Opts.ShortWChar ? "2" : "4");
4196
4197 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4198 Opts.ShortEnums ? "1" : "4");
4199
Bernard Ogden18b57012013-10-29 09:47:51 +00004200 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004201 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004202
Tim Northover02e38602014-02-03 17:28:04 +00004203 if (Crypto)
4204 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4205
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004206 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004207 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4208 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4209 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4210 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4211 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004212 }
Craig Topper3164f332014-03-11 03:39:26 +00004213 void getTargetBuiltins(const Builtin::Info *&Records,
4214 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004215 Records = BuiltinInfo;
4216 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004217 }
Craig Topper3164f332014-03-11 03:39:26 +00004218 bool isCLZForZeroUndef() const override { return false; }
4219 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004220 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004221 }
Craig Topper3164f332014-03-11 03:39:26 +00004222 void getGCCRegNames(const char * const *&Names,
4223 unsigned &NumNames) const override;
4224 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4225 unsigned &NumAliases) const override;
4226 bool validateAsmConstraint(const char *&Name,
4227 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004228 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004229 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004230 case 'l': // r0-r7
4231 case 'h': // r8-r15
4232 case 'w': // VFP Floating point register single precision
4233 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004234 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004235 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004236 case 'Q': // A memory address that is a single base register.
4237 Info.setAllowsMemory();
4238 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004239 case 'U': // a memory reference...
4240 switch (Name[1]) {
4241 case 'q': // ...ARMV4 ldrsb
4242 case 'v': // ...VFP load/store (reg+constant offset)
4243 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004244 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004245 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004246 case 'n': // valid address for Neon doubleword vector load/store
4247 case 'm': // valid address for Neon element and structure load/store
4248 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004249 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004250 Info.setAllowsMemory();
4251 Name++;
4252 return true;
4253 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004254 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004255 return false;
4256 }
Craig Topper3164f332014-03-11 03:39:26 +00004257 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004258 std::string R;
4259 switch (*Constraint) {
4260 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004261 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004262 Constraint++;
4263 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004264 case 'p': // 'p' should be translated to 'r' by default.
4265 R = std::string("r");
4266 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004267 default:
4268 return std::string(1, *Constraint);
4269 }
4270 return R;
4271 }
Craig Topper3164f332014-03-11 03:39:26 +00004272 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4273 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004274 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004275 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004276
Bill Wendling9d1ee112012-10-25 23:28:48 +00004277 // Strip off constraint modifiers.
4278 while (Constraint[0] == '=' ||
4279 Constraint[0] == '+' ||
4280 Constraint[0] == '&')
4281 Constraint = Constraint.substr(1);
4282
4283 switch (Constraint[0]) {
4284 default: break;
4285 case 'r': {
4286 switch (Modifier) {
4287 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004288 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004289 case 'q':
4290 // A register of size 32 cannot fit a vector type.
4291 return false;
4292 }
4293 }
4294 }
4295
4296 return true;
4297 }
Craig Topper3164f332014-03-11 03:39:26 +00004298 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004299 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004300 return "";
4301 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004302
Craig Topper3164f332014-03-11 03:39:26 +00004303 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004304 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4305 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004306
Craig Topper3164f332014-03-11 03:39:26 +00004307 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004308 if (RegNo == 0) return 0;
4309 if (RegNo == 1) return 1;
4310 return -1;
4311 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004312};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004313
Rafael Espindolaeb265472013-08-21 21:59:03 +00004314bool ARMTargetInfo::setFPMath(StringRef Name) {
4315 if (Name == "neon") {
4316 FPMath = FP_Neon;
4317 return true;
4318 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4319 Name == "vfp4") {
4320 FPMath = FP_VFP;
4321 return true;
4322 }
4323 return false;
4324}
4325
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004326const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004327 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004328 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004329 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4330
4331 // Float registers
4332 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4333 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4334 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004335 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004336
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004337 // Double registers
4338 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4339 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004340 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4341 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004342
4343 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004344 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4345 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004346};
4347
4348void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004349 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004350 Names = GCCRegNames;
4351 NumNames = llvm::array_lengthof(GCCRegNames);
4352}
4353
4354const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004355 { { "a1" }, "r0" },
4356 { { "a2" }, "r1" },
4357 { { "a3" }, "r2" },
4358 { { "a4" }, "r3" },
4359 { { "v1" }, "r4" },
4360 { { "v2" }, "r5" },
4361 { { "v3" }, "r6" },
4362 { { "v4" }, "r7" },
4363 { { "v5" }, "r8" },
4364 { { "v6", "rfp" }, "r9" },
4365 { { "sl" }, "r10" },
4366 { { "fp" }, "r11" },
4367 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004368 { { "r13" }, "sp" },
4369 { { "r14" }, "lr" },
4370 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004371 // The S, D and Q registers overlap, but aren't really aliases; we
4372 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004373};
4374
4375void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4376 unsigned &NumAliases) const {
4377 Aliases = GCCRegAliases;
4378 NumAliases = llvm::array_lengthof(GCCRegAliases);
4379}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004380
4381const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004382#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004383#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004384 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004385#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004386
4387#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4388#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4389 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004390#include "clang/Basic/BuiltinsARM.def"
4391};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004392
4393class ARMleTargetInfo : public ARMTargetInfo {
4394public:
4395 ARMleTargetInfo(const llvm::Triple &Triple)
4396 : ARMTargetInfo(Triple, false) { }
4397 virtual void getTargetDefines(const LangOptions &Opts,
4398 MacroBuilder &Builder) const {
4399 Builder.defineMacro("__ARMEL__");
4400 ARMTargetInfo::getTargetDefines(Opts, Builder);
4401 }
4402};
4403
4404class ARMbeTargetInfo : public ARMTargetInfo {
4405public:
4406 ARMbeTargetInfo(const llvm::Triple &Triple)
4407 : ARMTargetInfo(Triple, true) { }
4408 virtual void getTargetDefines(const LangOptions &Opts,
4409 MacroBuilder &Builder) const {
4410 Builder.defineMacro("__ARMEB__");
4411 Builder.defineMacro("__ARM_BIG_ENDIAN");
4412 ARMTargetInfo::getTargetDefines(Opts, Builder);
4413 }
4414};
Chris Lattner17df24e2008-04-21 18:56:49 +00004415} // end anonymous namespace.
4416
Eli Friedmanf05b7722008-08-20 07:44:10 +00004417namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004418class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4419 const llvm::Triple Triple;
4420public:
4421 WindowsARMTargetInfo(const llvm::Triple &Triple)
4422 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4423 TLSSupported = false;
4424 WCharType = UnsignedShort;
4425 SizeType = UnsignedInt;
4426 UserLabelPrefix = "";
4427 }
4428 void getVisualStudioDefines(const LangOptions &Opts,
4429 MacroBuilder &Builder) const {
4430 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4431
4432 // FIXME: this is invalid for WindowsCE
4433 Builder.defineMacro("_M_ARM_NT", "1");
4434 Builder.defineMacro("_M_ARMT", "_M_ARM");
4435 Builder.defineMacro("_M_THUMB", "_M_ARM");
4436
4437 assert((Triple.getArch() == llvm::Triple::arm ||
4438 Triple.getArch() == llvm::Triple::thumb) &&
4439 "invalid architecture for Windows ARM target info");
4440 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4441 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4442
4443 // TODO map the complete set of values
4444 // 31: VFPv3 40: VFPv4
4445 Builder.defineMacro("_M_ARM_FP", "31");
4446 }
4447};
4448
4449// Windows ARM + Itanium C++ ABI Target
4450class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4451public:
4452 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4453 : WindowsARMTargetInfo(Triple) {
4454 TheCXXABI.set(TargetCXXABI::GenericARM);
4455 }
4456
4457 void getTargetDefines(const LangOptions &Opts,
4458 MacroBuilder &Builder) const override {
4459 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4460
4461 if (Opts.MSVCCompat)
4462 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4463 }
4464};
4465
4466// Windows ARM, MS (C++) ABI
4467class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4468public:
4469 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4470 : WindowsARMTargetInfo(Triple) {
4471 TheCXXABI.set(TargetCXXABI::Microsoft);
4472 }
4473
4474 void getTargetDefines(const LangOptions &Opts,
4475 MacroBuilder &Builder) const override {
4476 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4477 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4478 }
4479};
4480}
4481
4482
4483namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004484class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004485 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004486protected:
Craig Topper3164f332014-03-11 03:39:26 +00004487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4488 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004489 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004490 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004491
Torok Edwinb2b37c62009-06-30 17:10:35 +00004492public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004493 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004494 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004495 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004496 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004497 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004498 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004499
4500 // Darwin on iOS uses a variant of the ARM C++ ABI.
4501 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004502 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004503};
4504} // end anonymous namespace.
4505
Tony Linthicum76329bf2011-12-12 21:14:55 +00004506
4507namespace {
Tim Northovera2ee4332014-03-29 15:09:45 +00004508class ARM64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004509 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004510 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4511 static const char *const GCCRegNames[];
4512
James Molloy75f5f9e2014-04-16 15:33:48 +00004513 enum FPUModeEnum {
4514 FPUMode,
4515 NeonMode
4516 };
4517
4518 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004519 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004520 unsigned Crypto;
4521
Tim Northovera2ee4332014-03-29 15:09:45 +00004522 static const Builtin::Info BuiltinInfo[];
4523
4524 std::string ABI;
4525
4526public:
4527 ARM64TargetInfo(const llvm::Triple &Triple)
4528 : TargetInfo(Triple), ABI("aapcs") {
Tim Northovera2ee4332014-03-29 15:09:45 +00004529 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4530 IntMaxType = SignedLong;
4531 UIntMaxType = UnsignedLong;
4532 Int64Type = SignedLong;
4533 WCharType = UnsignedInt;
4534 MaxVectorAlign = 128;
4535 RegParmMax = 8;
4536 MaxAtomicInlineWidth = 128;
4537 MaxAtomicPromoteWidth = 128;
4538
4539 LongDoubleWidth = LongDoubleAlign = 128;
4540 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4541
Tim Northovera2ee4332014-03-29 15:09:45 +00004542 // {} in inline assembly are neon specifiers, not assembly variant
4543 // specifiers.
4544 NoAsmVariants = true;
4545
4546 // ARM64 targets default to using the ARM C++ ABI.
4547 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4548 }
4549
4550 virtual const char *getABI() const { return ABI.c_str(); }
4551 virtual bool setABI(const std::string &Name) {
4552 if (Name != "aapcs" && Name != "darwinpcs")
4553 return false;
4554
4555 ABI = Name;
4556 return true;
4557 }
4558
4559 virtual bool setCPU(const std::string &Name) {
4560 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004561 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004562 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004563 .Case("cyclone", true)
4564 .Default(false);
4565 return CPUKnown;
4566 }
4567
4568 virtual void getTargetDefines(const LangOptions &Opts,
4569 MacroBuilder &Builder) const {
4570 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004571 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004572
4573 // Target properties.
4574 Builder.defineMacro("_LP64");
4575 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004576
4577 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4578 Builder.defineMacro("__ARM_ACLE", "200");
4579 Builder.defineMacro("__ARM_ARCH", "8");
4580 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4581
4582 Builder.defineMacro("__ARM_64BIT_STATE");
4583 Builder.defineMacro("__ARM_PCS_AAPCS64");
4584 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4585
4586 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4587 Builder.defineMacro("__ARM_FEATURE_CLZ");
4588 Builder.defineMacro("__ARM_FEATURE_FMA");
4589 Builder.defineMacro("__ARM_FEATURE_DIV");
4590
4591 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4592
4593 // 0xe implies support for half, single and double precision operations.
4594 Builder.defineMacro("__ARM_FP", "0xe");
4595
4596 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4597 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4598 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4599
4600 if (Opts.FastMath || Opts.FiniteMathOnly)
4601 Builder.defineMacro("__ARM_FP_FAST");
4602
4603 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4604 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4605
4606 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4607
4608 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4609 Opts.ShortEnums ? "1" : "4");
4610
James Molloy75f5f9e2014-04-16 15:33:48 +00004611 if (FPU == NeonMode) {
4612 Builder.defineMacro("__ARM_NEON");
4613 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004614 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004615 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004616
Bradley Smith418c5932014-05-02 15:17:51 +00004617 if (CRC)
4618 Builder.defineMacro("__ARM_FEATURE_CRC32");
4619
James Molloy75f5f9e2014-04-16 15:33:48 +00004620 if (Crypto)
4621 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004622 }
4623
4624 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4625 unsigned &NumRecords) const {
4626 Records = BuiltinInfo;
4627 NumRecords = clang::ARM64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4628 }
4629
4630 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004631 return Feature == "aarch64" ||
4632 Feature == "arm64" ||
4633 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 }
4635
James Molloy5e73df52014-04-16 15:06:20 +00004636 bool handleTargetFeatures(std::vector<std::string> &Features,
4637 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004638 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004639 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004640 Crypto = 0;
4641 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4642 if (Features[i] == "+neon")
4643 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004644 if (Features[i] == "+crc")
4645 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004646 if (Features[i] == "+crypto")
4647 Crypto = 1;
4648 }
4649
James Molloy5e73df52014-04-16 15:06:20 +00004650 setDescriptionString();
4651
4652 return true;
4653 }
4654
Tim Northovera2ee4332014-03-29 15:09:45 +00004655 virtual bool isCLZForZeroUndef() const { return false; }
4656
4657 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4658 return TargetInfo::AArch64ABIBuiltinVaList;
4659 }
4660
4661 virtual void getGCCRegNames(const char *const *&Names,
4662 unsigned &NumNames) const;
4663 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4664 unsigned &NumAliases) const;
4665
4666 virtual bool validateAsmConstraint(const char *&Name,
4667 TargetInfo::ConstraintInfo &Info) const {
4668 switch (*Name) {
4669 default:
4670 return false;
4671 case 'w': // Floating point and SIMD registers (V0-V31)
4672 Info.setAllowsRegister();
4673 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004674 case 'I': // Constant that can be used with an ADD instruction
4675 case 'J': // Constant that can be used with a SUB instruction
4676 case 'K': // Constant that can be used with a 32-bit logical instruction
4677 case 'L': // Constant that can be used with a 64-bit logical instruction
4678 case 'M': // Constant that can be used as a 32-bit MOV immediate
4679 case 'N': // Constant that can be used as a 64-bit MOV immediate
4680 case 'Y': // Floating point constant zero
4681 case 'Z': // Integer constant zero
4682 return true;
4683 case 'Q': // A memory reference with base register and no offset
4684 Info.setAllowsMemory();
4685 return true;
4686 case 'S': // A symbolic address
4687 Info.setAllowsRegister();
4688 return true;
4689 case 'U':
4690 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4691 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4692 // Usa: An absolute symbolic address
4693 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4694 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004695 case 'z': // Zero register, wzr or xzr
4696 Info.setAllowsRegister();
4697 return true;
4698 case 'x': // Floating point and SIMD registers (V0-V15)
4699 Info.setAllowsRegister();
4700 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004701 }
4702 return false;
4703 }
4704
Tim Northovera2ee4332014-03-29 15:09:45 +00004705 virtual const char *getClobbers() const { return ""; }
4706
4707 int getEHDataRegisterNumber(unsigned RegNo) const {
4708 if (RegNo == 0)
4709 return 0;
4710 if (RegNo == 1)
4711 return 1;
4712 return -1;
4713 }
4714};
4715
4716const char *const ARM64TargetInfo::GCCRegNames[] = {
4717 // 32-bit Integer registers
4718 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4719 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4720 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4721
4722 // 64-bit Integer registers
4723 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4724 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4725 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4726
4727 // 32-bit floating point regsisters
4728 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4729 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4730 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4731
4732 // 64-bit floating point regsisters
4733 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4734 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4735 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4736
4737 // Vector registers
4738 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4739 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4740 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4741};
4742
4743void ARM64TargetInfo::getGCCRegNames(const char *const *&Names,
4744 unsigned &NumNames) const {
4745 Names = GCCRegNames;
4746 NumNames = llvm::array_lengthof(GCCRegNames);
4747}
4748
4749const TargetInfo::GCCRegAlias ARM64TargetInfo::GCCRegAliases[] = {
4750 { { "w31" }, "wsp" },
4751 { { "x29" }, "fp" },
4752 { { "x30" }, "lr" },
4753 { { "x31" }, "sp" },
4754 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4755 // don't want to substitute one of these for a different-sized one.
4756};
4757
4758void ARM64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4759 unsigned &NumAliases) const {
4760 Aliases = GCCRegAliases;
4761 NumAliases = llvm::array_lengthof(GCCRegAliases);
4762}
4763
4764const Builtin::Info ARM64TargetInfo::BuiltinInfo[] = {
4765#define BUILTIN(ID, TYPE, ATTRS) \
4766 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4767#include "clang/Basic/BuiltinsNEON.def"
4768
4769#define BUILTIN(ID, TYPE, ATTRS) \
4770 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4771#include "clang/Basic/BuiltinsARM64.def"
4772};
James Molloy5e73df52014-04-16 15:06:20 +00004773
4774class ARM64leTargetInfo : public ARM64TargetInfo {
4775 void setDescriptionString() override {
4776 if (getTriple().isOSBinFormatMachO())
4777 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4778 else
4779 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4780 }
4781
4782public:
4783 ARM64leTargetInfo(const llvm::Triple &Triple)
4784 : ARM64TargetInfo(Triple) {
4785 BigEndian = false;
4786 }
4787 void getTargetDefines(const LangOptions &Opts,
4788 MacroBuilder &Builder) const override {
4789 Builder.defineMacro("__AARCH64EL__");
4790 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4791 }
4792};
4793
4794class ARM64beTargetInfo : public ARM64TargetInfo {
4795 void setDescriptionString() override {
4796 assert(!getTriple().isOSBinFormatMachO());
4797 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4798 }
4799
4800public:
4801 ARM64beTargetInfo(const llvm::Triple &Triple)
4802 : ARM64TargetInfo(Triple) { }
4803 void getTargetDefines(const LangOptions &Opts,
4804 MacroBuilder &Builder) const override {
4805 Builder.defineMacro("__AARCH64EB__");
4806 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4807 Builder.defineMacro("__ARM_BIG_ENDIAN");
4808 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4809 }
4810};
Tim Northovera2ee4332014-03-29 15:09:45 +00004811} // end anonymous namespace.
4812
4813namespace {
James Molloy5e73df52014-04-16 15:06:20 +00004814class DarwinARM64TargetInfo : public DarwinTargetInfo<ARM64leTargetInfo> {
4815protected:
4816 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4817 MacroBuilder &Builder) const override {
4818 Builder.defineMacro("__AARCH64_SIMD__");
4819 Builder.defineMacro("__ARM64_ARCH_8__");
4820 Builder.defineMacro("__ARM_NEON__");
4821 Builder.defineMacro("__LITTLE_ENDIAN__");
4822 Builder.defineMacro("__REGISTER_PREFIX__", "");
4823 Builder.defineMacro("__arm64", "1");
4824 Builder.defineMacro("__arm64__", "1");
4825
4826 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4827 }
4828
Tim Northovera2ee4332014-03-29 15:09:45 +00004829public:
4830 DarwinARM64TargetInfo(const llvm::Triple &Triple)
James Molloy5e73df52014-04-16 15:06:20 +00004831 : DarwinTargetInfo<ARM64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004832 Int64Type = SignedLongLong;
4833 WCharType = SignedInt;
4834 UseSignedCharForObjCBool = false;
4835
4836 LongDoubleWidth = LongDoubleAlign = 64;
4837 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4838
4839 TheCXXABI.set(TargetCXXABI::iOS64);
4840 }
4841
4842 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4843 return TargetInfo::CharPtrBuiltinVaList;
4844 }
4845};
4846} // end anonymous namespace
4847
4848namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004849// Hexagon abstract base class
4850class HexagonTargetInfo : public TargetInfo {
4851 static const Builtin::Info BuiltinInfo[];
4852 static const char * const GCCRegNames[];
4853 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4854 std::string CPU;
4855public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004856 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004857 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004858 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004859
4860 // {} in inline assembly are packet specifiers, not assembly variant
4861 // specifiers.
4862 NoAsmVariants = true;
4863 }
4864
Craig Topper3164f332014-03-11 03:39:26 +00004865 void getTargetBuiltins(const Builtin::Info *&Records,
4866 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004867 Records = BuiltinInfo;
4868 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4869 }
4870
Craig Topper3164f332014-03-11 03:39:26 +00004871 bool validateAsmConstraint(const char *&Name,
4872 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004873 return true;
4874 }
4875
Craig Topper3164f332014-03-11 03:39:26 +00004876 void getTargetDefines(const LangOptions &Opts,
4877 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004878
Craig Topper3164f332014-03-11 03:39:26 +00004879 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004880 return Feature == "hexagon";
4881 }
Craig Topper3164f332014-03-11 03:39:26 +00004882
4883 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004884 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004885 }
Craig Topper3164f332014-03-11 03:39:26 +00004886 void getGCCRegNames(const char * const *&Names,
4887 unsigned &NumNames) const override;
4888 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4889 unsigned &NumAliases) const override;
4890 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004891 return "";
4892 }
Sebastian Pop86500282012-01-13 20:37:10 +00004893
4894 static const char *getHexagonCPUSuffix(StringRef Name) {
4895 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004896 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004897 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004898 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004899 }
4900
Craig Topper3164f332014-03-11 03:39:26 +00004901 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004902 if (!getHexagonCPUSuffix(Name))
4903 return false;
4904
Tony Linthicum76329bf2011-12-12 21:14:55 +00004905 CPU = Name;
4906 return true;
4907 }
4908};
4909
4910void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4911 MacroBuilder &Builder) const {
4912 Builder.defineMacro("qdsp6");
4913 Builder.defineMacro("__qdsp6", "1");
4914 Builder.defineMacro("__qdsp6__", "1");
4915
4916 Builder.defineMacro("hexagon");
4917 Builder.defineMacro("__hexagon", "1");
4918 Builder.defineMacro("__hexagon__", "1");
4919
4920 if(CPU == "hexagonv1") {
4921 Builder.defineMacro("__HEXAGON_V1__");
4922 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4923 if(Opts.HexagonQdsp6Compat) {
4924 Builder.defineMacro("__QDSP6_V1__");
4925 Builder.defineMacro("__QDSP6_ARCH__", "1");
4926 }
4927 }
4928 else if(CPU == "hexagonv2") {
4929 Builder.defineMacro("__HEXAGON_V2__");
4930 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4931 if(Opts.HexagonQdsp6Compat) {
4932 Builder.defineMacro("__QDSP6_V2__");
4933 Builder.defineMacro("__QDSP6_ARCH__", "2");
4934 }
4935 }
4936 else if(CPU == "hexagonv3") {
4937 Builder.defineMacro("__HEXAGON_V3__");
4938 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4939 if(Opts.HexagonQdsp6Compat) {
4940 Builder.defineMacro("__QDSP6_V3__");
4941 Builder.defineMacro("__QDSP6_ARCH__", "3");
4942 }
4943 }
4944 else if(CPU == "hexagonv4") {
4945 Builder.defineMacro("__HEXAGON_V4__");
4946 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4947 if(Opts.HexagonQdsp6Compat) {
4948 Builder.defineMacro("__QDSP6_V4__");
4949 Builder.defineMacro("__QDSP6_ARCH__", "4");
4950 }
4951 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004952 else if(CPU == "hexagonv5") {
4953 Builder.defineMacro("__HEXAGON_V5__");
4954 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4955 if(Opts.HexagonQdsp6Compat) {
4956 Builder.defineMacro("__QDSP6_V5__");
4957 Builder.defineMacro("__QDSP6_ARCH__", "5");
4958 }
4959 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004960}
4961
4962const char * const HexagonTargetInfo::GCCRegNames[] = {
4963 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4964 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4965 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4966 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4967 "p0", "p1", "p2", "p3",
4968 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4969};
4970
4971void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4972 unsigned &NumNames) const {
4973 Names = GCCRegNames;
4974 NumNames = llvm::array_lengthof(GCCRegNames);
4975}
4976
4977
4978const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4979 { { "sp" }, "r29" },
4980 { { "fp" }, "r30" },
4981 { { "lr" }, "r31" },
4982 };
4983
4984void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4985 unsigned &NumAliases) const {
4986 Aliases = GCCRegAliases;
4987 NumAliases = llvm::array_lengthof(GCCRegAliases);
4988}
4989
4990
4991const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4992#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4993#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4994 ALL_LANGUAGES },
4995#include "clang/Basic/BuiltinsHexagon.def"
4996};
4997}
4998
4999
Chris Lattner5ba61f02006-10-14 07:39:34 +00005000namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005001// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5002class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005003 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5004 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005005 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005006public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005007 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005008
Craig Topper3164f332014-03-11 03:39:26 +00005009 bool handleTargetFeatures(std::vector<std::string> &Features,
5010 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005011 SoftFloat = false;
5012 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5013 if (Features[i] == "+soft-float")
5014 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005015 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005016 }
Craig Topper3164f332014-03-11 03:39:26 +00005017 void getTargetDefines(const LangOptions &Opts,
5018 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005019 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005020 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005021
5022 if (SoftFloat)
5023 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005024 }
Craig Topper3164f332014-03-11 03:39:26 +00005025
5026 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005027 return llvm::StringSwitch<bool>(Feature)
5028 .Case("softfloat", SoftFloat)
5029 .Case("sparc", true)
5030 .Default(false);
5031 }
Craig Topper3164f332014-03-11 03:39:26 +00005032
5033 void getTargetBuiltins(const Builtin::Info *&Records,
5034 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005035 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005036 }
Craig Topper3164f332014-03-11 03:39:26 +00005037 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005038 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005039 }
Craig Topper3164f332014-03-11 03:39:26 +00005040 void getGCCRegNames(const char * const *&Names,
5041 unsigned &NumNames) const override;
5042 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5043 unsigned &NumAliases) const override;
5044 bool validateAsmConstraint(const char *&Name,
5045 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005046 // FIXME: Implement!
5047 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005048 }
Craig Topper3164f332014-03-11 03:39:26 +00005049 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005050 // FIXME: Implement!
5051 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005052 }
5053};
5054
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005055const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005056 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5057 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5058 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5059 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5060};
5061
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005062void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5063 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005064 Names = GCCRegNames;
5065 NumNames = llvm::array_lengthof(GCCRegNames);
5066}
5067
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005068const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005069 { { "g0" }, "r0" },
5070 { { "g1" }, "r1" },
5071 { { "g2" }, "r2" },
5072 { { "g3" }, "r3" },
5073 { { "g4" }, "r4" },
5074 { { "g5" }, "r5" },
5075 { { "g6" }, "r6" },
5076 { { "g7" }, "r7" },
5077 { { "o0" }, "r8" },
5078 { { "o1" }, "r9" },
5079 { { "o2" }, "r10" },
5080 { { "o3" }, "r11" },
5081 { { "o4" }, "r12" },
5082 { { "o5" }, "r13" },
5083 { { "o6", "sp" }, "r14" },
5084 { { "o7" }, "r15" },
5085 { { "l0" }, "r16" },
5086 { { "l1" }, "r17" },
5087 { { "l2" }, "r18" },
5088 { { "l3" }, "r19" },
5089 { { "l4" }, "r20" },
5090 { { "l5" }, "r21" },
5091 { { "l6" }, "r22" },
5092 { { "l7" }, "r23" },
5093 { { "i0" }, "r24" },
5094 { { "i1" }, "r25" },
5095 { { "i2" }, "r26" },
5096 { { "i3" }, "r27" },
5097 { { "i4" }, "r28" },
5098 { { "i5" }, "r29" },
5099 { { "i6", "fp" }, "r30" },
5100 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005101};
5102
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005103void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5104 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005105 Aliases = GCCRegAliases;
5106 NumAliases = llvm::array_lengthof(GCCRegAliases);
5107}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005108
5109// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5110class SparcV8TargetInfo : public SparcTargetInfo {
5111public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005112 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005113 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005114 }
5115
Craig Topper3164f332014-03-11 03:39:26 +00005116 void getTargetDefines(const LangOptions &Opts,
5117 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005118 SparcTargetInfo::getTargetDefines(Opts, Builder);
5119 Builder.defineMacro("__sparcv8");
5120 }
5121};
5122
5123// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5124class SparcV9TargetInfo : public SparcTargetInfo {
5125public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005126 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005127 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005128 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005129 // This is an LP64 platform.
5130 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005131
5132 // OpenBSD uses long long for int64_t and intmax_t.
5133 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
5134 IntMaxType = SignedLongLong;
5135 UIntMaxType = UnsignedLongLong;
5136 } else {
5137 IntMaxType = SignedLong;
5138 UIntMaxType = UnsignedLong;
5139 }
5140 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005141
5142 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5143 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5144 LongDoubleWidth = 128;
5145 LongDoubleAlign = 128;
5146 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005147 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005148 }
5149
Craig Topper3164f332014-03-11 03:39:26 +00005150 void getTargetDefines(const LangOptions &Opts,
5151 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005152 SparcTargetInfo::getTargetDefines(Opts, Builder);
5153 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005154 Builder.defineMacro("__arch64__");
5155 // Solaris and its derivative AuroraUX don't need these variants, but the
5156 // BSDs do.
5157 if (getTriple().getOS() != llvm::Triple::Solaris &&
5158 getTriple().getOS() != llvm::Triple::AuroraUX) {
5159 Builder.defineMacro("__sparc64__");
5160 Builder.defineMacro("__sparc_v9__");
5161 Builder.defineMacro("__sparcv9__");
5162 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005163 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005164
Craig Topper3164f332014-03-11 03:39:26 +00005165 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005166 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5167 .Case("v9", true)
5168 .Case("ultrasparc", true)
5169 .Case("ultrasparc3", true)
5170 .Case("niagara", true)
5171 .Case("niagara2", true)
5172 .Case("niagara3", true)
5173 .Case("niagara4", true)
5174 .Default(false);
5175
5176 // No need to store the CPU yet. There aren't any CPU-specific
5177 // macros to define.
5178 return CPUKnown;
5179 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005180};
5181
Gabor Greif49991682008-02-21 16:29:08 +00005182} // end anonymous namespace.
5183
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005184namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005185class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5186public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005187 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5188 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005189 SizeType = UnsignedInt;
5190 PtrDiffType = SignedInt;
5191 }
5192};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005193class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005195 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5196 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005197 SizeType = UnsignedInt;
5198 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005199 }
5200};
5201} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005202
Chris Lattnerb781dc792008-05-08 05:58:21 +00005203namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005204class SystemZTargetInfo : public TargetInfo {
5205 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005206
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005207public:
5208 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5209 TLSSupported = true;
5210 IntWidth = IntAlign = 32;
5211 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5212 PointerWidth = PointerAlign = 64;
5213 LongDoubleWidth = 128;
5214 LongDoubleAlign = 64;
5215 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5216 MinGlobalAlign = 16;
5217 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5218 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5219 }
5220 void getTargetDefines(const LangOptions &Opts,
5221 MacroBuilder &Builder) const override {
5222 Builder.defineMacro("__s390__");
5223 Builder.defineMacro("__s390x__");
5224 Builder.defineMacro("__zarch__");
5225 Builder.defineMacro("__LONG_DOUBLE_128__");
5226 }
5227 void getTargetBuiltins(const Builtin::Info *&Records,
5228 unsigned &NumRecords) const override {
5229 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005230 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005231 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005232 }
5233
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005234 void getGCCRegNames(const char *const *&Names,
5235 unsigned &NumNames) const override;
5236 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5237 unsigned &NumAliases) const override {
5238 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005239 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005240 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005241 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005242 bool validateAsmConstraint(const char *&Name,
5243 TargetInfo::ConstraintInfo &info) const override;
5244 const char *getClobbers() const override {
5245 // FIXME: Is this really right?
5246 return "";
5247 }
5248 BuiltinVaListKind getBuiltinVaListKind() const override {
5249 return TargetInfo::SystemZBuiltinVaList;
5250 }
5251 bool setCPU(const std::string &Name) override {
5252 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5253 .Case("z10", true)
5254 .Case("z196", true)
5255 .Case("zEC12", true)
5256 .Default(false);
5257
5258 // No need to store the CPU yet. There aren't any CPU-specific
5259 // macros to define.
5260 return CPUKnown;
5261 }
5262};
5263
5264const char *const SystemZTargetInfo::GCCRegNames[] = {
5265 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5266 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5267 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5268 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5269};
5270
5271void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5272 unsigned &NumNames) const {
5273 Names = GCCRegNames;
5274 NumNames = llvm::array_lengthof(GCCRegNames);
5275}
5276
5277bool SystemZTargetInfo::
5278validateAsmConstraint(const char *&Name,
5279 TargetInfo::ConstraintInfo &Info) const {
5280 switch (*Name) {
5281 default:
5282 return false;
5283
5284 case 'a': // Address register
5285 case 'd': // Data register (equivalent to 'r')
5286 case 'f': // Floating-point register
5287 Info.setAllowsRegister();
5288 return true;
5289
5290 case 'I': // Unsigned 8-bit constant
5291 case 'J': // Unsigned 12-bit constant
5292 case 'K': // Signed 16-bit constant
5293 case 'L': // Signed 20-bit displacement (on all targets we support)
5294 case 'M': // 0x7fffffff
5295 return true;
5296
5297 case 'Q': // Memory with base and unsigned 12-bit displacement
5298 case 'R': // Likewise, plus an index
5299 case 'S': // Memory with base and signed 20-bit displacement
5300 case 'T': // Likewise, plus an index
5301 Info.setAllowsMemory();
5302 return true;
5303 }
5304}
Ulrich Weigand47445072013-05-06 16:26:41 +00005305}
5306
5307namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005308 class MSP430TargetInfo : public TargetInfo {
5309 static const char * const GCCRegNames[];
5310 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005311 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005312 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005313 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005314 IntWidth = 16; IntAlign = 16;
5315 LongWidth = 32; LongLongWidth = 64;
5316 LongAlign = LongLongAlign = 16;
5317 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005318 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005319 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005320 IntMaxType = SignedLongLong;
5321 UIntMaxType = UnsignedLongLong;
5322 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005323 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005324 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005325 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005326 }
5327 void getTargetDefines(const LangOptions &Opts,
5328 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005329 Builder.defineMacro("MSP430");
5330 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005331 // FIXME: defines for different 'flavours' of MCU
5332 }
Craig Topper3164f332014-03-11 03:39:26 +00005333 void getTargetBuiltins(const Builtin::Info *&Records,
5334 unsigned &NumRecords) const override {
5335 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005336 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005337 NumRecords = 0;
5338 }
Craig Topper3164f332014-03-11 03:39:26 +00005339 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005340 return Feature == "msp430";
5341 }
Craig Topper3164f332014-03-11 03:39:26 +00005342 void getGCCRegNames(const char * const *&Names,
5343 unsigned &NumNames) const override;
5344 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5345 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005346 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005347 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005348 NumAliases = 0;
5349 }
Craig Topper3164f332014-03-11 03:39:26 +00005350 bool validateAsmConstraint(const char *&Name,
5351 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005352 // No target constraints for now.
5353 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005354 }
Craig Topper3164f332014-03-11 03:39:26 +00005355 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005356 // FIXME: Is this really right?
5357 return "";
5358 }
Craig Topper3164f332014-03-11 03:39:26 +00005359 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005360 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005361 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005362 }
5363 };
5364
5365 const char * const MSP430TargetInfo::GCCRegNames[] = {
5366 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5367 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5368 };
5369
5370 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5371 unsigned &NumNames) const {
5372 Names = GCCRegNames;
5373 NumNames = llvm::array_lengthof(GCCRegNames);
5374 }
5375}
5376
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005377namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005378
Mike Stump11289f42009-09-09 15:08:12 +00005379 // LLVM and Clang cannot be used directly to output native binaries for
5380 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005381 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005382 //
5383 // TCE uses the llvm bitcode as input and uses it for generating customized
5384 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005385 // publicly available in http://tce.cs.tut.fi
5386
Eli Friedman1f191002011-10-07 19:51:42 +00005387 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5388 3, // opencl_global
5389 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005390 5, // opencl_constant
5391 0, // cuda_device
5392 0, // cuda_constant
5393 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005394 };
5395
Eli Friedmana9c3d712009-08-19 20:47:07 +00005396 class TCETargetInfo : public TargetInfo{
5397 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005398 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005399 TLSSupported = false;
5400 IntWidth = 32;
5401 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005402 PointerWidth = 32;
5403 IntAlign = 32;
5404 LongAlign = LongLongAlign = 32;
5405 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005406 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005407 SizeType = UnsignedInt;
5408 IntMaxType = SignedLong;
5409 UIntMaxType = UnsignedLong;
5410 IntPtrType = SignedInt;
5411 PtrDiffType = SignedInt;
5412 FloatWidth = 32;
5413 FloatAlign = 32;
5414 DoubleWidth = 32;
5415 DoubleAlign = 32;
5416 LongDoubleWidth = 32;
5417 LongDoubleAlign = 32;
5418 FloatFormat = &llvm::APFloat::IEEEsingle;
5419 DoubleFormat = &llvm::APFloat::IEEEsingle;
5420 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005421 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5422 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005423 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005424 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005425 }
5426
Craig Topper3164f332014-03-11 03:39:26 +00005427 void getTargetDefines(const LangOptions &Opts,
5428 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005429 DefineStd(Builder, "tce", Opts);
5430 Builder.defineMacro("__TCE__");
5431 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005432 }
Craig Topper3164f332014-03-11 03:39:26 +00005433 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005434 return Feature == "tce";
5435 }
Craig Topper3164f332014-03-11 03:39:26 +00005436
5437 void getTargetBuiltins(const Builtin::Info *&Records,
5438 unsigned &NumRecords) const override {}
5439 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005440 return "";
5441 }
Craig Topper3164f332014-03-11 03:39:26 +00005442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005443 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005444 }
Craig Topper3164f332014-03-11 03:39:26 +00005445 void getGCCRegNames(const char * const *&Names,
5446 unsigned &NumNames) const override {}
5447 bool validateAsmConstraint(const char *&Name,
5448 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005449 return true;
5450 }
Craig Topper3164f332014-03-11 03:39:26 +00005451 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5452 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005453 };
5454}
5455
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005456namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005457class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005458 virtual void setDescriptionString() = 0;
5459
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005460 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005461 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005462 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005463 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005464 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005465 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005466 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005467 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005468 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005469 enum DspRevEnum {
5470 NoDSP, DSP1, DSP2
5471 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005472 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005473
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005474protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005475 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005476 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005477
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005478public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005479 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5480 const std::string &CPUStr)
5481 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005482 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005483 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005484
Craig Topper3164f332014-03-11 03:39:26 +00005485 const char *getABI() const override { return ABI.c_str(); }
5486 bool setABI(const std::string &Name) override = 0;
5487 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00005488 CPU = Name;
5489 return true;
5490 }
Craig Topper3164f332014-03-11 03:39:26 +00005491 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005492 // The backend enables certain ABI's by default according to the
5493 // architecture.
5494 // Disable both possible defaults so that we don't end up with multiple
5495 // ABI's selected and trigger an assertion.
5496 Features["o32"] = false;
5497 Features["n64"] = false;
5498
Eric Christopher0b26a612010-03-02 02:41:08 +00005499 Features[ABI] = true;
5500 Features[CPU] = true;
5501 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005502
Craig Topper3164f332014-03-11 03:39:26 +00005503 void getTargetDefines(const LangOptions &Opts,
5504 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005505 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005506 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005507 if (Opts.GNUMode)
5508 Builder.defineMacro("mips");
5509
Simon Atanasyan683535b2012-08-29 19:14:58 +00005510 Builder.defineMacro("__REGISTER_PREFIX__", "");
5511
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005512 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005513 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005514 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005515 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005516 case SoftFloat:
5517 Builder.defineMacro("__mips_soft_float", Twine(1));
5518 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005519 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005520
Simon Atanasyan16071912013-04-14 14:07:30 +00005521 if (IsSingleFloat)
5522 Builder.defineMacro("__mips_single_float", Twine(1));
5523
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005524 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5525 Builder.defineMacro("_MIPS_FPSET",
5526 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5527
Simon Atanasyan72244b62012-07-05 16:06:06 +00005528 if (IsMips16)
5529 Builder.defineMacro("__mips16", Twine(1));
5530
Simon Atanasyan60777612013-04-14 14:07:51 +00005531 if (IsMicromips)
5532 Builder.defineMacro("__mips_micromips", Twine(1));
5533
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005534 if (IsNan2008)
5535 Builder.defineMacro("__mips_nan2008", Twine(1));
5536
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005537 switch (DspRev) {
5538 default:
5539 break;
5540 case DSP1:
5541 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5542 Builder.defineMacro("__mips_dsp", Twine(1));
5543 break;
5544 case DSP2:
5545 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5546 Builder.defineMacro("__mips_dspr2", Twine(1));
5547 Builder.defineMacro("__mips_dsp", Twine(1));
5548 break;
5549 }
5550
Jack Carter44ff1e52013-08-12 17:20:29 +00005551 if (HasMSA)
5552 Builder.defineMacro("__mips_msa", Twine(1));
5553
Simon Atanasyan26f19672012-04-05 19:28:31 +00005554 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5555 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5556 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005557
5558 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5559 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005560 }
5561
Craig Topper3164f332014-03-11 03:39:26 +00005562 void getTargetBuiltins(const Builtin::Info *&Records,
5563 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005564 Records = BuiltinInfo;
5565 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005566 }
Craig Topper3164f332014-03-11 03:39:26 +00005567 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005568 return llvm::StringSwitch<bool>(Feature)
5569 .Case("mips", true)
5570 .Case("fp64", HasFP64)
5571 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005572 }
Craig Topper3164f332014-03-11 03:39:26 +00005573 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005574 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005575 }
Craig Topper3164f332014-03-11 03:39:26 +00005576 void getGCCRegNames(const char * const *&Names,
5577 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005578 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005579 // CPU register names
5580 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005581 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5582 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5583 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005584 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5585 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005586 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5587 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5588 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5589 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005590 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005591 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005592 "$fcc5","$fcc6","$fcc7",
5593 // MSA register names
5594 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5595 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5596 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5597 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5598 // MSA control register names
5599 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5600 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005601 };
5602 Names = GCCRegNames;
5603 NumNames = llvm::array_lengthof(GCCRegNames);
5604 }
Craig Topper3164f332014-03-11 03:39:26 +00005605 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5606 unsigned &NumAliases) const override = 0;
5607 bool validateAsmConstraint(const char *&Name,
5608 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005609 switch (*Name) {
5610 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005611 return false;
5612
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005613 case 'r': // CPU registers.
5614 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5615 case 'y': // Equivalent to "r", backwards compatibility only.
5616 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005617 case 'c': // $25 for indirect jumps
5618 case 'l': // lo register
5619 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005620 Info.setAllowsRegister();
5621 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005622 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005623 Info.setAllowsMemory();
5624 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005625 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005626 }
5627
Craig Topper3164f332014-03-11 03:39:26 +00005628 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005629 // FIXME: Implement!
5630 return "";
5631 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005632
Craig Topper3164f332014-03-11 03:39:26 +00005633 bool handleTargetFeatures(std::vector<std::string> &Features,
5634 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005635 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005636 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005637 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005638 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005639 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005640 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005641 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005642
5643 for (std::vector<std::string>::iterator it = Features.begin(),
5644 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005645 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005646 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005647 else if (*it == "+soft-float")
5648 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005649 else if (*it == "+mips16")
5650 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005651 else if (*it == "+micromips")
5652 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005653 else if (*it == "+dsp")
5654 DspRev = std::max(DspRev, DSP1);
5655 else if (*it == "+dspr2")
5656 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005657 else if (*it == "+msa")
5658 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005659 else if (*it == "+fp64")
5660 HasFP64 = true;
5661 else if (*it == "-fp64")
5662 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005663 else if (*it == "+nan2008")
5664 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005665 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005666
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005667 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005668 std::vector<std::string>::iterator it =
5669 std::find(Features.begin(), Features.end(), "+soft-float");
5670 if (it != Features.end())
5671 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005672
Akira Hatanaka9064e362013-10-29 18:30:33 +00005673 setDescriptionString();
5674
Rafael Espindolaeb265472013-08-21 21:59:03 +00005675 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005676 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005677
Craig Topper3164f332014-03-11 03:39:26 +00005678 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005679 if (RegNo == 0) return 4;
5680 if (RegNo == 1) return 5;
5681 return -1;
5682 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005683};
5684
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005685const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5686#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5687#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5688 ALL_LANGUAGES },
5689#include "clang/Basic/BuiltinsMips.def"
5690};
5691
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005692class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005693public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005694 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005695 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005696 SizeType = UnsignedInt;
5697 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005699 }
Craig Topper3164f332014-03-11 03:39:26 +00005700 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005701 if ((Name == "o32") || (Name == "eabi")) {
5702 ABI = Name;
5703 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005704 } else if (Name == "32") {
5705 ABI = "o32";
5706 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005707 } else
5708 return false;
5709 }
Craig Topper3164f332014-03-11 03:39:26 +00005710 void getTargetDefines(const LangOptions &Opts,
5711 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005712 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005713
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005714 Builder.defineMacro("__mips", "32");
5715
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005716 if (ABI == "o32") {
5717 Builder.defineMacro("__mips_o32");
5718 Builder.defineMacro("_ABIO32", "1");
5719 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5720 }
5721 else if (ABI == "eabi")
5722 Builder.defineMacro("__mips_eabi");
5723 else
David Blaikie83d382b2011-09-23 05:06:16 +00005724 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005725 }
Craig Topper3164f332014-03-11 03:39:26 +00005726 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5727 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005728 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5729 { { "at" }, "$1" },
5730 { { "v0" }, "$2" },
5731 { { "v1" }, "$3" },
5732 { { "a0" }, "$4" },
5733 { { "a1" }, "$5" },
5734 { { "a2" }, "$6" },
5735 { { "a3" }, "$7" },
5736 { { "t0" }, "$8" },
5737 { { "t1" }, "$9" },
5738 { { "t2" }, "$10" },
5739 { { "t3" }, "$11" },
5740 { { "t4" }, "$12" },
5741 { { "t5" }, "$13" },
5742 { { "t6" }, "$14" },
5743 { { "t7" }, "$15" },
5744 { { "s0" }, "$16" },
5745 { { "s1" }, "$17" },
5746 { { "s2" }, "$18" },
5747 { { "s3" }, "$19" },
5748 { { "s4" }, "$20" },
5749 { { "s5" }, "$21" },
5750 { { "s6" }, "$22" },
5751 { { "s7" }, "$23" },
5752 { { "t8" }, "$24" },
5753 { { "t9" }, "$25" },
5754 { { "k0" }, "$26" },
5755 { { "k1" }, "$27" },
5756 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005757 { { "sp","$sp" }, "$29" },
5758 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005759 { { "ra" }, "$31" }
5760 };
5761 Aliases = GCCRegAliases;
5762 NumAliases = llvm::array_lengthof(GCCRegAliases);
5763 }
5764};
5765
5766class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005767 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005768 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005769 }
5770
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005771public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005772 Mips32EBTargetInfo(const llvm::Triple &Triple)
5773 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005774 }
Craig Topper3164f332014-03-11 03:39:26 +00005775 void getTargetDefines(const LangOptions &Opts,
5776 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005777 DefineStd(Builder, "MIPSEB", Opts);
5778 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005779 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005780 }
5781};
5782
5783class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005784 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005785 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005786 }
5787
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005788public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 Mips32ELTargetInfo(const llvm::Triple &Triple)
5790 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005791 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005792 }
Craig Topper3164f332014-03-11 03:39:26 +00005793 void getTargetDefines(const LangOptions &Opts,
5794 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005795 DefineStd(Builder, "MIPSEL", Opts);
5796 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005797 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005798 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005799};
Akira Hatanakabef17452011-09-20 19:21:49 +00005800
5801class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005802public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005804 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005805 LongDoubleWidth = LongDoubleAlign = 128;
5806 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005807 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5808 LongDoubleWidth = LongDoubleAlign = 64;
5809 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5810 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005811 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005812 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005813 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005814 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005815
5816 void setN64ABITypes() {
5817 LongWidth = LongAlign = 64;
5818 PointerWidth = PointerAlign = 64;
5819 SizeType = UnsignedLong;
5820 PtrDiffType = SignedLong;
5821 }
5822
5823 void setN32ABITypes() {
5824 LongWidth = LongAlign = 32;
5825 PointerWidth = PointerAlign = 32;
5826 SizeType = UnsignedInt;
5827 PtrDiffType = SignedInt;
5828 }
5829
Craig Topper3164f332014-03-11 03:39:26 +00005830 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005831 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005832 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005833 ABI = Name;
5834 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005835 } else if (Name == "n64" || Name == "64") {
5836 setN64ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005837 ABI = "n64";
5838 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005839 }
5840 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005841 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005842
Craig Topper3164f332014-03-11 03:39:26 +00005843 void getTargetDefines(const LangOptions &Opts,
5844 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005845 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005846
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005847 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005848 Builder.defineMacro("__mips64");
5849 Builder.defineMacro("__mips64__");
5850
Akira Hatanakabef17452011-09-20 19:21:49 +00005851 if (ABI == "n32") {
5852 Builder.defineMacro("__mips_n32");
5853 Builder.defineMacro("_ABIN32", "2");
5854 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5855 }
5856 else if (ABI == "n64") {
5857 Builder.defineMacro("__mips_n64");
5858 Builder.defineMacro("_ABI64", "3");
5859 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5860 }
5861 else
David Blaikie83d382b2011-09-23 05:06:16 +00005862 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005863 }
Craig Topper3164f332014-03-11 03:39:26 +00005864 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5865 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005866 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5867 { { "at" }, "$1" },
5868 { { "v0" }, "$2" },
5869 { { "v1" }, "$3" },
5870 { { "a0" }, "$4" },
5871 { { "a1" }, "$5" },
5872 { { "a2" }, "$6" },
5873 { { "a3" }, "$7" },
5874 { { "a4" }, "$8" },
5875 { { "a5" }, "$9" },
5876 { { "a6" }, "$10" },
5877 { { "a7" }, "$11" },
5878 { { "t0" }, "$12" },
5879 { { "t1" }, "$13" },
5880 { { "t2" }, "$14" },
5881 { { "t3" }, "$15" },
5882 { { "s0" }, "$16" },
5883 { { "s1" }, "$17" },
5884 { { "s2" }, "$18" },
5885 { { "s3" }, "$19" },
5886 { { "s4" }, "$20" },
5887 { { "s5" }, "$21" },
5888 { { "s6" }, "$22" },
5889 { { "s7" }, "$23" },
5890 { { "t8" }, "$24" },
5891 { { "t9" }, "$25" },
5892 { { "k0" }, "$26" },
5893 { { "k1" }, "$27" },
5894 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005895 { { "sp","$sp" }, "$29" },
5896 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005897 { { "ra" }, "$31" }
5898 };
5899 Aliases = GCCRegAliases;
5900 NumAliases = llvm::array_lengthof(GCCRegAliases);
5901 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005902
5903 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005904};
5905
5906class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005907 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005908 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005909 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 +00005910 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005911 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005912
Akira Hatanakabef17452011-09-20 19:21:49 +00005913 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005914
Akira Hatanakabef17452011-09-20 19:21:49 +00005915public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005916 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005917 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005918 void getTargetDefines(const LangOptions &Opts,
5919 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005920 DefineStd(Builder, "MIPSEB", Opts);
5921 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005922 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005923 }
5924};
5925
5926class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005927 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005928 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005929 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 +00005930 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005931 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005932 }
5933public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005934 Mips64ELTargetInfo(const llvm::Triple &Triple)
5935 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005936 // Default ABI is n64.
5937 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005938 }
Craig Topper3164f332014-03-11 03:39:26 +00005939 void getTargetDefines(const LangOptions &Opts,
5940 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005941 DefineStd(Builder, "MIPSEL", Opts);
5942 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005943 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005944 }
5945};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005946} // end anonymous namespace.
5947
Ivan Krasindd7403e2011-08-24 20:22:22 +00005948namespace {
5949class PNaClTargetInfo : public TargetInfo {
5950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005951 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005952 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005953 this->UserLabelPrefix = "";
5954 this->LongAlign = 32;
5955 this->LongWidth = 32;
5956 this->PointerAlign = 32;
5957 this->PointerWidth = 32;
5958 this->IntMaxType = TargetInfo::SignedLongLong;
5959 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5960 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005961 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005962 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005963 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005964 this->SizeType = TargetInfo::UnsignedInt;
5965 this->PtrDiffType = TargetInfo::SignedInt;
5966 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005967 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005968 }
5969
Craig Topper3164f332014-03-11 03:39:26 +00005970 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005971 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005972 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005973 Builder.defineMacro("__le32__");
5974 Builder.defineMacro("__pnacl__");
5975 }
Craig Topper3164f332014-03-11 03:39:26 +00005976 void getTargetDefines(const LangOptions &Opts,
5977 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005978 getArchDefines(Opts, Builder);
5979 }
Craig Topper3164f332014-03-11 03:39:26 +00005980 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005981 return Feature == "pnacl";
5982 }
Craig Topper3164f332014-03-11 03:39:26 +00005983 void getTargetBuiltins(const Builtin::Info *&Records,
5984 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005985 }
Craig Topper3164f332014-03-11 03:39:26 +00005986 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005987 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005988 }
Craig Topper3164f332014-03-11 03:39:26 +00005989 void getGCCRegNames(const char * const *&Names,
5990 unsigned &NumNames) const override;
5991 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5992 unsigned &NumAliases) const override;
5993 bool validateAsmConstraint(const char *&Name,
5994 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005995 return false;
5996 }
5997
Craig Topper3164f332014-03-11 03:39:26 +00005998 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005999 return "";
6000 }
6001};
6002
6003void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6004 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006005 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006006 NumNames = 0;
6007}
6008
6009void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6010 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006011 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006012 NumAliases = 0;
6013}
6014} // end anonymous namespace.
6015
Guy Benyeib798fc92012-12-11 21:38:14 +00006016namespace {
6017 static const unsigned SPIRAddrSpaceMap[] = {
6018 1, // opencl_global
6019 3, // opencl_local
6020 2, // opencl_constant
6021 0, // cuda_device
6022 0, // cuda_constant
6023 0 // cuda_shared
6024 };
6025 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006026 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006027 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006028 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6029 "SPIR target must use unknown OS");
6030 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6031 "SPIR target must use unknown environment type");
6032 BigEndian = false;
6033 TLSSupported = false;
6034 LongWidth = LongAlign = 64;
6035 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006036 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006037 // Define available target features
6038 // These must be defined in sorted order!
6039 NoAsmVariants = true;
6040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 void getTargetDefines(const LangOptions &Opts,
6042 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006043 DefineStd(Builder, "SPIR", Opts);
6044 }
Craig Topper3164f332014-03-11 03:39:26 +00006045 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006046 return Feature == "spir";
6047 }
Craig Topper3164f332014-03-11 03:39:26 +00006048
6049 void getTargetBuiltins(const Builtin::Info *&Records,
6050 unsigned &NumRecords) const override {}
6051 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006052 return "";
6053 }
Craig Topper3164f332014-03-11 03:39:26 +00006054 void getGCCRegNames(const char * const *&Names,
6055 unsigned &NumNames) const override {}
6056 bool validateAsmConstraint(const char *&Name,
6057 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006058 return true;
6059 }
Craig Topper3164f332014-03-11 03:39:26 +00006060 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6061 unsigned &NumAliases) const override {}
6062 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006063 return TargetInfo::VoidPtrBuiltinVaList;
6064 }
6065 };
6066
6067
6068 class SPIR32TargetInfo : public SPIRTargetInfo {
6069 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006070 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006071 PointerWidth = PointerAlign = 32;
6072 SizeType = TargetInfo::UnsignedInt;
6073 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6074 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006075 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6076 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006077 }
Craig Topper3164f332014-03-11 03:39:26 +00006078 void getTargetDefines(const LangOptions &Opts,
6079 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006080 DefineStd(Builder, "SPIR32", Opts);
6081 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006082 };
6083
6084 class SPIR64TargetInfo : public SPIRTargetInfo {
6085 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006086 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006087 PointerWidth = PointerAlign = 64;
6088 SizeType = TargetInfo::UnsignedLong;
6089 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006090 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6091 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006092 }
Craig Topper3164f332014-03-11 03:39:26 +00006093 void getTargetDefines(const LangOptions &Opts,
6094 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006095 DefineStd(Builder, "SPIR64", Opts);
6096 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006097 };
6098}
6099
Robert Lytton0e076492013-08-13 09:43:10 +00006100namespace {
6101class XCoreTargetInfo : public TargetInfo {
6102 static const Builtin::Info BuiltinInfo[];
6103public:
6104 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6105 BigEndian = false;
6106 NoAsmVariants = true;
6107 LongLongAlign = 32;
6108 SuitableAlign = 32;
6109 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006110 SizeType = UnsignedInt;
6111 PtrDiffType = SignedInt;
6112 IntPtrType = SignedInt;
6113 WCharType = UnsignedChar;
6114 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006115 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006116 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 +00006117 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006118 }
Craig Topper3164f332014-03-11 03:39:26 +00006119 void getTargetDefines(const LangOptions &Opts,
6120 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006121 Builder.defineMacro("__XS1B__");
6122 }
Craig Topper3164f332014-03-11 03:39:26 +00006123 void getTargetBuiltins(const Builtin::Info *&Records,
6124 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006125 Records = BuiltinInfo;
6126 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6127 }
Craig Topper3164f332014-03-11 03:39:26 +00006128 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006129 return TargetInfo::VoidPtrBuiltinVaList;
6130 }
Craig Topper3164f332014-03-11 03:39:26 +00006131 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006132 return "";
6133 }
Craig Topper3164f332014-03-11 03:39:26 +00006134 void getGCCRegNames(const char * const *&Names,
6135 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006136 static const char * const GCCRegNames[] = {
6137 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6138 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6139 };
6140 Names = GCCRegNames;
6141 NumNames = llvm::array_lengthof(GCCRegNames);
6142 }
Craig Topper3164f332014-03-11 03:39:26 +00006143 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6144 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006145 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006146 NumAliases = 0;
6147 }
Craig Topper3164f332014-03-11 03:39:26 +00006148 bool validateAsmConstraint(const char *&Name,
6149 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006150 return false;
6151 }
Craig Topper3164f332014-03-11 03:39:26 +00006152 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006153 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6154 return (RegNo < 2)? RegNo : -1;
6155 }
Robert Lytton0e076492013-08-13 09:43:10 +00006156};
6157
6158const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6159#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6160#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6161 ALL_LANGUAGES },
6162#include "clang/Basic/BuiltinsXCore.def"
6163};
6164} // end anonymous namespace.
6165
Ivan Krasindd7403e2011-08-24 20:22:22 +00006166
Chris Lattner5ba61f02006-10-14 07:39:34 +00006167//===----------------------------------------------------------------------===//
6168// Driver code
6169//===----------------------------------------------------------------------===//
6170
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006171static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006172 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006173
Daniel Dunbar52322032009-08-18 05:47:58 +00006174 switch (Triple.getArch()) {
6175 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006176 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006177
Tim Northovera2ee4332014-03-29 15:09:45 +00006178 case llvm::Triple::arm64:
6179 if (Triple.isOSDarwin())
6180 return new DarwinARM64TargetInfo(Triple);
6181
6182 switch (os) {
6183 case llvm::Triple::Linux:
James Molloy5e73df52014-04-16 15:06:20 +00006184 return new LinuxTargetInfo<ARM64leTargetInfo>(Triple);
6185 case llvm::Triple::NetBSD:
6186 return new NetBSDTargetInfo<ARM64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006187 default:
James Molloy5e73df52014-04-16 15:06:20 +00006188 return new ARM64leTargetInfo(Triple);
6189 }
6190
6191 case llvm::Triple::arm64_be:
6192 switch (os) {
6193 case llvm::Triple::Linux:
6194 return new LinuxTargetInfo<ARM64beTargetInfo>(Triple);
6195 case llvm::Triple::NetBSD:
6196 return new NetBSDTargetInfo<ARM64beTargetInfo>(Triple);
6197 default:
6198 return new ARM64beTargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006199 }
6200
Robert Lytton0e076492013-08-13 09:43:10 +00006201 case llvm::Triple::xcore:
6202 return new XCoreTargetInfo(Triple);
6203
Tony Linthicum76329bf2011-12-12 21:14:55 +00006204 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006205 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006206
Tim Northover9bb857a2013-01-31 12:13:10 +00006207 case llvm::Triple::aarch64:
6208 switch (os) {
6209 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006210 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00006211 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006212 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006213 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006214 return new AArch64leTargetInfo(Triple);
6215 }
6216
6217 case llvm::Triple::aarch64_be:
6218 switch (os) {
6219 case llvm::Triple::Linux:
6220 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6221 case llvm::Triple::NetBSD:
6222 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6223 default:
6224 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006225 }
6226
Daniel Dunbar52322032009-08-18 05:47:58 +00006227 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006228 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006229 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006230 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006231
Daniel Dunbar52322032009-08-18 05:47:58 +00006232 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006233 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006234 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006235 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006236 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006237 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006238 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006239 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006240 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006241 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006242 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006243 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006244 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006245 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006246 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006247 case llvm::Triple::Win32:
6248 switch (Triple.getEnvironment()) {
6249 default:
6250 return new ARMleTargetInfo(Triple);
6251 case llvm::Triple::Itanium:
6252 return new ItaniumWindowsARMleTargetInfo(Triple);
6253 case llvm::Triple::MSVC:
6254 return new MicrosoftARMleTargetInfo(Triple);
6255 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006256 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006257 return new ARMleTargetInfo(Triple);
6258 }
6259
6260 case llvm::Triple::armeb:
6261 case llvm::Triple::thumbeb:
6262 if (Triple.isOSDarwin())
6263 return new DarwinARMTargetInfo(Triple);
6264
6265 switch (os) {
6266 case llvm::Triple::Linux:
6267 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6268 case llvm::Triple::FreeBSD:
6269 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6270 case llvm::Triple::NetBSD:
6271 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6272 case llvm::Triple::OpenBSD:
6273 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6274 case llvm::Triple::Bitrig:
6275 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6276 case llvm::Triple::RTEMS:
6277 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6278 case llvm::Triple::NaCl:
6279 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6280 default:
6281 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006282 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006283
Daniel Dunbar52322032009-08-18 05:47:58 +00006284 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006285 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006286
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006287 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006288 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006289 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006291 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006293 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006295 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006296 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006297 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006298 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006299 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006300
6301 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006302 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006303 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006304 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006305 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006306 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006307 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006308 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006309 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006310 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006311 case llvm::Triple::NaCl:
6312 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006313 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006314 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006315 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006316
Akira Hatanakabef17452011-09-20 19:21:49 +00006317 case llvm::Triple::mips64:
6318 switch (os) {
6319 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006320 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006321 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006322 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006323 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006324 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006325 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006327 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006328 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006329 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006331 }
6332
6333 case llvm::Triple::mips64el:
6334 switch (os) {
6335 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006336 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006337 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006339 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006341 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006343 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006345 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006346 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006347 }
6348
Ivan Krasindd7403e2011-08-24 20:22:22 +00006349 case llvm::Triple::le32:
6350 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006351 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006352 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006353 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006354 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006355 }
6356
Daniel Dunbar52322032009-08-18 05:47:58 +00006357 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006358 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006359 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006360 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006361 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006363 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006364 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006365 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006367 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006369 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006370 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006371 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006373 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006374
6375 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006376 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006377 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006378 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006379 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006380 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006381 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006383 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006385 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006387 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006389 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006390
Bill Schmidt778d3872013-07-26 01:36:11 +00006391 case llvm::Triple::ppc64le:
6392 switch (os) {
6393 case llvm::Triple::Linux:
6394 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6395 default:
6396 return new PPC64TargetInfo(Triple);
6397 }
6398
Peter Collingbournec947aae2012-05-20 23:28:41 +00006399 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006400 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006401 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006402 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006403
Eli Friedmand13b41e2012-10-12 23:32:00 +00006404 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006405 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006406
Daniel Dunbar52322032009-08-18 05:47:58 +00006407 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006408 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006409 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006410 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006411 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006412 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006413 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006415 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006417 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006419 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006420 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006421 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006422 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006423 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006424
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006425 case llvm::Triple::sparcv9:
6426 switch (os) {
6427 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006428 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006429 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006430 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006431 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006433 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006434 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006435 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006436 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006437 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006438 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006439 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006441 }
6442
Ulrich Weigand47445072013-05-06 16:26:41 +00006443 case llvm::Triple::systemz:
6444 switch (os) {
6445 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006446 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006447 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006448 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006449 }
6450
Eli Friedmana9c3d712009-08-19 20:47:07 +00006451 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006452 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006453
Daniel Dunbar52322032009-08-18 05:47:58 +00006454 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006455 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006456 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006457
Daniel Dunbar52322032009-08-18 05:47:58 +00006458 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006459 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006461 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006462 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006463 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006465 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006467 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006468 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006469 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006470 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006471 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006472 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006473 case llvm::Triple::KFreeBSD:
6474 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006475 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006476 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006477 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006478 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006479 case llvm::Triple::Win32: {
6480 switch (Triple.getEnvironment()) {
6481 default:
6482 return new X86_32TargetInfo(Triple);
6483 case llvm::Triple::Cygnus:
6484 return new CygwinX86_32TargetInfo(Triple);
6485 case llvm::Triple::GNU:
6486 return new MinGWX86_32TargetInfo(Triple);
6487 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006488 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006489 }
6490 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006491 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006492 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006493 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006494 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006495 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006496 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006497 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006498 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006499 }
6500
6501 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006502 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006503 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006504
Daniel Dunbar52322032009-08-18 05:47:58 +00006505 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006506 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006508 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006510 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006511 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006512 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006513 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006514 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006515 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006516 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006517 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006518 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006519 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006520 case llvm::Triple::KFreeBSD:
6521 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006522 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006523 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006524 case llvm::Triple::Win32: {
6525 switch (Triple.getEnvironment()) {
6526 default:
6527 return new X86_64TargetInfo(Triple);
6528 case llvm::Triple::GNU:
6529 return new MinGWX86_64TargetInfo(Triple);
6530 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006531 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006532 }
6533 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006534 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006535 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006536 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006537 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006538 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006539
6540 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006541 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006542 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006543 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006545 }
6546 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006547 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006548 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006549 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006551 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006552 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006553}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006554
6555/// CreateTargetInfo - Return the target info object for the specified target
6556/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00006557TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00006558 TargetOptions *Opts) {
6559 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006560
6561 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006562 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006563 if (!Target) {
6564 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006565 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006566 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00006567 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006568
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006569 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006570 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6571 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006572 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006573 }
6574
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006575 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006576 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6577 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006578 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006579 }
6580
Rafael Espindolaeb265472013-08-21 21:59:03 +00006581 // Set the fp math unit.
6582 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6583 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006584 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006585 }
6586
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006587 // Compute the default target features, we need the target to handle this
6588 // because features may have dependencies on one another.
6589 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006590 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006591
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006592 // Apply the user specified deltas.
6593 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6594 I < N; ++I) {
6595 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006596 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006597 bool Enabled = Name[0] == '+';
6598 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006599 }
6600
6601 // Add the features to the compile options.
6602 //
6603 // FIXME: If we are completely confident that we have the right set, we only
6604 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006605 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006606 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6607 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006608 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006609 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006610 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006611
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006612 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006613}